Kaggle Prudential 自戦記
Kaggle Prudentialに参加していました。
順位はpublic 60th, private 30th/2715 でした。
かなり学びはあったので、それをまとめる意味でも書いておこうと思います。
概要
- 保険申込者のレコードに対応する反応変数を推定する。反応変数は1-8。
- ほとんどの項目名はわからないようになっている。(Product_Info, Insured_Infoなど大まかなくくりはわかる)
- データはきれいで、ほとんどfeature engineeringする余地がなさそうに見える。
評価基準はquadratic weighted kappa。
これが曲者で、kappa用にクラス区切りのoptimizeをしないと勝負にならない。基本的なアプローチは反応変数を数値としてregressionをした後、optimizeしてクラス区切りを求めるという方法。- 素のxgboost -> 0.63くらい
- クラスの区切りを改善 -> 0.665(btbは最終的には0.674まで行った)
- トップのスコア -> 0.682
といった感じのpublic LBで、運ゲーの香りが漂っており、実際かなりのshake upとなった。
特徴量作成
- 結構いろんな方法を試したが、xgboostには効果は無かった。(さすがにlinear regressionに利くものはあった)
例)- BMIはWt/Ht2だが、Wt/Ht3などを作ってみる(WeightやHeightが変換されているので、推定して戻す必要がある)
- t-sneで次元圧縮
- Product_Info4 < 0.075のときは分類が特殊なので、それを特徴量にする
- dummy変数やnullの個数のcount
- 作成したfeatureの管理が結構時間をとられるところです。試行錯誤の末に、以下のような管理方法にしています。
- 作ったfeatureはレコード数*要素数のnp.arrayとして表現
- 前処理(OneHotEncodeとか)を柔軟に適用するために、
モデルに投入するfeaturesの組を(タグ、featureのリスト、前処理手法のリスト)のリストで表現 - もうちょっとシンプルで良い方法がありそう
パラメータ調整
- パラメータ調整も結構時間のとられるところ。hyperoptを多用した。
- hyperoptもやりすぎるとtrain dataにoverfitしてしまいそう。
- 最終的には、別のfoldを作って、hyperoptはそちらのfoldで行うような方法にした。
- このコンペだと、public LBの件数が少ないため、public LBでoverfitしているか判定するという方法は使えない。
- もう少し頑張れば、ChenglongChen師匠のようにhyperoptしてそのままモデルをランすることができそう。
- パラメータはhyperopt・grid search・決め打ちの3種類を使い分けることになりそう。
- 猛者は一発で良いパラメータを選べるらしいですが。
http://blog.kaggle.com/2016/02/10/profiling-top-kagglers-kazanova-new-1-in-the-world/
- 猛者は一発で良いパラメータを選べるらしいですが。
モデル・アンサンブル
- 最終的には5foldで3層Stackingとなった。
- インターフェース, feature, parameterが定まっていれば、モデル作成はただの作業。
逆にいうと、インターフェースを整えたり、特徴量を管理したり、パラメータ調整したりというのが大変だった。
- 層を重ねるのはそれなりに効果があった。
- 3層構成にすると、2層目でoriginal feature有/無のstackingを試せたり、多少柔軟にできるように思う。
- 他にもいろいろな方法があると思います。StackNetとかいう方法があるらしいですがどうやるんでしょう。
http://blog.kaggle.com/2015/12/03/dato-winners-interview-1st-place-mad-professors/