kysmo’s blog

株式会社キスモの技術ブログです。

世界一のデータサイエンティストを目指して 〜Kaggle参加レポート〜

みなさんこんにちは。 株式会社キスモ役員の大越です。

みなさんKaggleはご存知ですか? Googleが運営する世界最大のデータサイエンスコンテストサイトで、ユーザー数は2017年6月に全世界で100万人を超えました。 賞金総額1億円を超えるようなコンテストも開かれ、名だたるデータサイエンティストが日々しのぎを削っています。

自分は今回、そんなKaggleで開かれた Porto Seguro’s Safe Driver Predictionというコンテストに参加したので、それをレポートにしたいと思います。(ちなみにまだ終わってないので、もう少しスコア更新目指します。) 構成はKaggleではおなじみ、ランカーインタビューに沿った形式にしてみました!

f:id:kodamayu:20171107115355p:plain

Porto Seguro’s Safe Driver Prediction(Kaggle): https://www.kaggle.com/c/porto-seguro-safe-driver-prediction

◆コンテスト概要

テーマ:車の保険料を正しく見積もるために、翌年にドライバーが自動車保険を請求する確率を推定する。 評価指標:ジニ係数 データ:要素に関する詳細な説明はなかったが、関連する特徴量は名前から判断できるようになっている。

◆Basic

参加前の経歴

名古屋大学情報文化学部4年でコンピューターサイエンスを選考しており、高校時代から統計学やデータサイエンスの研究をしていました。

コンテストに役立つような知識、経験はありますか?

これまでNRIさんのマーケティングコンテストや、Deep Analyticsのコンテストなどにも参加したことがあり、そこで得た経験は活きました。

Kaggleを始めたきっかけは?

これまではプロ野球のドラフト予測や評価指標作成など、野球を題材に自分で分析のテーマを決めて行うことが多かったですが、そこで勉強したことをもう少し実践的に試したいと感じて参加しました! Kaggleは世界規模の大会で、Discussionや情報公開にも積極的で、とても勉強になります。

どのようなきっかけでこのコンテストに参加しましたか?

なにかしらKaggleのコンテストに参加したいと感じていましたが、データサイズ的に参加できないものも多かったです。そんな中でデータサイズが少なく、参加者が多い本コンテストは、自分が参加するにはぴったりだと感じ、参加を決意しました。

◆Let's Get Technical

どのようなアーキテクチャを作成しましたか?

本コンテストは様々な特徴量を用いて、次の年に保険料を請求するか否か、その確率を試算するものでした。他の多くの参加者同様、自分はこの問題に対してアンサンブルの様々な手法を試し、それらをstackすることにしました。 以下が作成したアーキテクチャです。 f:id:kodamayu:20171107115442p:plain

  1. まず、特徴量を2種類作成しました。特徴量1は与えられたデータをそのまま用いて、特徴量2はbinary特徴量以外の各特徴量において平均、中央値と比較した時に値が大きいか小さいかという情報と欠損値の個数を加え、いくつかの特徴量はone hotに変換しました。
  2. 次にモデルの検討を行い、xgboost、LBG、GBDT、catboostを使用、5つにデータを分けて交差検証を行ないジニ係数を用いて評価することに決めました。
  3. 次に各モデルについてパラメーター調整を行いました。パラメーターは公開されているkernelから大体の値を検討し、その周辺をグリッドサーチして決めました。
  4. それらをロジスティック回帰でstackしました。その結果catboostを使用した場合、精度が下がったため、catboostは最終的なアーキテクチャから除きました。

どのような前処理とエンジニアリングを行いましたか?

初めは与えられたデータのみで一通りパラメーターチューニングをして、stackingモデルで0.284というスコアを出しました。 その後、新しい特徴量として基本統計量である平均や中央値と比較して、値が大きいか小さいかという情報を追加して、それもstackingモデルに加えたところ、0.285までスコアが上がりました!

どのようなモデルを作成しましたか?

xgboost、LBG、GBDTというアンサンブルの代表的なモデルを595212個のトレーニング用データを5つに分けてstackしました。 パラメーターはグリッドサーチでそれぞれ最適化を行い、最終的な出力はロジスティック回帰の確率としています。

評価指標で工夫した点はありますか?

ジニ係数で評価されるため、グリッドサーチの際はジニ係数の関数を作成し、そのバリデーションスコアを元に評価を行いました。また、catboostのlossはジニ係数がないため、代わりにLoglossを使用することで対応しました。Loglossについては、ジニ係数の関数を作成していない他の参加者も誤差関数として使用していました。

データに関する考察で重要なことはありますか?

f:id:kodamayu:20171107115539p:plain まずターゲットの値について見た所、大きな偏りがあることがわかりました。そのため、アーキテクチャの設計の際に、単純なaccuracyで評価せずに、ジニ係数を用いるようにしました。

f:id:kodamayu:20171107115516p:plain また、決定木の構造を可視化したものを確認したところ閾値を設定することに効果がありそうだと感じたため、特徴量整形の際に平均、中央値を閾値に設定したフラグを追加しました。

どんなツールを使いましたか?

python3.6と各種アンサンブルのモジュール、sklearnを主に使用しました。

◆Words of wisdom

協議会を通して、何を得ましたか?

今回の協議会で実践して効果を発揮したのが、stackingモデルと平均、中央値を用いた特徴整形でした。これらにより、一時は90位(上位4%)にも入ることができました。 また、自分が参加しながら他の参加者のkernelを見ることで、データに対する見方やコードの書き方まで細かい部分で気づくことがあり、それが今後の業務にも活かせると感じています。

終わりに

一時90位だった順位はあっという間に下がり、現在は3925人中244位(上位7%)です。 もう少し、工夫の余地がありそうなのでそれを実装して残り2週間でさらなる順位アップを狙いつつ、他のコンテストにも参戦し始めたのでそこでも上位を狙っていきたいと思います! Kaggleでの経験を実際の業務にも活かしていきたいですね! みなさんも勉強も兼ねてKaggleを始めてみてはいかがでしょう?

xgboostについて参考にどうぞ

XGBoostの公式githubです。

github.com