【第一回】AIで一攫千金目指してみる【考察編】
前回の記事では1月11日(月)に行われた中山、中京それぞれのメインレースの順位予想をAIによって行いました。
今回の記事では、その結果の確認と考察を行いたいと思います。
以下が、メインレースの予想とその結果です。
フェアリーステークス(中山)
予想
- テンハッピーローズ
- クールキャット
- ファインルージュ
- ベッラノーヴァ
- タイニーロマンス
- シャドウファックス
結果
- ファインルージュ
- ホウオウウイクセル
- ベッラノーヴァ
- テンハッピーローズ
- ネクストストーリー
- タイニーロマンス
フェアリーステークスでは、予想の6頭のうち、2頭が複勝圏内にきました。また、上位6頭まで見れば、6頭中4頭がきていました。(なぜ上位6頭を予想したかは後述)
すばるステークス(中京)
予想
- ブルベアイリーデ
- レシプロケイト
- スリーグランド
- アヴァンテイスト
- アードラー
- トップウイナー
結果
- テイエムサウスダン
- アヴァンテイスト
- ハーブクリーブス
- ブルベアイリーデ
- スリーグランド
- レシプロケイト
すばるステークスでは、6頭中1頭が複勝圏内にきました。フェアリーステークスと比較すると予想の精度が落ちていますね。
また、上位6頭まで見ると、6頭中4頭がきていました。これはフェアリーステークスと同じですね。
では、なぜこのような結果になったのか、私なりに考察をしてみたいと思います。
予測モデルについて
今回作成した競馬予想AIですが、中身はLightGBMでランク学習をさせたものでした。
LightGBMはデータ解析の分野で非常に注目されている機械学習モデルです。
競馬に対してランク学習を適用する例はレアケースだと思いますが、今回の実装では以下の先輩方の記事を参考に作成しました。
参考リンク
- [競馬予想AI] ランク学習で着順予想するとなかなか強力だったお話|とりまる|note
- 競馬予想AI再び -前編- 〜LambdaRank編〜
- 機械学習で競馬必勝本に勝てるのか? 〜Pythonで実装するランク学習〜 - エニグモ開発者ブログ
技術的なところはこちらの方々の記事を見ていただくとして、実際の予測に対する考察を行っていきたいと思います。
実際の着順をもう少し詳しく見てみる
まずは、実際の着順を確定後の人気と合わせて確認してみましょう。
フェアリーステークス(中山)
予想
- テンハッピーローズ(1人気)
- クールキャット(2人気)
- ファインルージュ(3人気)
- ベッラノーヴァ(6人気)
- タイニーロマンス(5人気)
- シャドウファックス(4人気)
結果
- ファインルージュ(3人気)
- ホウオウウイクセル(8人気)
- ベッラノーヴァ(6人気)
- テンハッピーローズ(1人気)
- ネクストストーリー(11人気)
- タイニーロマンス(5人気)
こちらの予想の方はほぼほぼ人気順になっています。人気順に並べ替えるゲームならとてもいい成績を叩き出せそうです(競馬はそういうゲームではない)
すばるステークス(中京)
予想
- ブルベアイリーデ(4人気)
- レシプロケイト(1人気)
- スリーグランド(2人気)
- アヴァンテイスト(7人気)
- アードラー(8人気)
- トップウイナー(6人気)
結果
- テイエムサウスダン(5人気)
- アヴァンテイスト(7人気)
- ハーブクリーブス(9人気)
- ブルベアイリーデ(4人気)
- スリーグランド(2人気)
- レシプロケイト(1人気)
こちらもほぼほぼ人気順に予想していますね。グルーヴィットがこない予想はばっちり当たっていてそこはやりますねぇ!なんですが、結果として馬券を外すんじゃ意味がないんだよなぁ...
当日に使える情報の重要性
今回のAIでの予想に使った情報について簡単に説明します。
予想の際に使った情報としては、レース会場の情報(場所や距離、芝・ダートなど)や各馬の情報(勝率・複勝率、スピードなど)、各騎手の情報(勝率・複勝率)でした。
こうした情報は過去のレースがもとになっているものであり、レース当日の情報はほぼありません。唯一、レース当日の情報として利用したのは馬番くらいです。(とはいっても、馬番は遅くとも前日には分かるので、厳密には当日じゃなくても利用可能な情報)
そうすると、レース当日に分かる情報はほぼ使っていないということになるので、今回のAIは「過去の戦績だけで今回のレースの順位が大体分かるだろう」という前提で予想したこととなります。
とはいえ、馬も生き物なので、当日のコンディションによっては従来の力を発揮できなかったり、逆に従来のパフォーマンスを大きく上回ることもあるわけですね。
そうした情報は、例えばパドックの様子だったり、馬体重の増減を確認することである程度考慮ができそうです。
パドックの様子を表す情報として適切なものが今のところ見つかっていないため、馬体重の増減を使うことにしています。
(パドックの様子を自動的になんらかの評価指標に変換し、AIが使える情報に落とし込めれば、さらなる予測精度向上につながるかもしれません。)
過去の情報のみを予測モデルに与えた場合は、各馬のいわゆる実力が評価されることになるため、結果として順位予測が人気順と一致する形になったのかなというのが今の所の結論です。
過去の成績が良い馬ほど人気になるだろうと考えれば、妥当な結果といえるかもしれません。
ちなみに...
競馬予想AI的なものを作りたいと思っている方に向けて、私なりの考えを共有します。
今回はランク学習を使って予測モデルを作成しましたが、例えば順位をクラス分類問題として予測モデルを作ったり、タイムを予測する回帰モデルを作成したり、様々なアイデンアがあるかと思います。
その場合、競馬において重要なのは実際に重要なのは、レースに出走する全ての馬に対する予測精度ではなく、上位n頭までの予測精度だと考えています。
つまり、18頭が出走するレースであれば、実際に予測すべきは上位6頭くらいまでであり、それ以降はどうでもいいということです。
言い換えれば、ビリを予測してもお金にはならないということです。
クラス分類であれば、全てのクラスを予測する必要はないし、タイム予測であれば、大差が着いた馬のタイムまで予測する必要はないと思っています。
むしろ、それをしようと思うと至難の業なので、そもそもモデルの学習に使わない方がいいかもしれません。
今回上位6頭を予想した理由は、単純に複勝圏内3頭までの予想でピタリと当てられるほどモデルの精度がよくないからでした。
むしろ、多少手広く馬券を買うことにした方が、ワンチャン万馬券を当てられて、結果的に回収率が上がるという考えです。
その辺りを考えるのも面白いので、興味のある方はネットにたくさん関連する記事がありますので、探してみてはいかがでしょうか。
まとめ
今回は残念ながら三連複6頭BOXをもってしても的中させることはできませんでした。
次回は馬体重の増減などの情報をきちんと使って予測していきたいと思います。
競馬予想AIはシリーズ化していきたいと思いますので、ご興味のある方はお楽しみに!
次回はフェブラリーステークスでお会いしましょう!