忘れないようにメモっとく

機械学習とかプログラミングとか。

NCAA全米大学バスケの勝敗予測 ~ kaggleのデータコンペ

kaggleで面白そうなデータコンペやってる

予測モデルやデータ分析のコンペティションのkaggle。 今回はスポーツに関連したコンペで、大学バスケの勝敗(勝率)予測です。

https://kaggle2.blob.core.windows.net/competitions/kaggle/3812/media/Kaggle_web_banner_FINAL.png

NCAAってなんだろ?

バスケは全然詳しくないので、、NBAは知ってるけど、NCAAって聞いたこともなかった。 この辺の前提知識がないと、予測もできないと思うので、ちょっと調べてみた。

まず、NCAAとは、アメリカ大学体育協会(National Collegiate Athletic Association)のことで、バスケとか野球とか、アメフト、ホッケーなどなど、いろんな大学スポーツを運営しているらしいです。

つまり、NCAAバスケは全米大学バスケチームのNO.1を決める大会というわけですね。

出場校は、各地区レギュラーシーズンを勝ち上がった代表68チーム。トーナメントは3月途中から試合が始まり、アメリカ全土が熱狂するころから「マーチマッドネス」と呼ばれてるそうです。詳しくは、このあたりを→ WOGのNCAA講座!

kaggleからダウンロードするデータ

  1. 各チームのデータ(idと名前だけ)
  2. レギュラーシーズンの試合結果(得失点)
  3. トーナメントの試合結果(得失点)
  4. トーナメントの組み合わせ

以上のデータが18年分もらえます。

実際に予測するものは、各試合の勝敗。\( y_i \)は勝敗の結果、0 or 1。\(n\)はゲーム数。\( \hat{y}_i \)は勝率。基本的に全ての項にペナルティがついて、勝率を高く予想して勝ったときには小さいペナルティ、負けてしまったら大きなペナルティになります。 同じくらいの実力のときは、どちらが優勢か分からないので、勝率を0.5に設定して、傷を浅くするようなイメージ。 ペナルティの総和が小さいほど、正確な予測ということです。

\( \textrm{LogLoss} = - \frac{1}{n} \sum_{i=1}^n \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] \)

チェスのレーティング

とりあえず、kaggleのベンチマークにチェスのレーティングモデルを使ったものがあったので、それを試してみます。

計算方法は、wikipediaをみていただいて。。 イロレーティング - Wikipedia

どこかでみたことある数式だと思ったら、映画「ソーシャルネットワーク」で、ザッカーバーグ達が「facemash」のアルゴリズムとして、窓に書いていましたね。

http://3.bp.blogspot.com/_ie_tvDj66rE/TUni7aVaIOI/AAAAAAAADoM/34Uz8ymAzzQ/s1600/2010_the_social_network_063%2B%2528Medium%2529.jpg

強いチームから勝つとレーティングが大きくあがり、弱いチームに負けるとレーティングが大きく下がります。

とりあえず、csvのデータをMySQLにぶち込んで、18年分の試合結果を基に、各校のレーティングを計算してみました。 上位校は、

順位 学名 レーティング
1st Kentucky 1772
2nd North Carolina 1769
3rd Louisville 1767
4th Kansas 1759

参考までに、2013年の優勝はLouisville、準優勝はMichigan。2012年は優勝がKentucky、準優勝がKansas。 ちなみに最下位の大学(578)が、Louisvilleと試合をすると勝率0.1%となってしまいます。 チェスのレーティングには「レート差が200以上あるときは、勝率を75%に固定する」というルールがありますが、レート差が開いてるときの勝率をうまいこと決めることができれば、いいスコアが出せそうです。

3月はスポーツバー行って、予測結果を見ながらワイワイ観戦します。