LoginSignup
2
2

More than 5 years have passed since last update.

Kaggleカーネルの勉強 第1弾(スタッキング)

Last updated at Posted at 2019-03-08

今年の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する気がするので、その辺りきちんと知っておきたい。
・クラスを上手く活用出来るようになりたい。
・ヒートマップとペアプロットの見方をもっと勉強したい。イマイチこの活用方法がわからん。。。
・あんまりうまく解説できずすみません、コメントでご指摘頂けると記事に反映します。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2