競艇AI開発日記 第21話|スタート予測を「当てる」から「予想に使う」へ

前回は、選手ごとの過去のスタート特性を6艇分並べて、

「この6艇の中で、誰がスタートで優位になりそうなのか?」

を考えてみました。

過去のスタート特性を使えば、実際のスタート1位艇をある程度絞り込めることは分かりました。

ただ、6艇のスタート順位を正確に予測するとなると、思ったより難しい。

そこで今回は、ここまでの検証結果をいったん整理して、今後の競艇AIをどうしていくのか考え直してみることにしました。

そもそも、何を予測したいのか?

ここで一度、競艇AIを作ろうと思った最初の目的に戻ってみます。

自分が最終的に作りたいのは、

「スタート順位を当てるAI」

ではありません。

「競艇のレース結果を予測するAI」です。

競艇を知らない方には少し分かりにくいと思うので、簡単に説明します。

競艇は6艇でレースを行い、最終的な着順を予想して舟券を購入します。

そのため、自分が知りたいのは、

「誰がスタートで1番になるのか?」

だけではありません。

最終的には、

「この6艇なら、どの艇が1着・2着・3着になりそうなのか?」

を考えたい。

スタートは、そのための一つの材料です。

そう考えると、

「スタート順位をどこまで正確に予測できるか」

だけを追い続けることが、本当に最終目的につながっているのか?

という疑問が出てきました。

スタート予測は、まったく使えないわけではなかった

ここまで、いくつかの方法でスタート順位の予測を試してきました。

例えば、

・ST中央値

・STが速い率

・STが遅い率

など、過去の選手データから作った特徴量を使って6艇を比較してみました。

結果として、ものすごく高い精度ではありませんでした。

ただ、まったく何も分からないわけでもありません。

実際のスタート1位になった艇を、予測上位3艇以内に入れられた割合は約64%でした。

つまり、

「過去のデータから、今回のスタートについて何かしらの傾向を考えることはできそう」

というところまでは確認できました。

これは個人的には結構大きかったです。

せっかくここまで検証してきたので、

「精度が十分ではないから全部捨てる」

というのも、少しもったいない。

そこで、

「スタート予測そのものを完成させる」のではなく、

「スタート予測を別のところで使えないか?」

と考えるようになりました。

正確な順位予測は、やっぱり難しい

一方で、今回の検証を通して、

「6艇のスタート順位を過去データだけで正確に当てる」

というのは、かなり難しいという印象も持ちました。

競艇のスタートには、

・選手自身のスタート特性

・他の5艇との関係

・レースの重要度

・風

・水面状況

・進入

・その日のスタート判断

など、過去のデータだけでは捉えにくい要素があります。

もちろん、もっと特徴量を増やしたり、モデルを工夫したりすれば、精度を上げられる可能性はあります。

ただ、

「あと数%精度を上げるにはどうすればいいか?」

というところを延々と追いかけるよりも、

「そもそも、この予測精度で最終的な予想に役立てる方法はないのか?」

と考えた方が、今の自分には合っている気がしました。

ここで、AI開発の目的をもう一度考える

今回、改めて感じたのが、

「予測精度を上げること」と「予想の成績を良くすること」は、同じではない

ということです。

例えば、スタート順位をかなり正確に予測できたとしても、それだけで最終的な着順まで分かるわけではありません。

逆に、スタート順位を完璧には当てられなくても、

「このレースでは1号艇の予想を信頼してよさそう」

という判断に使えるのであれば、十分意味があります。

そこで今後は、

スタート予測を「当てるためのAI」ではなく、「予想を判断するための材料」として使う

方向に変えてみることにしました。

すでに作っている予想ロジックを使ってみる

実は、これまでの開発で、すでにある程度の予想ロジックを作っています。

選手の成績やコース別の平均STなどを使って、1着の予想や買い目を作っています。

つまり、ゼロから予想AIを作る必要はありません。

改めて手元にあるものを整理してみると、

「すでに作っている予想ロジックに、今回までのスタート分析を組み合わせればいいのでは?」

と思いました。

現在の予想ロジックにも平均STは入っています。

ただ、

「この選手は過去に速いスタートをどれくらい出しているのか」

「遅いスタートはどれくらいあるのか」

といった、選手ごとのスタートの特徴までは十分に反映できていません。

ここに今回作ってきたスタート特性を加えれば、今の予想を補助できるかもしれません。

スタート予測を「フィルター」として使ってみる

そこで考えたのが、

スリット予測をレース選別のフィルターとして使う

という方法です。

ここも競艇を知らない方に少し補足します。

競艇では、6艇がスタートした直後の並び方を「スリット」と呼びます。

このスリットの状態によって、

「1号艇が逃げやすそうなのか」

「外側の艇が攻めやすそうなのか」

といったレース展開が変わります。

例えば、

既存の予想ロジック

1号艇が1着予想

となっていたとしても、

「今回のスリットでは1号艇が不利になりそう」

と判断できるなら、そのレースは見送る。

逆に、

既存の予想ロジック

1号艇が1着予想

さらに、

「今回のスリットなら1号艇が有利になりそう」

となれば、

「この予想は比較的信頼できそう」

と判断する。

このように、

既存の予想 × スリット予測

という形で使ってみようと考えました。

実際にやってみると、少し面白い結果が出た

そこで、まずは実際のスリットを知っている理想的な条件で、

「スリットによってレースを選別したら、成績はどうなるのか?」

を検証しました。

まだスリットを事前予測するAIは作っていません。

あくまで、

「もしスリットの状態が分かっていたら」

という条件です。

この条件で検証すると、

何も選別しない場合は、

・1,224レース

・的中率18.3%

・回収率68.4%

でした。

そこからスリット条件でレースを絞ると、

・対象635レース

・的中率25.0%

・回収率85.1%

となりました。

約半分のレースを見送ったことで、回収率も改善しています。

正直、

「もっと上がってくれたら嬉しかったな」

というくらいの感覚でした(笑)。

そもそもレース数をかなり削っているので、ある程度の改善は期待していました。

それでも、

「スリット情報を使って、買うレースを選別する」

という考え方には、少し可能性が見えてきました。

そして、少し驚いた結果も出た

さらに条件を絞って、

イン逃げが有利なスリット × 1号艇が1着予想

という組み合わせを見てみました。

すると、

・410レース

・的中率34.1%

・回収率98.0%

という結果になりました。

ここは正直、少し驚きました。

「イン逃げを狙うだけで回収率100%近くまで来るんだ」

という感覚です。

もちろん、これはまだ理想条件での結果です。

さらに、この中にはたまたま高配当のレースも含まれています。

なので、

「回収率98%のロジックが完成した!」

とは全く思っていません。

ただ、

「もしかしたら、回収率100%を超えるところまで持っていけるかもしれない」

という可能性が少し見えたことは、今回の検証では大きかったと思います。

複雑にするより、使い方を考える

ここまでの検証では、

できるだけ少ない特徴量でスタートを表現できないか?

ということも意識していました。

ただ、実際にやってみると、思ったほど単純ではありませんでした。

一つの特徴量だけでは十分ではない。

複数の特徴量を組み合わせても、6艇のスタート順位を正確に表すのは難しい。

競艇を知っている人からすると、

「そりゃそうでしょ(笑)」

と言われるかもしれません。

ただ、自分にとっては、実際にデータを使って検証してみたからこそ分かったことでした。

一人の選手だけを見ても、6艇で行われるレース全体を十分に表せるわけではない。

一部のグループだけを切り取っても、レース全体の展開を完全には説明できない。

こういうことを一つずつ確認できたのは、今回の検証をやった意味があったと思っています。

ここから、また考え方を変えてみる

ここまでスタート予測を掘り下げてきましたが、少し分析にのめり込みすぎていた部分もありました。

「どうすればスタート順位をもっと当てられるのか?」

を考えているうちに、

「そもそも、これをどこまでやればいいんだ?」

となりそうな感覚もありました(笑)。

そこで一度立ち止まって、

「自分は何を作りたいんだっけ?」

と考え直しました。

答えは、

競艇予想AIを作りたい。

です。

そのためなら、

スタート順位を完璧に当てる必要はありません。

スタートに関する情報を、最終的な予想に役立てられればいい。

そう考えると、今まで作ってきたスタート特性も無駄にはなりません。

むしろ、

「スタートを予測するための材料」

として、今後の予想AIの中に組み込んでいけばいい。

この方向の方が、今の自分にはしっくりきました。

次は、もっと具体的に考えてみる

ここまでで、

「スタート予測を予想AIの補助材料として使う」

という方向が見えてきました。

では、具体的にはどう使えばいいのか。

次は、

「どんなスリットなら1号艇が有利なのか?」

をもう少し具体的に考えてみることにしました。

スリットを12種類に細かく分類して、

それぞれを完璧に予測する必要はないかもしれません。

もっとシンプルに、

「このスリットならイン逃げを狙いやすそう」

「このスリットなら少し怪しい」

「これはよく分からないので見送ろう」

くらいに分けられれば、今の予想ロジックには使えるかもしれません。

ここからは、

スタートを正確に当てるAI

ではなく、

予想に使える情報を作るAI

として考えていきます。

次回は、そのために現在のスリットPatternを整理しながら、

「どんなスリットをイン逃げ有利・不利と考えるのか?」

を決めていきます。

また一つ、実際にデータを見ながら試してみようと思います。

あわせて読みたい

21話では、スタート順位を予測すること自体を目的にするのではなく、スタート予測を既存の予想にどう活用できるかという方向へ考え方を変えています。

そのきっかけになったのが、前回の記事で行った「6艇それぞれのスタート特性を比較して、実際のスタート順位をどこまで予測できるか」という検証でした。

スタート予測の難しさや、そこから開発の目的を改めて考え直していく過程については、前回の記事からご覧ください。

▶ 競艇AI開発日記 第20話|過去のスタート特性から、6艇のスタートを予測してみる

また、そもそも「12種類のスリットPatternを予測することが本当に必要なのか?」と考え始めたきっかけについては、第18話で詳しく書いています。

▶ 競艇AI開発日記 第18話|12種類のスリットを予測することが、本当に必要なのか?

競艇AI開発日記

競艇AI開発日記 第20話|過去のスタート特性から、6艇のスタートを予測してみる

競艇AI開発日記一覧

競艇AI開発日記 第22話|「イン逃げ有利・不利」をどう定義する? スリットから考えてみる

タイトルとURLをコピーしました