はじめに
回収率100%超えウオオオーーーーー!!!!
失礼、取り乱しました。
前回までの話
- 中央競馬の過去のデータを収集し、DNNやCNNで1着を当てるよう学習させたが、精度が20%程度しか出なかった
- 低精度の原因を考え直したが、変わらずダメ
- データの項目を見直し、相関関係などを見たが、人気や単勝オッズがそれなりに相関していること以外あまり有益な情報が得られなかった
今回の話
アプローチを変えた。
レース単位で入力するのではなく、馬単位で入力した。
例えば以下の表の場合、1行1件のデータとして入力し、着順を予想させた。
着順 | 馬番 | 単勝オッズ | ... |
---|---|---|---|
15 | 1 | 103.9 | ... |
7 | 2 | 21.2 | ... |
3 | 3 | 23.9 | ... |
... | ... | ... | ... |
また、今までは1着を当てる方向で学習させていたが、掲示板入着を当てるようにした。
要は掲示板に入るか入らないかの2値分類にした。
掲示板入着を当てられれば、三連単や三連複の的中も狙えるのでお得。
学習にあたっては、XGBoostを採用した。
こういったデータに対する実績が高いから。
パラメータは以下の通り
- max_depth: 2
- objective: multi:softmax
- nthread: 4
- eta: 1e-2
- 学習回数: 1000
学習データは2008年~2022年の中央競馬・芝レースに限り、1勝以上のレースのみとした。
テスト用のデータは2023年以降とし、その他条件は学習データと同じ。
これで学習させた結果、各変数の影響力は以下のグラフとなった。
単勝オッズと人気が重要なのは分かるが、なんと2走順位が重要という結果に。
前走よりも2走前の方が重要とは、どう解釈すれば良いんだ?(誰か教えて)
各種指標は以下の通り。(テストデータ)
目的変数 | precision | recall | f1-score | 件数 |
---|---|---|---|---|
0 | 0.66 | 0.54 | 0.60 | 7,913 |
1 | 0.74 | 0.82 | 0.78 | 12,454 |
目的変数が0、つまり掲示板入着のrecallが低いのが気になるが、冒頭のとおり回収率が十分なので気にしない。
逆に板外の予測精度は高めだが、そもそもデータが偏ってるので、「とりあえず1と言っときゃいいだろ」となってる可能性は否定できない。
なお、予測精度は72%。
回収率
作ったAIが0(掲示板入着)だと判断した馬を買うシミュレーションで計算した。
仮に5頭を0だと判断した場合、単勝は5頭分の500円、三連単は5P3通りなので6,000円、三連複は5C3通りなので1,000円を賭けることになる。
それぞれ賭けて、実際のオッズで払戻金を計算した。
学習データにおいては以下の通り。
回収率 | 馬券代 | 払戻金 | |
---|---|---|---|
単勝 | 16,822.38% | 6,012,800 | 1,011,496,000 |
三連単 | 240,440,354.26% | 32,970,600 | 14,457,197,621,000 |
三連複 | 9,011,194.07% | 2,433,100 | 219,251,363,000 |
テストデータの場合は以下の通り。
回収率 | 馬券代 | 払戻金 | |
---|---|---|---|
単勝 | 83,734.11% | 648,400 | 542,932,000 |
三連単 | 20,887,560.76% | 3,557,400 | 135,434,944,000 |
三連複 | 778,158.11% | 266,900 | 2,076,904,000 |
どちらのデータでも、回収率が100%どころじゃないことが分かる。
これで爆勝ち間違いなしや!w
まとめ
良い勉強になりました。
焚き付けてくれた友人に感謝します。
今後は、今回扱っていない新馬戦やダート、地方競馬、あるいは未来のレースで試してみて、調子良さそうならweb公開とか考えてみます。