見出し画像

[競馬予想AI] ベイジアンによる勝馬予想

この記事は、ベイズ統計を用いて勝ち馬を予想してみようという内容です。
勝ち馬を予想するための情報を追加していき、ある馬が勝つ確率を更新していくベイズ更新によって勝ち馬を予想してみます。

今回は2023年の根岸Sを例に計算します。

この記事は2023年1月31日にFANBOXにて先行公開した記事です。

ベイズの定理

まずはベイズの定理の確認です。
次式がベイズの定理で、事前確率を更新(ベイズ更新)して馬が勝つ確率を求めます。

P(H|D) = P(H) × ( P(D|H) / P(D) )

P(H):Hである確率(事前確率)
P(H|D):Dである条件のもとHである確率(事後確率)
P(D|H):Hである条件のもとDである確率(尤度)
P(D):Dである確率(周辺尤度)

詳しい式の解説は省略しますが、事前確率であるP(H)を、新たに加えた情報P(D|H) / P(D)で更新していくイメージです。

さらに新たな情報が与えられたとき、このP(H|D)を事前確率P(H)として同様に計算を繰り返します。


各馬の勝つ確率を求める

実際に根岸Sを例に各馬の勝確率を求めてみましょう。

事前確率

事前確率は何も情報が無い場合の確率です。今回の根岸Sは出走頭数16頭なので、ある馬が勝つ確率P(H)は一様に1/16(6.25%)とします。
ここから勝ち馬予想に役立ちそうな情報を加えて行き、ある馬の勝率を更新していきます。

追加する情報

追加情報には過去の根岸Sのデータを使用しましょう。下の表は過去の根岸Sの勝ち馬のデータです。

2009年~2022年の根岸S勝ち馬のデータ

勝ち馬のデータだけを見る限り、5歳以上の馬がよく勝っているように見えますし、性別については牝馬の勝ちはありません。脚質はやや後方の方が有利そうに見えますし、前走距離から短縮あるいは同距離の馬がよく勝ちそうに見えます。

今回は馬齢性別前走脚質前走距離比較の4つの情報を使ってみます。


事前確率の更新ー馬齢

馬齢の情報が追加された時の馬の勝率を計算してみましょう。
ここで、ある馬は5歳以上である(D = 5歳以上である)とします。上表より、まずP(D|H)を求めます。

勝ち馬であり5歳以上である確率:P(D|H) = 0.786

次にP(D)を求めます。P(D)は次式のように変形できます。

P(D) = P(D|H)P(H) + P(D|~H)P(~H)

これはDが得られる平均的な確率を意味します。つまり、すべての条件においてDが得られる確率になります。すべての条件というのはH(Hである)と~H(Hではない)のいずれかです。Hは事前確率を定義したときの「勝ち馬である」という事象であり、今回の例におけるすべての条件とは「勝ち馬である」と「勝ち馬ではない」のいずれかしかありません。よって、P(D)はP(D|H)P(H) + P(D|~H)P(~H)の2つの項で計算できます。もちろん問題によっては条件が3つ以上になる場合もありますが、今回は簡単のためすべて「そうである」「そうではない」という2択の条件設定をしています。
また、事象Dの決め方も本来はもう少し細かくするべきです。

では、P(D)を求めましょう。

周辺尤度:P(D) = 1/16 × 0.0625 + 15/16 × 0.903 = 0.8957

(表からは確認できないP(D|~H)については過去のデータから私が計算しておきました。)

P(D|H)とP(D)が求まったので、いよいよ事前確率P(H)を更新してみましょう。

P(H|D) = P(H) × ( P(D|H) / P(D) ) = 1/16 × ( 0.786 / 0.8957 ) ≒ 0.0548(5.48%)

と事前確率P(H)が更新されました。( 0.786 / 0.8957 )の部分を見てのとおり、1より小さい値が事前確率であるP(H)に掛け算されています。つまり、「5歳馬である」という情報が加わったことによりこの馬の勝つ確率が小さく更新されたということになります。

上表を見ると5歳以上の馬が勝っている確率が多く見えますが、実は負け馬で5歳以上の馬はもっと多かったんですね。

(過去の勝ち馬の情報だけを見るのは危険だということがわかります。)

それでは以降、同様にある馬が勝つ確率を更新していきましょう。(以降解説は省略します)


事前確率の更新ー性別

続いて、馬の性別情報を加えて確率を更新してみましょう。
ここで、ある馬は牡である(セン馬含む)とします。

上表より、P(D|H)を求めます。

勝ち馬であり牡である確率:P(D|H) = 1.0

続いて、P(D)を求めます。

周辺尤度:P(D) = 1.0 × 0.0548 + 0.9565 × (1 - 0.0548) = 0.0548 + 0.9041 = 0.9589

(P(D|~H) = 0.9565 については過去のデータから私が計算しておきました。)

よって、事後確率P(H|D)は、

事後確率:P(H|D) = 0.0548 × ( 1.0 / 0.9589) ≒ 0.0571(5.71%)

P(D|H) = 1.0 だったのでこれは確率が大きく更新されるのでは?と期待しましたがあまり確率は上がりませんでしたね。これも、負け馬であり牡馬である確率が0.9565と高かったためです。根岸Sではほとんど牡馬が出走しているんですね。


事前確率の更新ー前走脚質

続いて、前走の脚質情報を加えて確率を更新してみましょう。少し玄人っぽい分析になってきましたね(?)
(脚質の判断について共通のルールが存在しないため、このデータは私の定めたルールに基づいて脚質を決定しました。)

ここで、ある馬の前走脚質は差し・追込みであったとします。

勝ち馬であり前走脚質が差し・追込みだった確率:P(D|H) = 0.6429

周辺尤度:P(D) = 0.6429 × 0.0571 + 0.5556 × (1 - 0.0571) = 0.5605

(P(D|~H) = 0.5556 については過去のデータから私が計算しておきました。)

事後確率:P(H|D) = 0.0571 × ( 0.6429 / 0.5605) ≒ 0.0655(6.55%)

無情報であった事前確率より高くなりました。根岸Sあるいはこの競馬場のダート1400mは差しや追込み馬が勝ちやすいようです。


事前確率の更新ー前走距離比較

最後に前走距離と比較して短いかどうかの情報を加えて確率を更新してみましょう。

ここで、ある馬は根岸Sに出走するにあたって距離延長ではないとします。

勝ち馬であり距離延長ではない確率:P(D|H) = 0.7857

周辺尤度:P(D) = 0.7857 × 0.0655 + 0.5990 × (1 - 0.0655) = 0.6112

(P(D|~H) = 0.5990 については過去のデータから私が計算しておきました。)

事後確率:P(H|D) = 0.0655 × ( 0.7857 / 0.6112) ≒ 0.0842(8.42%)

前走との距離比較で確率が大きく更新されました。根岸Sでは前走から距離短縮または同距離の馬が有利であるようです。


逐次合理性について

4つの情報を利用してベイズ更新を行いました。その結果、「5歳以上であり、牡であり、前走差し・追込みで、今走距離短縮である馬」の勝率は約8.42%であると求まりました。無情報での確率6.25%よりも大きな確率となりました。

今回は「馬齢→性別→前走脚質→前走距離比較」という順番でベイズ更新していきましたが、この順番で更新しなくても最終的には勝率約8.42%となります。前回どのような試行をしたかによらず最終的な確率は変わらないことを逐次合理性といいます。


計算後の確率の扱い

すべての馬について勝率を求めたあと、その確率はどのように扱えばよいでしょうか。

ひとつは各馬における最初の事前確率と最終的な事後確率を比較することです。今回の例では、P(H)=0.0625とP(H|D)=0.0842を比較すると最終的に勝率は約1.35倍になったといえます。個々の馬にとって今レースにおける条件がどれくらい有利であるかという指標になるかもしれません。ただし、他の馬も全頭1.35倍であれば相対的に有利不利は無くなる点は注意が必要です。


機械学習としてのベイズ統計

機械学習の中でも深層学習の内部処理ではベイズ更新のような手法で学習を進めているといわれています。今回示したように、色んな情報を加えて少しずつ精度を高めようという試みはまさに特徴量を加えて学習していく機械学習そのものです。深層学習のような知識は不要なので、極論、手計算でも可能です。

ベイズ更新を行うにあたり注意も必要です。今回は根岸Sの勝ち馬の確率を求めましたが、追加する情報の元データが少ないという点です。今回は14件のデータを使用しましたが、データが少ないと正しく確率を更新することが難しくなります。その点において、使用するデータについては工夫が必要です。

また、追加する情報を見つける手間がかかります。今回は年齢など簡単な情報を使いましたが、本気で予想をする場合はもっと深い情報を使う必要があるでしょう。これらの情報をどのように集め選択するかという問題があります。


根岸S期待の馬は?

今回は4つの情報で勝ち馬の確率を求めました。事象の数がたったの4つであること、事象の設定がかなり大雑把であるので精度は高くないとは思いますが、最後に上記のベイズ更新を行った結果、最も勝率が高かった馬を紹介します。

4番 セキフウ
14番 バトルクライ

答え合わせ

この記事は根岸S開催の前夜に書いていたのですが間に合いませんでしたので、答え合わせもしておきましょう。

結果は、13番レモンポップが勝ちました。14番バトルクライは惜しくも3着(0.2秒差)でした。レモンポップは牡馬、5歳、前走先行、距離短縮でした。

よろしければサポートをよろしくお願い致します。いただいたサポートは今後の技術向上のために書籍費用等に当てられ、このnoteで還元できればと思います。