開発環境
- Python3.6.5
- Jupyter notebook
- Windows7
困っていること
kaggleのTitanic課題kernelを写経して提出までこぎつけました。が、警告をガン無視して進めたので今から警告に対する対処をしようとしています。
写経対象: A Data Science Framework: To Achieve 99% Accuracy
一次元配列なのに列ベクトルyを渡されて困るから変えろ?
該当コード
#Machine Learning Algorithm (MLA) Selection and Initialization
MLA = [
ensemble.AdaBoostClassifier(),
ensemble.BaggingClassifier(),
ensemble.ExtraTreesClassifier(),
ensemble.GradientBoostingClassifier(),
ensemble.RandomForestClassifier(),
gaussian_process.GaussianProcessClassifier(),
linear_model.LogisticRegressionCV(),
linear_model.PassiveAggressiveClassifier(),
linear_model.RidgeClassifierCV(),
linear_model.SGDClassifier(),
linear_model.Perceptron(),
naive_bayes.BernoulliNB(),
naive_bayes.GaussianNB(),
neighbors.KNeighborsClassifier(),
svm.SVC(probability=True),
svm.NuSVC(probability=True),
svm.LinearSVC(),
tree.DecisionTreeClassifier(),
tree.ExtraTreeClassifier(),
discriminant_analysis.LinearDiscriminantAnalysis(),
discriminant_analysis.QuadraticDiscriminantAnalysis(),
XGBClassifier()
]
cv_split = model_selection.ShuffleSplit(n_splits = 10, test_size = .3, train_size = .6, random_state = 0)
MLA_columns = ['MLA Name', 'MLA Parameters', 'MLA Train Accuracy Mean', 'MLA Test Accuracy Mean', 'MLA Test Accuracy 3*STD', 'MLA Time']
MLA_compare = pd.DataFrame(columns = MLA_columns)
MLA_predict = data1[Target]
row_index = 0
for alg in MLA:
MLA_name = alg.__class__.__name__
MLA_compare.loc[row_index, 'MLA Name'] = MLA_name
MLA_compare.loc[row_index, 'MLA Parameters'] = str(alg.get_params())
cv_results = model_selection.cross_validate(alg, data1[data1_x_bin], data1[Target], cv = cv_split)
MLA_compare.loc[row_index, 'MLA Time'] = cv_results['fit_time'].mean()
MLA_compare.loc[row_index, 'MLA Train Accuracy Mean'] = cv_results['train_score'].mean()
MLA_compare.loc[row_index, 'MLA Test Accuracy Mean'] = cv_results['test_score'].mean()
MLA_compare.loc[row_index, 'MLA Test Accuracy 3*STD'] = cv_results['test_score'].std()*3
alg.fit(data1[data1_x_bin], data1[Target])
MLA_predict[MLA_name] = alg.predict(data1[data1_x_bin])
row_index += 1
MLA_compare.sort_values(by = ['MLA Test Accuracy Mean'], ascending = False, inplace = True)
MLA_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'] としているコード周辺
label = LabelEncoder()
for dataset in data_cleaner:
dataset['Sex_Code'] = label.fit_transform(dataset['Sex'])
dataset['Embarked_Code'] = label.fit_transform(dataset['Embarked'])
dataset['Title_Code'] = label.fit_transform(dataset['Title'])
dataset['AgeBin_Code'] = label.fit_transform(dataset['AgeBin'])
dataset['FareBin_Code'] = label.fit_transform(dataset['FareBin'])
Target = ['Survived'] #←ここ
data1_x = ['Sex', 'Pclass', 'Embarked', 'Title', 'SibSp', 'Parch', 'Age', 'Fare', 'FamilySize', 'IsAlone']
data1_x_calc = ['Sex_Code', 'Pclass', 'Embarked_Code', 'Title_Code', 'SibSp', 'Parch', 'Age', 'Fare']
data1_xy = Target + data1_x #←ここ
print('Original X Y: ', data1_xy, '\n')
data1_x_bin = ['Sex_Code', 'Pclass', 'Embarked_Code', 'Title_Code', 'FamilySize', 'AgeBin_Code', 'FareBin_Code']
data1_xy_bin = Target + data1_x_bin
print('Bin X Y: ', data1_xy_bin, '\n')
data1_dummy = pd.get_dummies(data1[data1_x])
data1_x_dummy = data1_dummy.columns.tolist()
data1_xy_dummy = Target + data1_x_dummy
print('Dummy X Y: ', data1_xy_dummy, '\n')
data1_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配列の違い
この質問&回答を参照。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
A column-vector y was passed
ということなので怪しいのはdata1[Target]
でしょうか。
Target
の中身は何ですかprint(data1[Target].shape)
はどうなりますか
以上2点確認してください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/09/13 18:27
Target = ['Survived'] です。Survived変数が1であれば生存、0であれば死亡です。
> print(data1[Target].shape)
(891, 1)
891はタイタニック号にいた人数です。
2018/09/13 18:30
2018/09/13 19:25
2018/09/13 21:23
2018/09/13 21:29
解決方法としては、
data1['Survived']とする
Targetを使いたければdata1[Target[0]]とする
あるいはnumpy配列にしてdata[Targret].values.ravel()という手もあります
pandasのDataFrameやSeriesをsklearnのモデルに入れると、たまにトラブったような気がするので、個人的にはすべてnumpy配列にして取り扱うことにしていますが。割と好みの問題なのでどう書いても構わないです
2018/09/13 23:39
しかし今度は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
2018/09/13 23:52
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)
2018/09/14 10:50
しかし今パソコン (2011年製の富士通LIFEBOOK)の挙動が非常に遅くなっているのに音を上げました。゚(゚´Д`゚)゚。
hdd->ssdに換装しようとしているのでそれが終わったらやります。。。
今はリカバリディスク作成中です^^;
(↑買ったときに作ってなかったorz)
2018/09/17 11:17
ありがとうございます(*≧∀≦) できましたー!
> MLA_nameはstrであり、MLA_predictはDataFrameなのでstrのインデックスが使えますが、Numpy配列にしちゃったら無理です。
.values.ravel()をつけると文字列型から配列型になるからダメ、配列型にして問題ないところのみ.values.ravel()が使えるということですか∑o(*'o'*)o
このセル以外にもうっすらピンクで同じようなDataConversionWarningがでてるので、そこも修正してみようと思います!
パソコンも20時間超の健闘の末、SSDに換装することができました<3 さくさく動くようになって快適です!
2018/09/17 14:18
2018/09/17 16:43
ありがとうございます(*≧∀≦) 質問の最後にlist、データフレーム、numpy配列について調べて理解したことを簡潔にまとめてみました! listとnumpy配列の違いがわからなかったのですが、こちらの質問&回答(https://teratail.com/questions/73677)でうっすらわかった気がします。
さあそれでどう使い分けるかとまではまだ理解していませんが、写経したものがきれいになったらこの3つは違うのだということを頭に入れて、見直そうと思いました! ヾ(*≧∀≦)ノ゙