##動機
あるイベントでTensorFlowを触る機会があり、そのとき機械学習で競艇の予想ができないかという話が出て、面白そうなのでやってみました。
環境
Ubuntu 16.04 + python 2.7.12 + TensorFlow 0.7.1
##1.条件設定
競艇では6つのボートが順位を競います。舟券を購入する人は選手の戦歴などから、ゴール時点での着順を予想します。
今回は、ゴール時点での1着、2着を着順を含め予想する「ニ連単」の予想に挑戦します。
##2.過去レースデータベース作成
過去のレース結果は、下記のサイトでテキストファイルで提供されています。
http://www1.mbrace.or.jp/od2/K/pindex.html
2014年~現在(2016/11)までの結果を一括で取得し、Python+SQLite3でデータベース化しました。
##3.入力特徴量作成
訓練を行う際に入力する特徴量を計算しました。使用する特徴量は以下の通りとしました。
- レース会場
- 進入固定か否か
- 選手の進入分布
- 選手の枠別着順分布
- 選手のスタートタイミング分布
- 選手の決まり手分布
選手の特徴量については、過去1か月半を対象として作成しました。なお、戦歴が極端に少ない選手が出場しているレースは、予想対象から外しています。選手が使用するボート・モーターも予想の参考にする方がいるようですが、今回は対象外としました。
ネットワークの実装は以下の記事を参考に行いました。
[機械学習(TensorFlow)+ ロト6] http://qiita.com/yai/items/a128727ffdd334a4bc57
##4.訓練
訓練は2014年1月~2016年3月の97200レースを対象として行い、ステップ数は300としました。
結果として、訓練データにおける的中率は20%程度になりました。やはり競艇の予想は難しいようです。
##5.シミュレーション
2016年5月~2016年10月の6か月間のレースを対象としてテストを行いました。各レースにおいて、出力ラベル(=予想結果)の値が一番高くなったものを、100円ずつ買ったとしてシミュレーションを行います。
なお作成したプログラムの都合上、選手のファウル・落艇などでゴールしたのが5艇以下のレースはテストケースから除いてあります。また、舟券購入に伴うオッズの低下等も想定していません。よって、以降に示す的中率等の結果は実際よりも若干高く出ている可能性があることに注意してください。
##6.シミュレーション(1) 全レース予想
期間内の全ての予想対象レースで試してみます。
期間 | 予想レース数 | 的中レース数 | 的中率 | 収支(円) |
---|---|---|---|---|
2016/5 | 4178 | 856 | 0.204 | -63,010 |
2016/6 | 3589 | 723 | 0.201 | -54,460 |
2016/7 | 3940 | 752 | 0.190 | -75,450 |
2016/8 | 4336 | 816 | 0.188 | -61,120 |
2016/9 | 3598 | 672 | 0.186 | -64,610 |
2016/10 | 3750 | 688 | 0.183 | -74,940 |
計 | 23391 | 4507 | -393,590 |
散々な結果です。的中率が低い上、オッズが低いレースしか的中していないので、収支が大幅なマイナスとなっています。
##7.シミュレーション(2) レースを選んで予想
出力ラベルが一定のしきい値(今回は0.45)を上回るレースのみを対象として試してみます。
自信があるレースだけに絞る感じです。
期間 | 予想レース数 | 的中レース数 | 的中率 | 収支(円) |
---|---|---|---|---|
2016/5 | 55 | 28 | 0.509 | +190 |
2016/6 | 53 | 24 | 0.452 | +1,050 |
2016/7 | 63 | 29 | 0.460 | +790 |
2016/8 | 47 | 24 | 0.510 | +530 |
2016/9 | 30 | 13 | 0.433 | -170 |
2016/10 | 30 | 14 | 0.466 | +450 |
計 | 278 | 132 | +2,840 |
的中率は4割以上になり、収支も6か月中5か月で微妙ですがプラスとなっています。
やはりオッズが低いレースしか的中していないようですが、的中率の高さでカバーしている感じです。
競艇の平均回収率が75%であることを踏まえれば、そこそこの結果と言えそうです。
##まとめ
競艇は人対人のレースであるため、イレギュラーな要素が多く、機械学習で着順結果そのものを予想することは難しいようです。そもそも筆者が機械学習や競艇に対して素人であるということも一つの原因ですが..
大量のレースから選手間に圧倒的な力量差がある、いわゆる「固いレース」を抽出する用途には使えるかもしれません。
なお前にも述べましたが、今回行ったシミュレーションは現実と異なる条件下で行ったもので、実際のレースでうまくいくかどうかは分かりませんので、あしからず。