競馬AI開発について第8回です。
今回はAIモデルの構築について記述します。
データの分け方について
機械学習手法を用いてAIモデルを作成するとき、主な目的は
「未知のデータに対する予測精度を向上させること(汎化性能を向上させること)」
です。
つまり、持ち合わせのデータをすべて学習に用いてしまうと、その学習データのみに対しては高い予測性能を示すが、新しいデータに対しては予測性能がイマイチ、
といった状況になる可能性があります。
これは、「過学習」という現象であり、練習問題や模擬テストはほぼ完ぺきに解けるけど、実際のテストではあまり良い点数がとれない、といった状況です。
過学習を回避するためにさまざまなモデルの評価方法がありますが、AISSの開発で用いている方法を説明します。
例えば、学習データとして2010年~2021年までのデータをDBに保持している場合、
① 2010年~2020年のデータのうち、2/3を学習用
② 2010年~2020年のデータのうち、1/3を評価用
③ 2021年のデータを、テスト用
と、3つにデータを分割します。(ホールドアウト法)

と突っ込まれるかもしれませんが、
機械学習手法では通常、どの手法を用いるかを決めるだけでなく、その手法(モデル)ごとにハイパパラメータの設定をしなければなりません。
ハイパパラメータとは、ニューラルネットワークの重みのようにコンピュータが自動計算で最適化するものではなく、学習前に人間が設定するものです。
従って、
- ハイパパラメータセット1でまず学習&テストしてみる
- 次にハイパラメータセット2で学習&テストしてみる
・・・
ということを繰り返して最適なハイパパラメータセットを決めるのですが、
単純にデータを学習用とテスト用の2つに分けているだけだと、たまたまテスト用データがそのハイパパラメータに合っていただけ、
という可能性が捨てきれないため、これを防ぐため、
- まず①②のデータでハイパパラメータを決定
- 次に③のデータで最終的な汎化能力テストを行う
という流れがAIモデル作成では一般的です。
ちなみに、①②のハイパパラメータの決め方はクロスバリデーションと呼ばれる方法が用いられることが多いですが、
AISSの場合、
- 一つのモデル作成に時間がかかる
- ハイパパラメータはほぼ決め打ち
といった理由のため、単純なホールドアウト法を用いることにしています。
また、①②データの分け方について、本当は時系列を考慮し、
①2010年~2016年
②2017年~2019年
のように学習の時期よりあとに評価がなされるようにしないと、情報リークの可能性が出てきます。
AISSでは、
- 解きたい課題やモデル構造(データの入れ方)が通常の時系列モデルとは異なる
- 完全に時系列順にしてしまうと、近年のレース特徴が捉えられない
- ③のテストにより汎化性能をきちんと確かめることができる
- 実運用でもある程度成果が出ている
といった理由のため、あえて①②では、完全にランダムに混ぜてデータを振り分けています。
ただしこちらの方法については上述のように情報リークの危険性があるため、何も考えずに真似はしない方が良いです。
(あくまでAISSの開発上ではうまくいっている、と認識しています。)
長々と述べましたが、個人的に最も重要なのは
汎化性能を確かめるためにきちんとデータ分けをする
ということです。
(開発当初はデータを2つにしか分けておらず、実運用で思うような結果が出せなかったです。。。)
採用している機械学習手法について
競馬AI開発に限らず、良く用いられる機械学習手法は
- ニューラルネットワーク系(ディープラーニングなど)
- 木系(ランダムフォレストやGBDTなど)
の2つの印象です。
また予測の説明を重要視したい場合は、よりシンプルで統計手法としても用いられる「線形モデル」が使われることもあります。
それぞれの手法の特徴は一長一短で、選択が難しいですが、
AISSではディープラーニング(ニューラルネットワークの一部)を用いています。
理由としては主に、
- 仕事で使ったことがある
- 予測根拠の説明より予測精度を重要視したい
- データの入れ方を工夫したい
といったところです。
AIモデルを作成するにあたり、細かいテクニックを使わない場合は、
現在ある程度フレームワーク・ライブラリとしてまとまっているため初心者でもすぐに試すことができます。
ちなみにディープラーニングはpytorchを用いています。
最初は結構な人が試しているGBDT(Gradient Boosting Decision Tree:勾配ブースティング木)に取り組んでみても良いと思います。
(有名なライブラリのうち私が良く使っているのはLightGBMです。)
ではAISSでディープラーニングを採用する上で、最も重視している
「データの入れ方を工夫したい」
といった点についてですが、下図のモデル構造を見ていただくと分かる通り、
「今回のレース情報」「予測対象馬の今回の情報」などを1つのブロックとして入力することで
- 1頭予測するのに相手馬のデータも同時に入力できる
- 時系列の情報も考慮できる
といった特徴があります。
つまり、新聞で表されているような馬柱の形でそのまま入力しているイメージとなり、
前回説明した、学習用データがまさしくこの形に加工されたものです。
GBDTなど他の機械学習手法ではデータをすべて横一列に並べるものであり、
項目間の関係がやや学習しにくいと考えています。
なお、技術的にもう少し詳しい話は興味があれば下記単行本の取材記事「10章 氷星のディープラーナー」をご覧ください。
『AI競馬 人工知能は馬券を制することができるか?』
正解値と評価指標について
予測したいデータの「正解値」を何に設定するかは、AIモデルを作成する上で非常に重要です。
同じデータを用いて学習しても、正解値を変えるだけで全く性質の異なるモデルが出来上がります。
例えば、
- 単純に勝ち馬のみを当てる場合は「1着馬を1、それ以外を0」として正解値を設定
- 馬券圏内の馬を当てる場合は「3着以内馬を1、それ以外を0」として正解値を設定
するなどです。
AISSの場合、主に3種類の正解値を定め、それらを元にモデルを作成しています。
単勝オッズ予測モデル
こちらは、ウマい馬券での予想買目を選定するために利用するモデルとなります。
こちらのモデルは「単勝オッズ」を予測することが目的なのでそのまま「単勝オッズ」を正解値にすれば良さそうですが、
単勝オッズが1.0~999.9と範囲が広く、大きな値になるにしたがって正確に予測するのが難しい(分散が大きい)ためか、
そのまま単勝オッズを正解値に設定してもうまく学習してくれませんでした。
そこで、AISSでは「単勝オッズ」を正解値にする代わりに、「単勝支持率」を正解値に設定しました。
オッズ = 払戻率(1 - 控除率) ÷ 支持率
であるため、
支持率 = 払戻率(1 - 控除率) ÷ オッズ
となります。
特に、単勝の場合は払戻率80%であるため
単勝支持率 = 0.8 ÷ 単勝オッズ
上記のように単勝オッズから単勝支持率への変換式は与えられ、
例えば、単勝オッズ2.0倍の場合は
単勝支持率 = 0.8 ÷ 2.0 = 0.4 (40%)
などと変換されます。
この値を学習時の正解値として利用します。
実運用では、このモデルより出力された値(予測単勝支持率)を
レースごとに合計1になるように正規化した上で、
予測単勝オッズに変換することで単勝オッズ予測モデルとして活用しています。
提供予想の買目を最適化し好成績を目指すために必要不可欠なモデルです。
【参考】競馬のオッズ計算はどうなっているの?初心者にも分かりやすく解説!
メインモデル
こちらが、予想印を決めるためのメインモデルとなります。
ここで設定する正解値設定のための具体的な計算式は申し訳ないですが、こちらでは明記しません。
なぜなら、この正解値がAISSの最も開発で工夫している点といっても過言ではないくらい重要だからです。
アイデアとしては、ウマい馬券のプロフィール文言にもある通り、
「ただ当たるだけでなく回収率も高くなる」
ように正解値を定めています。
ヒントとしては、回収率と的中率のバランスと着順・着差などを総合的に加味して正解値として反映されています。
この正解値が高くなるのは中穴で他馬を引き離して勝つ場合
であり、逆に人気馬や大穴馬が勝っても、
的中率や回収率の観点からはそれほど長期的に旨味がないので評価値を下げています。
ちなみにこの正解値算出式のベースは開発当初からほとんど変わっていません。
WIN5用モデル
こちらは、中央限定ですが、WIN5を当てるため勝馬予測に特化した正解値を与えています。
しかし。上述の「1着馬を1、それ以外を0」として正解値を設定するわけではなくて、
各馬の着順や着差に応じて補正しています。
詳細な説明はメインモデルと同様の理由で割愛いたします。
以上の3種がAISSで作成しているモデルですが、すべて学習に使用するデータと学習方法は同じで、変えているのは正解値のみです。
ここで、評価指標(各モデルの性能を測る指標)について、基本的にはMSE(Mean Squared Error=平方二乗誤差)を用いていますが、
これとは別にAISSでは競馬AI作成ならではの評価指標も採用しています。
こちらについては次回解説予定です。
実際のレースデータで眺めてみる
では最後に上記モデルの性能比較と実際の出力例を載せます。(2021年5月時点採用モデル)
メインモデルとwin5用モデルについて、テスト用データを用いて単勝および複勝の本命馬ベタ買い結果と、本命馬人気平均は以下の通りです。
win5用モデルの方が明らかに、本命馬が人気馬に偏りがちであることからメインモデルと比較して的中率が高いことが分かります。
単勝回収率は差がほとんどありませんが、複勝回収率はメインモデルの方が高く、
馬券的に美味しい穴馬が予測できているのではないのでしょうか?
次に、各モデルの出力値の比較です。
実際のレース例として、2020年の日本ダービーの結果を載せます。
※予測単勝オッズが999.9倍は、予測単勝支持率が0以下で出力されたもの
1着:コントレイル(1人)
→メインモデルでは予測3位、
win5用モデルでは予測1位
2着:サリオス(2人)
→メインモデルでは予測12位、
win5用モデルでは予測2位
3着:ヴェルトライゼンデ(10人)
→メインモデルでは予測5位、
win5用モデルでは予測6位
と、このレースに対しての予測としては大正解というわけではないですが、
3着のヴェルトライゼンデが10番人気にもかかわらず、メインモデルでもwin5用モデルでもより高い予測順位となっています。
また、正解値についてですが、
例えば1着コントレイルのメインモデルでの正解値は0.51なのに対して、win5用モデルでの正解値は1.25です。
実際には2着のサリオスに3馬身差の快勝となりましたが、あまりにも人気馬の勝利がゆえメインモデルの正解値としては低くなってしまうことが分かります(メインモデルの正解値はおおむね0.0~1.5程度)。
まとめ
今回は、
- AISS開発でのデータ分割と機械学習手法について
- 実際に作成しているモデルの種類や出力例
について説明しました。
競馬AI開発では通常のAI開発と異なり、データの入れ方・モデル構造や正解値の設定などで独自の工夫することで他の競馬AI開発者との差別化が図れると思います。
AIモデルを作成するまでがとても大変な作業ですが、実際に自分で作成したAIで競馬予測し、的中したときの喜びはひとしおです!
次回はモデル精度の検証方法について解説したいと思います!