今年の1月からKaggleに参加し始めたのですが、中々スコアが出ないので色々Kernelから勉強しようと思い、学んだ手法をまとめていこうと思います。
第1弾はこちらをベースにしようと思います。
KaggleのKernel上で作業して、全体に公開します。Kernelはこちら
今回のKernelの概要
スタッキングをTitanicデータセットを使って学びます。
スタッキングとは、あるモデルのoutputを別のモデルのinputとする手法のことです。
今回は、異なる6つのモデルで予測を行い、各モデルのfeature_importancesをinputとしてさらに別のモデルで予測を行います。
コード全体はKernelに書くとして、ここでは気づきだけをピックアップして書きたいと思います。
Feature Engineering
・NaNはfloat型なので、floatかどうかを見ればダミー変数化できる。
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
・NaNはfloat型なので、floatかどうかを見ればダミー変数化できる。
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
Ensembling & Stacking models
・クラスとしてSklearnHelperを定義、sklearnのメソッドを使えるようにする
class SklearnHelper(object):
(以下省略)
・あるモデルのoutputを次のモデルのinputとするための関数の定義
def get_oof(clf, x_train, y_train, x_test):
(省略)
#KFoldでval_indexは最終的に全行を網羅するので全てのoof_trainに数値が入る
oof_train[val_index] = clf.predict(x_va)
#KFoldのiteration毎に予測値を格納し、その平均を取る
oof_test_skf[i, :] = clf.predict(x_test)
oof_test[:] = oof_test_skf.mean(axis=0)
#スタッキング用の訓練データ、テストデータを出力
return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)
#スタッキングした訓練データを作成
x_train = np.concatenate(( et_oof_train, rf_oof_train, ada_oof_train, gb_oof_train, svc_oof_train, lgb_oof_train), axis=1)
#スタッキングしたテストデータを作成
x_test = np.concatenate(( et_oof_test, rf_oof_test, ada_oof_test, gb_oof_test, svc_oof_test, lgb_oof_test), axis=1)
後はこれをXGBoostに突っ込んで予測をしている。
ただ、cross validationなどしておらず、いい結果は出なかった。
まとめ
・とりあえずいろんなモデルで予測をして、その予測結果をinputとして別のモデルで予測すればStackingになる。
・訓練セットにOverfittingする気がするので、その辺りきちんと知っておきたい。
・クラスを上手く活用出来るようになりたい。
・ヒートマップとペアプロットの見方をもっと勉強したい。イマイチこの活用方法がわからん。。。
・あんまりうまく解説できずすみません、コメントでご指摘頂けると記事に反映します。