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となった。

  • 文献も漁ったが、残念ながらアクチュアリーのdomain knowledgeの出番は無かった。
  • linearでもわりと良い値が出るので、非線形の関係性はそこまで無さそうな感じ。

特徴量作成

  • 結構いろんな方法を試したが、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してそのままモデルをランすることができそう。

モデル・アンサンブル

  • 最終的には5foldで3層Stackingとなった。

    • 1層目

      • xgb, nn(keras, keras graph), ert, linear(vw), svmでregression
      • xgbでclassification
      • xgb, nn, ertでbinary classify(2以下のクラスか否か、6以上のクラスか否か)
    • 2層目

      • xgb(feature有/無), xgb classify(feature有/無) , ert, linear
    • 3層目

      • xgb, xgb classify, linear
    • 3層目をさらにlinearしたものが最終出力

  • インターフェース, feature, parameterが定まっていれば、モデル作成はただの作業。
    逆にいうと、インターフェースを整えたり、特徴量を管理したり、パラメータ調整したりというのが大変だった。

  • 層を重ねるのはそれなりに効果があった。
  • 3層構成にすると、2層目でoriginal feature有/無のstackingを試せたり、多少柔軟にできるように思う。
  • 他にもいろいろな方法があると思います。StackNetとかいう方法があるらしいですがどうやるんでしょう。
    http://blog.kaggle.com/2015/12/03/dato-winners-interview-1st-place-mad-professors/

AWS課金

  • c4.2xlarge(1時間0.5$)をメインに運用。xgboostが早すぎてノートPCには戻れ無さそう。。
  • インスタンスを起動しているとやらなきゃいけない気になるので、そんなメリットもある。
  • 後半は少しスポットインスタンスを活用。
    起動➡rsyncでコード送付➡s3 syncで必要なデータを取得➡ラン➡s3 syncでデータを保存➡shut down という流れを構築できればスポットインスタンスメインで開発ができそう。
    東京リージョンだとc4.2xlargeがたまに高騰するので、バージニア北部に移住予定。