KaggleのAllstate Claims Severityというコンペに参加したのでメモ

今年の10月10日から12月12日にかけてKaggleで開催されたAllstate Claims Severityというコンペに参加した.

www.kaggle.com 各保険請求に関する特徴量として114個のカテゴリ変数と16個の連続変数が与えられるので,それを元に保険請求の金額を予測する.訓練データ188318件の各特徴量と請求額から学習モデルを構築し,テストデータの125546件に対して請求額の予測を行う.予測した請求額と実際の請求額の差の平均が最も小さい参加者が優勝.

このコンペで使用されるデータはzip圧縮を行っていない状態でも合計で100MBを大きく超えないので,同時に開催されていた他のコンペと比べるとかなり参加するハードルが低いように感じた.結果としてはpublic Leaderboard(LB)で134位でprivate LBで86位となり,参加者3055名中のTop-5%以内に食い込むことができたので銀メダルを取ることができた.

自分がやったこと

学習モデル

実行環境としてはGCPのn1-highcpu-16を使用.(vCPU x 16、メモリ 14.4 GB) コードはMacで書いてrsync仮想マシンに送っていた.

最終的にはまず以下のようなモデルを作成した..

  • Keras (3つ)
    1. https://www.kaggle.com/mtinti/allstate-claims-severity/keras-starter-with-bagging-1111-84364 そのままのやつ
    2. 上記のもののlossの変換をlog(x + 200)から(x + 1) ** 0.25に変更したもの.時間をケチったのでバギングする個数を10個から3個に減らしてしまっている.
    3. 2.で各層のニューロンを少しずつ増やした.この3つのモデルの単独でのスコアはほとんど変わらなかった気がする.記憶が怪しい.
  • XGB (3つ)
    1. どこかのフォーラムで公開されていたのをそのまま利用した.今回は特徴量の作成とモデルの学習は分けているのでそのまま利用したと言っても特徴量に若干の差異があるかもしれない.単独でPublic LB = 1112くらいだったと思う.Early stoppingをしても40000本以上くらいの木を作成しようとしてモデルをシリアライズしたらMemory Errorで落ちた.結局木の本数を30000本に制限して動かした.
    2. https://www.kaggle.com/mariusbo/allstate-claims-severity/xgb-lb-1106-33084/code 違うフォーラムのやつ. こいつもPublic LB = 1107くらい.データの前処理に若干違いがあるみたいでForumでのスコアよりも少し悪くなっている.
    3. 2.のやつで重要度が高い特徴量同士の相互作用に関する特徴量を入れた.単独でのスコアは上昇しなかったがアンサンブル学習のときに効果があった.
  • LightGBM (2つ)
    1. XGBの2つめと同様の入力に対してLightGBMを走らせたんだったと思う.ちょっと違うかもしれない.
    2. 上記のモデル + fair_obj. fair_objは今回のコンペで重要な役割を果たしたxgbでの勾配の計算に使用される関数. LightGBMでは簡単に追加することができないのでLightGBMのC++コードをいじった.期待に反して微粒子レベルの効果しかなかった.

これらのモデルの出力を元にstackingした.今回stackingに用いた学習器はSGDRegressor(loss='huber', penalty='elasticnet') なのでweighted averagingと変わらないかもしれない.この学習器のlossとかpenaltyとかはhyperoptを使って正則化の強さと一緒に決定した..まともにパラメタチューニングをしたのはここだけ.ニューラルネットを用いようともしたが結局うまくいかなかった.

最終スコア

  • Public 1101.62827
  • Private 1113.23506

優勝者のスコア

  • Public 1097.67455
  • Private 1109.70772

銀メダルボーダー

  • Private 1114.10023

差が大きい・・・

特徴量の分析はできなかった

各特徴量の名前は隠されているので(cat13とかcont12みたいな感じで与えられる)各特徴量がどういう意味を持っているかを調べることは難しかった.結局Forumを眺めて得られる以上の解析はできなかった. Forumでのdiscussionの多くは連続特徴量をどのように変換すると学習器が高いパフォーマンスを発揮できるかなどが主に議論されていた.

上位勢がやっていたこと

とにかくたくさんモデルを作成してstackingをしている.

自分がまだ触れたことのないモデルとしては

  • Regularized Greedy Forest
  • Vowpal Wabbit
  • LibFM
  • LibFFM
  • ExtraTrees(sklearn)
  • glmnet (R)

などがある.

他の工夫としてはlossの値が大きい部分と小さい部分に対してそれぞれモデルを構築したり,Nelder-Meadソルバーを用いて誤差の平均が最小になるように重み付き平均の重みを調整したりしていたようだ.

感想

  • データサイエンスのコンペではない気がする.何を競っていたのだろうか?
  • 結局自分ではろくに特徴量エンジニアリングもパラメータチューニングもしていない・・・どれだけモデルをたくさん立ててもアンサンブルしても単一で強いモデルがないとスコアは良くならないようなので次から頑張ろう. 今振り返ってみると幾つかのXGB, LightGBMに関してはパラメタチューニングすることも可能だった.
  • 今回はチームを組むのは禁止されていましたが他の多くのコンペではそうではないので,そういったコンペを一人で戦うのはより大変そう.例えば今回のコンペで上位だった何人かの投稿を合わせると簡単に一位を超えるスコアが出るみたい.Does it blend? - Allstate Claims Severity | Kaggle
  • Easy way to get score 1105.05 on Leaderboard - Allstate Claims Severity | Kaggleというトピックが出ていて,NNとxgbの公開されているモデルの平均をとるだけで最終のPublic LBでTop-15%以内のスコアをとることができる.案外勝とうとして参加している人は少ないんだろうか?
  • 文章を書くのは疲れる