■ [部活]Kaggle - making data science a sport -
これは Competitive Programming Advent Calendar Div2012 21日目の記事です。
機械学習・データマイニングのコンテストを開催しているKaggleについて紹介します。
概要
Kaggleは、あちこちの企業・団体とコラボして、実世界のデータに基づいた機械学習・データマイニング系のコンテストを開催しています。
TopCoderのMarathonMatchでもここ1,2年くらいそのようなコンテストが増えていますが、それを専門に行っているクラウドソーシングプラットフォーマーがKaggleです。
(MarathoMatchについては、Machine Learning Advent Calendarでのnico_shindanninさんの記事で紹介されているのでそちらも参考にしてください)
過去のものも含めたコンテストの一覧です。
http://www.kaggle.com/competitions
TopCoderのこの手のコンテストではだいたい賞金総額1万ドルですが、10万ドルとかもっと賞金額が高いものもたまにあります。
特徴
TopCoder Marathonと比べて異なる点を中心に、Kaggleのコンテストの特徴を挙げていきます。
実行環境・解答の提出
プログラムを提出するのではなく、訓練データとテストデータ(主にはCSV)をダウンロードしておき、テストデータに対してローカルで何か処理して得た予測結果を提出します。
提出するフォーマットもCSVの場合が多いようです。
なので、言語やツールは何でも好きなものを使えます。
ただし、上位に入って賞金をもらうためには、使用したコードをOSS(具体的なライセンスはコンテストごとに指定される)として公開する必要があります。
また、コードだけではなく、使用した手法を解説したドキュメントも必須です。
コンテストの結果ページ(例:http://www.kaggle.com/c/asap-sas/details/preliminary-winners)でそれらのリソースが公開されているので、上位者のやったことを読んで学習に使えます。
順位表には、コンテスト開催中はテストデータの1/4くらいについての結果が表示されています(Public Leaderboard)。
コンテスト期間が終了すると、残りの3/4くらいの結果を元に最終順位が決まります(Private Leaderboard、システムテストに相当)。
(なんか画像をオリジナルサイズで表示できないので詳しく見たい方はクリックして開いてください)
過学習のせいで激しく順位が入れ替わることもしばしばあるみたいです。
例えば、つい先週まで開催されていたダークマターを探せという怪しげなコンテストでは、
事前順位表で20位だった人が最終的には1位になっており、逆に事前順位表で2位だった人が39位まで落ちています。
提出回数には、"1日2回以内"などのように制限があります。
協力
大体のコンテストでは、数人でチームを組んで参加できます。途中でチームを合併することも(人数制限が許せば)可能なことが多いみたいです。
また、Kaggle内のフォーラムで、問題の内容について公開で議論することも歓迎されています。
スポンサーにとっては最終的にコンテストから得られる結果が良いものになったほうがうれしいわけですからね。
これはTopCoderでは厳しく制限されているのと対照的です。
コンテストの種類
誰でも参加できて、最も高いスコアを出した人が優勝で賞金をもらう、というのが普通のタイプのコンテストですが、それ以外の種類もあります。
- Getting Started Competitions
- Recruiting Competition
- 企業が人を雇うために開催しているコンテストです(なんとあからさまな)。
- もちろんこれに勝ったからといって無条件で雇われるわけではないみたいですが…
- チーム参加は不可です。
- Visualization Competition
- 予測結果の精度を上げていくようなものではなく、データの可視化について競うコンテストです。
- 順位は投票によって付けられるようです。
- 例:http://www.kaggle.com/c/us-census-challenge/prospector#230
- Masters Competition
ベンチマーク
主催者が用意した、シンプルな手法によるプログラムとその結果が、ベンチマークとして提供されています。
たとえば"全部ランダム"とか"てきとーにRandomForestに入れてみた"とか"てきとーにk-NNしてみた"みたいな。
まずはこのスコアを超えることが目標になります。
自分でいろいろ考えた要素をモデルに含めるよう頑張って実装しても、単純なベンチマーク解答に負けたりするので面白い。
コンテストの流れ
"Getting Started Competitions"として開催されている、タイタニックの乗客データ分析の問題に参加している様子を見ていきます。
テストデータの入手
テストデータは次の場所にあります。
http://www.kaggle.com/c/titanic-gettingStarted/data
表が5行ありますが、一番上が訓練データ、一番下がテストデータ、真ん中3つがベンチマークのプログラム/解答です。
一緒に、データのフォーマットが書かれています。
タイタニックの各乗客について、年齢や性別、何人の家族と一緒に乗っていたか、チケットの値段はいくらか、乗船した港はどこか、などのデータが並んでいます。
これらのデータを元に、それぞれの乗客が事故の生存者だったかどうかを判別する問題です。
データ分析・実装
とりあえず表計算ソフトで開いて訓練データを眺めてみます。
てきとーに統計を取ってみると、性別が生存者だったかどうかにとても大きく関連していたり、名前のようにほとんど関係なさそうなデータが含まれていたりすることがわかります。
また、現実世界のデータには良くあることですが一部のフィールドで値が抜けているところもあるので、どうにかして扱ってやらないといけません。
これについては練習コンテストということもあり、ベンチマークプログラムについて説明したチュートリアルの中にも書いてあります(How do I clean and fill? のところ)。
今回は、乗客の名前みたいに明らかに結果に関係なさそうなデータを除いて、残り全部の要素を使ってナイーブベイズを組んでみました。
年齢やチケット額みたいに値が連続値に近い要素については、適当に離散化しています。
また、過学習を防ぐため訓練データを使って5-fold cross validationしてパラメタを決めました。
提出
テストデータに対してプログラムを実行し、得られた結果をCSVで提出します。
提出するときに、一緒にコメントを付けられます。
コンテスト終了時に、どの提出を最終的なものとして使うかを自分で選ぶ(選ばなかったら自動的に最新のものになる)のですが、そのときにコメントが参考にできます。
結果を提出すると、スコアが計算されて順位表に反映されます。
以前RandomForestを試したときに自己ベストのスコアを出しており、今回のスコアはそれを超えることはできなかったようです。
自分の過去の提出はこんな感じで一覧できます。
順位表の見た目が正直いまいちですが、現在これを改善するためのVisualization Competitionが開催されているので期待しましょう。
感想など
- 提出すると、訓練データのクロスバリデーションで出ているスコアよりもかなり小さいスコアしか取れず、汎化性能の高いモデルを作ることの難しさを感じています
- 参加者の平均レベルはかなり高そう。wikiにまとめられたリソースを参考にし、上位者のドキュメントをしっかり読んでいったらこのKaggle内だけで機械学習系の学習が完結してしまいそう
- コンテスト期間が1ヶ月〜2ヶ月くらいのものが多いので、突然コンテストが始まってもスケジュールを調整しやすい。この点TopCoder MMは辛い
- TopCoderのforumに「TopCoder vs Kaggle」というトピックが立っています。TopCoderのMarathonが機械学習・データマイニング系のコンテストを今後も継続するとしたら、生き残るのはどっちでしょうね…
- 今のところ、コンテストの参加者数・賞金額・開催数いずれもKaggleのほうが少し多いくらいです