質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1941閲覧

[kaggle x Titanic]うっすらピンクの背景でDataConversionWarning

Yukiya025

総合スコア86

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/12 10:42

編集2018/09/17 07:44

開発環境

  • Python3.6.5
  • Jupyter notebook
  • Windows7

困っていること

kaggleのTitanic課題kernelを写経して提出までこぎつけました。が、警告をガン無視して進めたので今から警告に対する対処をしようとしています。
写経対象: A Data Science Framework: To Achieve 99% Accuracy

一次元配列なのに列ベクトルyを渡されて困るから変えろ?

該当コード

python

1#Machine Learning Algorithm (MLA) Selection and Initialization 2MLA = [ 3 ensemble.AdaBoostClassifier(), 4 ensemble.BaggingClassifier(), 5 ensemble.ExtraTreesClassifier(), 6 ensemble.GradientBoostingClassifier(), 7 ensemble.RandomForestClassifier(), 8 9 gaussian_process.GaussianProcessClassifier(), 10 11 linear_model.LogisticRegressionCV(), 12 linear_model.PassiveAggressiveClassifier(), 13 linear_model.RidgeClassifierCV(), 14 linear_model.SGDClassifier(), 15 linear_model.Perceptron(), 16 17 naive_bayes.BernoulliNB(), 18 naive_bayes.GaussianNB(), 19 20 neighbors.KNeighborsClassifier(), 21 22 svm.SVC(probability=True), 23 svm.NuSVC(probability=True), 24 svm.LinearSVC(), 25 26 tree.DecisionTreeClassifier(), 27 tree.ExtraTreeClassifier(), 28 29 discriminant_analysis.LinearDiscriminantAnalysis(), 30 discriminant_analysis.QuadraticDiscriminantAnalysis(), 31 32 XGBClassifier() 33] 34 35cv_split = model_selection.ShuffleSplit(n_splits = 10, test_size = .3, train_size = .6, random_state = 0) 36 37MLA_columns = ['MLA Name', 'MLA Parameters', 'MLA Train Accuracy Mean', 'MLA Test Accuracy Mean', 'MLA Test Accuracy 3*STD', 'MLA Time'] 38MLA_compare = pd.DataFrame(columns = MLA_columns) 39 40MLA_predict = data1[Target] 41 42row_index = 0 43for alg in MLA: 44 MLA_name = alg.__class__.__name__ 45 MLA_compare.loc[row_index, 'MLA Name'] = MLA_name 46 MLA_compare.loc[row_index, 'MLA Parameters'] = str(alg.get_params()) 47 48 cv_results = model_selection.cross_validate(alg, data1[data1_x_bin], data1[Target], cv = cv_split) 49 50 MLA_compare.loc[row_index, 'MLA Time'] = cv_results['fit_time'].mean() 51 MLA_compare.loc[row_index, 'MLA Train Accuracy Mean'] = cv_results['train_score'].mean() 52 MLA_compare.loc[row_index, 'MLA Test Accuracy Mean'] = cv_results['test_score'].mean() 53 54 MLA_compare.loc[row_index, 'MLA Test Accuracy 3*STD'] = cv_results['test_score'].std()*3 55 56 alg.fit(data1[data1_x_bin], data1[Target]) 57 MLA_predict[MLA_name] = alg.predict(data1[data1_x_bin]) 58 59 row_index += 1 60 61 62MLA_compare.sort_values(by = ['MLA Test Accuracy Mean'], ascending = False, inplace = True) 63MLA_compare

警告文
同じ内容の文が重複して出てくるので一部だけですが、このような警告文が延々と出てきます。values.ravel()をつければよいとの対処法?は見つけましたが、どれにつけたらよいかが分からない状態ですorz お知恵をお貸しください(>_<)

C:\Users\ayumusato\Anaconda3\lib\site-packages\sklearn\utils\validation.py:578: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). y = column_or_1d(y, warn=True) C:\Users\ayumusato\Anaconda3\lib\site-packages\sklearn\model_selection\_validation.py:458: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel(). estimator.fit(X_train, y_train, **fit_params) C:\Users\ayumusato\Anaconda3\lib\site-packages\ipykernel_launcher.py:56: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().

Target = ['Survived'] としているコード周辺

python

1label = LabelEncoder() 2for dataset in data_cleaner: 3 dataset['Sex_Code'] = label.fit_transform(dataset['Sex']) 4 dataset['Embarked_Code'] = label.fit_transform(dataset['Embarked']) 5 dataset['Title_Code'] = label.fit_transform(dataset['Title']) 6 dataset['AgeBin_Code'] = label.fit_transform(dataset['AgeBin']) 7 dataset['FareBin_Code'] = label.fit_transform(dataset['FareBin']) 8 9Target = ['Survived'] #←ここ 10 11data1_x = ['Sex', 'Pclass', 'Embarked', 'Title', 'SibSp', 'Parch', 'Age', 'Fare', 'FamilySize', 'IsAlone'] 12data1_x_calc = ['Sex_Code', 'Pclass', 'Embarked_Code', 'Title_Code', 'SibSp', 'Parch', 'Age', 'Fare'] 13data1_xy = Target + data1_x #←ここ 14print('Original X Y: ', data1_xy, '\n') 15 16data1_x_bin = ['Sex_Code', 'Pclass', 'Embarked_Code', 'Title_Code', 'FamilySize', 'AgeBin_Code', 'FareBin_Code'] 17data1_xy_bin = Target + data1_x_bin 18print('Bin X Y: ', data1_xy_bin, '\n') 19 20data1_dummy = pd.get_dummies(data1[data1_x]) 21data1_x_dummy = data1_dummy.columns.tolist() 22data1_xy_dummy = Target + data1_x_dummy 23print('Dummy X Y: ', data1_xy_dummy, '\n') 24 25data1_dummy.head()

list、データフレーム、numpy配列などの使い分け

**Pythonの組込関数であるリスト([オブジェクト1, オブジェクト2, ...])**は、要素としてあらゆるオブジェクトを持つことが可能。
→複数のオブジェクトをまとめて管理。
参考サイト: リストオブジェクト -PythonWeb

Pandasのデータを格納するオブジェクトDataFrameは、二次元配列に相当する。Seriesをラベリングしてディクショナリのように寄せ集めるとDataFrameになる。行と列のある表みたいな感じ。
DataFrameオブジェクトのdata部分を指定するには、NumPyの配列・Seriesを含む辞書などが使える。データ部分の指定方法は多岐にわたる。
ちなみに一次元配列はSeries。
参考サイト:Pandasのデータを格納するオブジェクトDataFrameを理解する -DeepAge

**NumPy配列 (N-dimensional array/ndarray) **は同じ型&サイズの項目で構成する固定長の多次元コンテナ。
参考サイト: The N-dimensional array (ndarray)

listとnumpy配列の違い

この質問&回答を参照。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

A column-vector y was passedということなので怪しいのはdata1[Target]でしょうか。

  • Targetの中身は何ですか
  • print(data1[Target].shape)はどうなりますか

以上2点確認してください。

投稿2018/09/12 10:55

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yukiya025

2018/09/13 09:27

> Targetの中身は何ですか Target = ['Survived'] です。Survived変数が1であれば生存、0であれば死亡です。 > print(data1[Target].shape) (891, 1) 891はタイタニック号にいた人数です。
Yukiya025

2018/09/13 09:30

hayataka2049様、ありがとうございます(*≧∀≦)
hayataka2049

2018/09/13 10:25

なぜ['Survived']に? Target = 'Survived'でいいと思いますが
Yukiya025

2018/09/13 12:23

data1_xy = Target + data1_x のときにTypeError: must be str, not listとなるため、Target = ['Survived']という書き方をしています。質問文最後にTarget = ['Survived'] としているコード周辺を追記したのでご覧くださいm(_)m
hayataka2049

2018/09/13 12:29

事情はわかりました 解決方法としては、 data1['Survived']とする Targetを使いたければdata1[Target[0]]とする あるいはnumpy配列にしてdata[Targret].values.ravel()という手もあります pandasのDataFrameやSeriesをsklearnのモデルに入れると、たまにトラブったような気がするので、個人的にはすべてnumpy配列にして取り扱うことにしていますが。割と好みの問題なのでどう書いても構わないです
Yukiya025

2018/09/13 14:39

ありがとうございます(*≧∀≦) data1[Target].values.ravel()を採用し、警告は消えました! しかし今度はMLA_predict[MLA_name] = alg.predict(data1[data1_x_bin])でエラーが出ています。 IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices 有効なインデックスでない、ということなので調べて.astype(int)を置けそうなところに置いたり MLA_predict[MLA_name] = alg.predict(data1[data1_x_bin].astype(int)) MLA_predict[MLA_name] = alg.predict(data1[data1_x_bin]).astype(int) int()で数字にしてみたり MLA_predict[MLA_name] = alg.predict(data1[int(data1_x_bin)]) MLA_predict[MLA_name] = alg.predict(int(data1[data1_x_bin])) してみましたが、すべて違うようです(T_T) どうしたらよいでしょうかorz
hayataka2049

2018/09/13 14:52

MLA_predict = data1[Target]より上の行でdata1[Target].values.ravel()としましたか。 MLA_nameはstrであり、MLA_predictはDataFrameなのでstrのインデックスが使えますが、Numpy配列にしちゃったら無理です。 書き換えたところを一回もとに戻して、 cv_results = model_selection.cross_validate(alg, data1[data1_x_bin],data1[Target], cv = cv_split) alg.fit(data1[data1_x_bin], data1[Target]) の2行だけ変えましょう。 cv_results = model_selection.cross_validate(alg, data1[data1_x_bin], data1[Target].values.ravel(), cv = cv_split) alg.fit(data1[data1_x_bin], data1[Target].values.ravel()) あるいは、冗長だと思うのなら、 y = data1[Target].values.ravel() cv_results = model_selection.cross_validate(alg, data1[data1_x_bin], y, cv = cv_split) alg.fit(data1[data1_x_bin], y)
Yukiya025

2018/09/14 01:50

ありがとうございます(≧▽≦) しかし今パソコン (2011年製の富士通LIFEBOOK)の挙動が非常に遅くなっているのに音を上げました。゚(゚´Д`゚)゚。 hdd->ssdに換装しようとしているのでそれが終わったらやります。。。 今はリカバリディスク作成中です^^; (↑買ったときに作ってなかったorz)
Yukiya025

2018/09/17 02:17

hayataka2049さま、お久しぶりです^^/ ありがとうございます(*≧∀≦) できましたー! > MLA_nameはstrであり、MLA_predictはDataFrameなのでstrのインデックスが使えますが、Numpy配列にしちゃったら無理です。 .values.ravel()をつけると文字列型から配列型になるからダメ、配列型にして問題ないところのみ.values.ravel()が使えるということですか∑o(*'o'*)o このセル以外にもうっすらピンクで同じようなDataConversionWarningがでてるので、そこも修正してみようと思います! パソコンも20時間超の健闘の末、SSDに換装することができました<3 さくさく動くようになって快適です!
hayataka2049

2018/09/17 05:18

list、データフレーム、numpy配列などの使い分けを意識するといいのかもしれませんね。なんとなく同じ感覚で使えてしまいますが、本来はまったくの別物なので
Yukiya025

2018/09/17 07:43

> list、データフレーム、numpy配列などの使い分けを意識するといい ありがとうございます(*≧∀≦) 質問の最後にlist、データフレーム、numpy配列について調べて理解したことを簡潔にまとめてみました! listとnumpy配列の違いがわからなかったのですが、こちらの質問&回答(https://teratail.com/questions/73677)でうっすらわかった気がします。 さあそれでどう使い分けるかとまではまだ理解していませんが、写経したものがきれいになったらこの3つは違うのだということを頭に入れて、見直そうと思いました! ヾ(*≧∀≦)ノ゙
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問