前回は、選手ごとの過去のスタート特性と、今回のスタート順位に関係があるのかを調べました。
その結果、
- ST中央値
- ST速い率
- ST遅い率
など、過去のスタート特性を見ることで、今回のスタート順位にもある程度の傾向が見られることが分かりました。
ただ、前回見ていたのは、あくまで1艇ごとの話です。
競艇は6艇でレースを行います。
今回やりたいのは、
「この選手はスタートが速そう」
だけではなく、
「この6艇の中で、誰がスタートで優位になりそうなのか?」
を考えることです。
そこで今回は、6艇それぞれの過去のスタート特性を並べて、実際のスタート順位と比較してみることにしました。
競艇を知らない方に少しだけ説明すると、スタートでは6艇がほぼ同時にスタートラインを通過します。
そのときのスタートタイミング(ST)が速い艇ほど、レース序盤で有利な位置を取りやすくなります。
ただし、実際には「自分が速いか」だけではなく、他の5艇より速いかどうかが重要になります。
今回は、この「6艇の中での相対的なスタート力」を、過去データからどこまで考えられるのかを試してみます。
まずは6艇を並べてみる
前回までは、
「過去STの中央値が速い選手は、今回もスタート順位が上位になりやすいのか?」
といった、1艇単位での確認でした。
今回は、そこから一歩進めます。
1レースに出走する6艇について、
- ST中央値
- ST速い率
- ST遅い率
をそれぞれ並べて、
「この6艇の中では、誰がスタートで優位になりそうなのか?」
を考えてみます。
例えば、
1号艇 ST中央値 0.15
2号艇 ST中央値 0.17
3号艇 ST中央値 0.14
4号艇 ST中央値 0.18
5号艇 ST中央値 0.16
6号艇 ST中央値 0.20
というデータがあれば、
「3号艇が一番速そうだな」
という評価ができます。
ただ、実際のレースではST中央値だけでスタートが決まるわけではありません。
そこで、
複数のスタート特性を組み合わせたら、もう少し分かるのではないか?
と考えました。
最初は3つの特徴量をそのまま比べてみる
今回使ったのは、前回も確認した3つの特徴量です。
ST中央値
過去のスタートタイミングの中央値です。
小さいほど、過去に速いスタートをしている傾向があります。
ST速い率
過去のスタートの中で、速いスタートをどれくらい出しているかを表します。
こちらは数字が大きいほど、速いスタートが多いということになります。
ST遅い率
逆に、遅いスタートがどれくらいあるかを表します。
こちらは数字が小さいほど、遅いスタートが少ないという見方になります。
前回の検証では、それぞれ単独でも今回のスタート順位との関係が見られました。
ならば、
ST中央値
ST速い率
ST遅い率
↓
6艇を比較
↓
スタート力を評価
とすれば、単独の特徴量よりも良くなるのではないか。
そんな期待はありました。
とはいえ、この時点では、
「これでいけそう」
という確信があったわけではありません。
少ない特徴量で6艇のスタート力を表せたらラッキー、くらいの感覚です。
まずは、とりあえずやってみることにしました。
単独で見るよりは良くなりそう
最初に、それぞれの特徴量だけで6艇を順位付けした場合を確認しました。
結果は、
- ST中央値:1位一致率 24.1%
- ST速い率:1位一致率 22.5%
- ST遅い率:1位一致率 24.9%
でした。
ここでいう「1位一致率」は、
予測したスタート順位1位の艇と、実際のスタート順位1位の艇が一致した割合
です。
100レースあれば、だいたい24~25レース程度で一致するという結果です。
正直、この数字を見たときは、
「やっぱり単独では難しいな」
という印象でした。
ただ、前回の検証で、
「過去のスタート特性には、今回のスタートを考える材料がありそう」
ということは確認できています。
ならば、1つだけを見るのではなく、3つを組み合わせてみる価値はありそうです。
でも、思ったほど精度は出なかった
ここで3つの特徴量を組み合わせることにしました。
最初に試したのは、かなりシンプルな方法です。
それぞれの特徴量について6艇の順位をつけて、
ST中央値の順位
ST速い率の順位
ST遅い率の順位
↓
3つの順位を平均
↓
総合評価
という方法です。
例えば、
1号艇
中央値:2位
速い率:1位
遅い率:3位
→ 平均 2.0位
のようにして、3つの特徴量をまとめました。
「1つの特徴量よりは、複数を組み合わせた方が良くなるだろう」
という期待はありました。
ところが、結果はそこまで大きく改善しませんでした。
実際のスタート1位艇が、この総合評価で、
- 1位相当:26.8%
- 2位以内:47.5%
- 3位以内:64.9%
- 4位以内:79.2%
という結果でした。
「3位以内に入る」という意味では、それなりに使えそうです。
ただ、
「この艇がスタート1位になる」と高い精度で絞り込めるほどではありません。
というのが正直な感覚でした。
順位にして平均してみる
ここで、少し気になったことがあります。
さきほどの方法では、元の数字をそのまま使わず、すべて「1位~6位」に変換しています。
例えば、
0.150
0.151
という、かなり近い数字でも、
1位
2位
になります。
一方で、
0.150
0.220
のように、大きな差があっても、
1位
2位
です。
つまり、
実際にはかなり大きな差がある2艇と、ほとんど差がない2艇が、同じ「1位・2位」という情報になってしまう
わけです。
これは、やってみる前にはあまり意識していませんでした。
実際に結果を見てから、
「確かに、これだと元の情報がかなり埋もれるな」
と気づきました。
そこで、
順位に変換するのではなく、元の数値を使って評価できないか?
と考えました。
順位ではなく実値を使ってみる
次に試したのが、
実値を比較可能なスコアに変換してから平均する方法
です。
考え方としては、
ST中央値
ST速い率
ST遅い率
↓
6艇内で比較可能なスコアに変換
↓
3つを均等に合成
↓
6艇を総合評価
というものです。
ここでも、
「これなら順位化より良くなるかもしれない」
という期待はありました。
ただ、実際にやってみると、思ったほど大きな改善はありませんでした。
結果はどうだった?
| 指標 | 順位化→平均 | 実値スコア化→平均 |
| 有効レース | 995 | 994 |
| 実際1位艇が評価1位 | 26.8% | 24.9% |
| 実際1位艇が評価2位以内 | 47.5% | 45.0% |
| 実際1位艇が評価3位以内 | 64.9% | 64.0% |
| 実際1位艇が評価4位以内 | 79.2% | 78.2% |
| 実際上位3艇の平均評価順位 | 3.116 | 3.181 |
| 平均順位誤差 | 1.669 | 1.667 |
結果として、
実値を使ったからといって、明確に精度が上がったわけではありませんでした。
むしろ、実際1位艇が評価1位になる割合は、
26.8% → 24.9%
と下がっています。
一方で、平均順位誤差は、
1.669 → 1.667
と、ほんの少しだけ改善しています。
ただ、この程度の差であれば、
「実値スコア化の方が明らかに優れている」
とは言えません。
ここで一つ、面白いことも分かった
今回の検証で、
「この方法では精度が出なかった」
だけではなく、
過去のスタート特性には、それなりに情報が含まれている
ということも改めて確認できました。
実際のスタート1位艇を、
評価上位3艇以内に入れられた割合は約64%
でした。
つまり、
6艇の中から実際にスタート1位になった艇をピンポイントで当てるのは難しいものの、
「このあたりの艇がスタートで上位に来そう」
というところまでは、ある程度絞れているとも考えられます。
これは個人的にも、
「まったく使えないわけではないんだな」
という感覚でした。
一方で、
「思ったほどの精度はない」
というのも同時に感じました。
今回の検証で分かったこと
今回の検証を整理すると、
① 過去のスタート特性には情報がある
前回までの検証と合わせて、
- ST中央値
- ST速い率
- ST遅い率
には、今回のスタートを考えるための情報が含まれていそうです。
② ただし、単純な組み合わせでは十分ではない
3つを組み合わせれば大きく精度が上がる、という結果にはなりませんでした。
③ 順位化には情報を圧縮してしまう問題があった
今回実際にやってみたことで、
「順位に変換することで、元の数値差が消えてしまう」
という問題にも気づきました。
④ 実値を使っても劇的には改善しなかった
そこでスコア化も試しましたが、順位化より明確に優れている結果にはなりませんでした。
ここまでやってみると、
「過去のスタート特性から、6艇のスタート順位を正確に予測する」
というのは、思っていたより難しそうです。
スタート予測を続ける意味を考える
ここで、少し考える必要が出てきました。
そもそも今回、なぜスタート順位を予測しようとしているのか。
最終的に作りたいのは、
スタート順位を当てるAIではありません。
自分が作りたいのは、
競艇のレース結果を予測して、買う価値のあるレースや買い目を判断できるAI
です。
競艇を題材にしていますが、やっていること自体は、
過去に分かっている情報から、これから起こる事象を予測できるか?
というAI開発の試行錯誤です。
その中で、
「スタート」はレース展開を考えるための一つの要素です。
だから、
スタート順位を正確に当てること自体が目的になってしまうと、本来の目的から少しずれてしまいます。
今回の検証結果を見て、
「ここからさらに数%の精度を上げるために、スタート順位予測だけを延々と掘り下げるのはどうなんだろう?」
と考えるようになりました。
もちろん、今回使った、
- ST中央値
- ST速い率
- ST遅い率
などが無駄になるわけではありません。
これらは、
「この艇はスタートで優位になりやすそう」
という判断材料として、今後の予想AIに組み込める可能性があります。
つまり、
スタート予測AIを完成させる
ことにこだわるのではなく、
過去のスタート特性
↓
各艇の評価材料
↓
レース結果の予測
↓
買い目の判断
という使い方もできるわけです。
今回の検証を一度区切る
今回の検証を通して、
過去のスタート特性から、今回のスタートをある程度考えることはできそう。
一方で、
6艇のスタート順位を高い精度で当てるのは、簡単ではない。
というところまで分かりました。
もちろん、
「30%くらいが限界なのか?」
という疑問は残ります。
ただ、今回の検証だけで、
「スタート1位予測の上限は30%」
と決めつけることはできません。
使える特徴量も、まだあります。
モデルを使った予測も、まだ試していません。
なので、スタート予測そのものに限界があると断定するつもりもありません。
ただ、
今の段階で、ここを延々と深掘りする必要があるのか?
ということは、一度考えるべきだと思いました。
そして、この検証を区切って、
「そもそもAIで何を予測したいのか?」
という本来の目的に戻って考えることにしました。
次回予告
ここまで、
「過去のスタート特性から、今回のスタートを予測できるのか?」
というところを検証してきました。
ある程度の関係は見つかりました。
でも、スタート順位を当てることが最終目的ではありません。
次は一度立ち止まって、
「自分は、この競艇AIで何を予測したいのか?」
を改めて整理します。
的中率を高めることなのか。
それとも、
「買う価値のあるレースを見つけること」
なのか。
ここを整理してから、今後のAI開発の方向を決めていきます。
あわせて読みたい
第19話|過去のスタート特性から、今回のスタートを考えてみる
前回は、選手ごとの過去のスタート特性と、今回のスタート順位に関係があるのかを検証しました。
今回はそこから一歩進めて、6艇それぞれのスタート特性を並べ、実際のスタート順位をどこまで考えられるのかを試しています。
1艇単位の分析から、6艇の相対比較へ。
その過程で見えてきたことや、スタート予測そのものを考え直すきっかけになった検証をまとめています。
▶ 競艇AI開発日記 第19話|過去のスタート特性から、今回のスタートを考えてみる
