先日、競艇データを機械学習して着順を予想する記事をアップしました。
回収率が100%を超える日も結構あり、機械学習が予想に使えるんだなと肌で感じられましたね。
舟券の買い方は、着順を1着から3着まで予想し
- 単勝
- 2連複
- 2連単
- 3連複
- 3連単
の舟券を1つずつ買うってスタイル。
でも、着順を予想したときに選手が1着になる確率にはバラつきがあります。
1人だけとてもうまい選手がいるレースと、みんなが同じくらいの能力のレースでは出てくる確率にちがいがでてきるのは想像がつきやすいですよね。
そこで、その1着になる確率を使って機械学習をすれば、的中率の上がる買い方になるんじゃないかと思いました。
今回の記事は買い方を機械学習すれば的中率が上がるのかどうか検証します。
目標は「単勝の的中率アップ」です。
検証方法
買い方の機械学習をするにあたって考えるべきことは次の2つでした。
- どのデータを買い方の予想に使うのか?
- 特徴量と目的変数をどうするのか?
この検証のキモとなる部分なのでしっかり説明したいと思います。
どのデータを買い方の予想に使うのか?
どのデータを予想に使うのか説明する前に、着順予想モデルからどのように着順を予想しているのかカンタンに説明しますね。
予想するレースのデータをpredict_probaでモデルに入力すると、クラスに入る確率が計算できます。
今回はクラス分けをつぎのようにしました。
着順 | 目的変数 |
1着 or 2着 | 0 |
3着 or 4着 | 1 |
5着 or 6着 | 2 |
つまり、レースに出場する選手が「1着か2着」「3着か4着」「5着か6着」に入る確率を出してくれるわけです。
たとえばレースデータXをpredict_probaで予想すると次のような値が返ってきます。
#レースデータXをモデル(model)で予想する
probs = model.predict_proba(X)
probs
-->
#クラス0の確率 クラス1の確率 クラス2の確率
#[[0.75731473 0.16495449 0.07773078] #1号艇の選手
# [0.31320561 0.43599451 0.25079988] #2号艇の選手
# [0.4685763 0.38863161 0.1427921 ] #3号艇の選手
# [0.09761924 0.53397777 0.36840299] #4号艇の選手
# [0.12829839 0.41957989 0.45212172] #5号艇の選手
# [0.19820841 0.50386806 0.29792353]] #6号艇の選手
1番左上(1列目の1行目)の値「0.75731473」は「1号艇の選手が2着以内に入る確率」ってことですね。
着順を予想するときにはprobsの1列目(1着か2着になる確率)を使って、値の大きい選手から1着予想、2着予想…としています。
さきほど書いた「1着になる確率がレースによってバラバラ」というのはprobsの値が違うからこそです。
なので今回、買い方の機械学習にはprobsの値を使うことにしました。
特徴量と目的変数をどうするのか?
probsの1列目の値が大きい選手から順にA,B,C,D,E,Fとします。
さきほどの例だと「A=1号艇、B=3号艇、C=2号艇、D=6号艇、E=5号艇、F=4号艇」ですね。
こうしたときに特徴量を次のように設定しました。
- Aがクラス0に入る確率
- Bがクラス0に入る確率
- Cがクラス0に入る確率
- Dがクラス0に入る確率
- Aがクラス1に入る確率
- Bがクラス1に入る確率
- Cがクラス1に入る確率
- Dがクラス1に入る確率
- Aがクラス2に入る確率
- Bがクラス2に入る確率
- Cがクラス2に入る確率
- Dがクラス2に入る確率
EとFを使わなかった理由は、結果がない可能性があるから(フライングや出遅れなど)と1着予想にはあまり影響を与えないからです。
目的変数は「1着予想が当たっているかどうか」としました。
つまりAが1着の場合は「1」、そうでない場合は「0」ってこと。
こうやって設定した特徴量と説明変数からLightGBMによる機械学習をしました。
期間は次のようにして検証してみます。
2021年7月1日 〜 9月4日 | 着順を予想するモデル作成 |
2021年9月5日 〜 9月8日 | 買い方を予想するモデル作成 |
2021年9月9日 〜 9月11日 | 2つのモデルを使って的中率と回収率を計算 |
まず着順予想モデルで着順を予想し、買い方予想モデルで「1着予想が1着になる確率が高い」と判断されれば買うというスタイルで的中率と回収率を計算しました。
検証結果
検証した結果は次の通りです。
9月9日 | 的中率(モデルなし) | 的中率(モデルあり) | 回収率(モデルなし) | 回収率(モデルあり) |
単勝 | 61.81% | 69.88%(+8.07%) | 100.56% | 102.77% |
2連複 | 29.17% | 34.94%(+5.77%) | 78.19% | 87.35% |
2連単 | 23.61% | 27.71%(+4.10%) | 86.46% | 88.55% |
3連複 | 20.83% | 25.30%(+4.47%) | 72.64% | 96.14% |
3連単 | 6.25% | 7.23%(+0.98%) | 52.22% | 67.35% |
9月10日 | 的中率(モデルなし) | 的中率(モデルあり) | 回収率(モデルなし) | 回収率(モデルあり) |
単勝 | 58.33% | 67.71%(+9.38%) | 99.38% | 101.15% |
2連複 | 32.64% | 38.54%(+5.90%) | 77.29% | 91.88% |
2連単 | 20.83% | 27.08%(+6.25%) | 62.08% | 77.60% |
3連複 | 24.31% | 30.21%(+5.90%) | 83.96% | 100.63% |
3連単 | 10.42% | 14.58%(+4.16%) | 81.88% | 118.75% |
9月11日 | 的中率(モデルなし) | 的中率(モデルあり) | 回収率(モデルなし) | 回収率(モデルあり) |
単勝 | 59.72% | 71.79%(+12.07%) | 88.26% | 98.21% |
2連複 | 32.64% | 39.74%(+7.10%) | 83.12% | 91.67% |
2連単 | 25.00% | 32.05%(+7.05%) | 85.21% | 97.95% |
3連複 | 23.61% | 24.36%(+0.75%) | 80.90% | 75.38% |
3連単 | 9.72% | 11.54%(+1.82%) | 69.17% | 68.21% |
目標としていた「単勝の的中率アップ」は見事に達成できました。
しかも回収率もあがるオマケつき。
びっくりですね。
1着予想が1着になる確率が高いってことは、いわゆるテッパンのレースってこと。
なので的中率があがっても回収率はむしろ下がるかなって思っていたので嬉しい誤算ですね。
こんな感じで3連単の的中率があげられれば回収率も上向くんだけどな….
いろいろ試していきたいですね。
まとめ
今回は競艇で舟券の買い方を機械学習すれば的中率がどうなるのか検証してみました。
着順予想モデルからpredict_probaで返ってくる「クラスに分けられる確率」を使って、1着予想した選手が1着になったかどうかを目的変数としてLightGBMの機械学習をかけます。
着順予想モデルには長い期間のデータを、買い方予想モデルには4日間のデータを使いました。
2021年7月1日 〜 9月4日 | 着順を予想するモデル作成 |
2021年9月5日 〜 9月8日 | 買い方を予想するモデル作成 |
2021年9月9日 〜 9月11日 | 2つのモデルを使って的中率と回収率を計算 |
結果は大成功、的中率が8%から12%もアップしました。
しかも回収率もアップするオマケつきです。
今回のような検証記事は僕が個人的に好きなジャンルなのでこれからもアップしていきたいと思います。
ではまた。
コメント