【機械学習・スタッキング】Introduction to Ensembling/Stacking in Pyth 8c06ceカーネルで出現するエラーを回避するには

Kaggleでスコアを上げるために、スタッキングを勉強しようと思い立ちました。

幸い、スタッキングについてはTitanicコンペのカーネルで丁寧に説明されているものがあり、それを解読することにします。

ところが、、、ちょこちょこエラーが発生し、コード通りでは動きません。

幸い自分がちょっと調べたらわかるくらいの範囲のエラーでしたので、修正できました。

修正箇所と内容をメモしておこうと思います。(KFoldの使い方が古いようです)

同じようにこのカーネルで勉強しようと思っている方の助けになれば幸いです。

 

対象のカーネルはこちらです↓

https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python

 

修正箇所

修正するのは3か所です。

修正その1

まずはしょっぱなのライブラリのインポートで発生します。

”No module named ‘sklearn.cross_validation”

とのことですので、こうKFoldのライブラリのインポートの仕方が異なるようです

 

(Before)

from sklearn.cross_validation import KFold

(After)

from sklearn.model_selection import KFold

 

修正その2

お次はこちら

Helperクラスの宣言の箇所です、

6行目の kf=KFold( ~

の箇所で、n_foldsが指定されていますが、そんな引数は想定されていなかったよう。

KFoldの引数は、分割数を示すn_splitsと、シャッフル、シードの3つだった記憶ですので、そのように変更するとエラーが消えます。

(Before)

kf = KFold(ntrain, n_folds=NFOLDS, random_state=SEED)

(After)

kf = KFold(n_splits=NFOLDS, random_state=SEED)

 

※やっぱり正しいようです。(下記リンクはsklearnのHP)

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html

 

修正その3

こちらはget_oof関数を実行時に、get_oof関数内のKFoldがうまくできなかったみたいです。

ですので、get_oof関数内のコードを修正します。

ちょっとさかのぼって、以下のキャプチャのところを見てください。

修正箇所は6行目です。またもやKFoldの使い方の問題ですね。

(Before)

for i, (train_index, test_index) in enumerate(kf):

(After)

for i, (train_index, test_index) in enumerate(kf.split(x_train,y_train):

 

 

※ここを修正して、その前に一度実行した箇所をもう一度実行していくと、

こんなふうに”Survived”でキーエラーが出てきますが、これは無視して大丈夫です。

一度trainから”Survived”カラムをドロップして、もう一度trainから”Survived”カラムをドロップする、という操作になってしまいます。

当然2回目はドロップした後なので、Survivedはtrain内にありませんよね。

本来2回実行する予定ではないところを2回実行したために出たエラーなので、無視でOKです。

 

おわり

というわけで、エラーはみんなKFold関連のものでした。

このカーネルめちゃくちゃ勉強になるので、もしエラー出るからいいや、、と敬遠していた方いたらぜひ取り組んでみてください!

 

最後まで読んでいただきありがとうございました。