Chapter 06無料公開

実際に賭けてみた結果・・・

この章では実際に競馬予想AIを使って賭けてみましょう。(この章ではoptunaを使う前のモデルを使っています)

前の章までは回収率をシミュレーションするため訓練データとテストデータに分けて、訓練データのみを機械学習モデルに入れていましたが、実際に使うときにはなるべく多くのデータ&最近のデータを使いたいので、過去レース結果データ全体を使います。
参考動画:競馬予想AIシリーズ第19回後編

#目的変数は「3着以内に入ったかどうか」の0or1データを持った'rank'
X = r.data_c.drop(['rank', 'date', '単勝'], axis=1)
y = r.data_c['rank']

#LightGBMのハイパーパラメータ
params = {
    'num_leaves': 4,
    'n_estimators': 80,
    'class_weight': 'balanced',
    'random_state': 100
}

#予測モデル作成&学習
lgb_clf = lgb.LGBMClassifier(**params)
lgb_clf.fit(X.values, y.values)

#自作したModelEvaluatorクラスのオブジェクトを作成
me = ModelEvaluator(lgb_clf, 'return_tables.pickle')

それでは、実際に例として2020年8月9日の札幌開催のレースのデータを入れてみましょう。st.data_cという変数にスクレイピング&前処理した1レース目から12レース目までの出馬表データが入っています。

#馬が勝つ確率を予測
pred = me.predict_proba(st.data_c.drop(['date'], axis=1))

#予測結果を表に結合
pred_table = st.data_c[['馬番']].copy()
pred_table['pred'] = pred

#確率が高い順に出力
pred_table.sort_values('pred', ascending=False)


確率の最大値と最小値がちょうど1と0になっているのは、min_maxスケーリングがかかっているためです。実はこれは回収率シミュレーションのときに、for文でthresholdを回しやすいように便宜的につけているだけなので、今後外す予定です。

シミュレーションでは単勝で賭けることを想定していたので、とりあえずpredの値が高い、上から5つを単勝で賭けることにしましょう。1行目、つまり機械学習モデルが一番「勝つだろう」と予測しているのはレースID:202001010607(7レース目)の馬番5の馬ですね。レース結果ページで確認してみると・・・

見事に的中しています!さらに2行目、202001010607(6レース目)のレース結果を見てみると・・・

なんと、3番人気にもかかわらず、単勝で的中しています!!

それ以降のデータを見てみると、3番目と5番目は外れていますが、4番目は2番人気を単勝で的中させています。

今後、特徴量の追加や馬券の買い方の最適化などでさらに回収率を上げていけば、かなり期待できそうな競馬予想モデルだと思います!