競馬AI開発メモ:これまで作った特徴量をまとめて使うとAIの予測精度は上がるのか?

競馬AI開発

はじめに

これまでの競馬AI開発メモでは、脚質・展開圧力・距離適性・馬場適性・レース間隔・馬体重・騎手変更の特徴量を個別に検証してきました。 個別検証ではそれぞれ一定の改善が見られましたが、「全部まとめたら本当に精度は上がるのか?」という疑問が残ります。

今回は、共通特徴量テーブル features_v1 を使い、すべての特徴量をまとめたモデルの予測精度を、AUC だけでなく NDCG・単勝シミュレーション・キャリブレーションなど多角的に検証します。

これまで作ってきた特徴量

グループ内容
脚質 (running_style)過去走の通過順から前方指数・脚質割合などを算出
展開圧力 (pace_pressure)同レース内の先行馬頭数・圧力スコアなど
距離適性 (distance_aptitude)同距離・同距離帯での過去成績
馬場適性 (going_aptitude)同馬場状態・道悪での過去成績
レース間隔 (race_interval)前走からの日数・間隔区分別成績
馬体重 (body_weight)当日体重・変動・過去平均との比較
騎手変更 (jockey_change)騎手乗り替わり・騎手成績・馬×騎手成績

features_v1 とは何か

features_v1 は上記の特徴量をすべて統合した共通テーブルです。 レース前に使える過去走ベースの特徴量のみが含まれ、今走の着順・タイム・上り等の結果情報は含みません。 shift(1) + rolling / expanding で作成されており、リーク(未来情報の混入)を防いでいます。

馬体重関連の特徴量は馬体重発表後に使えるものとして扱います。

今回確認すること

  • 個別検証で効いた特徴量は、全部まとめても効くのか
  • 人気を入れると、手作り特徴量の効果は小さくなるのか
  • 人気なしモデルでは features_v1 の効果が大きいか
  • 人気ありモデルでは features_v1 の効果が残るか
  • NDCG で見ても改善しているか
  • 単勝シミュレーションで見ても改善しているか
  • 高オッズ帯の過大評価が悪化していないか
  • どの特徴量グループが一番効いているか

使用データ

項目
データソースfeatures_v1 + result_table
学習期間 (train)2017〜2022
検証期間 (valid)2023〜2023
評価期間 (test)2024〜2024
学習行数787,381
検証行数136,354
評価行数138,372
評価レース数13,677
目的変数1着 (1着=1, それ以外=0)
除外帯広(ばんえい競馬)
分割方法時系列分割(ランダム分割は不使用)

比較するモデル

LightGBM の二値分類モデル (objective=binary, early stopping on valid) を使用。 すべてのモデルでハイパーパラメータを揃えています。

表1: 比較モデル一覧

モデル名使用特徴量グループ人気特徴量数
A: 基本特徴量のみ基本なし9
B: 基本+人気基本, 人気あり10
C: 基本+脚質基本, 脚質なし21
D: 基本+展開圧力基本, 展開圧力なし19
E: 基本+距離適性基本, 距離適性なし21
F: 基本+馬場適性基本, 馬場適性なし20
G: 基本+レース間隔基本, レース間隔なし23
H: 基本+馬体重基本, 馬体重なし29
I: 基本+騎手変更基本, 騎手変更なし21
J: 全部入り(人気なし)基本, 脚質, 展開圧力, 距離適性, 馬場適性, レース間隔, 馬体重, 馬体重欠損, 騎手変更なし100
K: 全部入り(人気あり)基本, 脚質, 展開圧力, 距離適性, 馬場適性, レース間隔, 馬体重, 馬体重欠損, 騎手変更, 人気あり101

評価指標

AUC / logloss / Brier

二値分類の標準的な指標です。AUC は高いほど良く、logloss / Brier は低いほど良い結果です。

NDCG

レース内のランキング精度を測る指標です。1着=3, 2着=2, 3着=1, 4着以下=0 の relevance で計算しています。 人気順 NDCG との差分 (delta) がプラスなら、モデルが市場人気より良いランキングを出せていることを意味します。

単勝シミュレーション

各レースでモデル予測1位を1頭選び、単勝100円を購入したと仮定するシミュレーションです。参考指標として回収率・最大ドローダウン・最大連敗を算出しています。

EV候補評価

EV = 予測勝率 × 単勝オッズ の期待値が閾値以上の馬を候補として評価します。

オッズ帯別キャリブレーション

単勝オッズ帯ごとの予測勝率と実勝率の差 (calibration gap) を確認します。

人気帯別キャリブレーション

人気帯ごとの予測勝率と実勝率の差を確認します。

条件別評価

race_labels_v1 を使い、波乱レース・堅いレースなどの条件別にモデル精度を評価します(入力特徴量には使用していません)。

特徴量重要度

LightGBM の feature importance (gain / split) を確認します。

結果

表2: 通常指標 (test)

モデル件数正例率AUCloglossBrier
A: 基本特徴量のみ138,3729.89%0.61800.31500.0878
B: 基本+人気138,3729.89%0.84500.24450.0717
C: 基本+脚質138,3729.89%0.74520.28610.0816
D: 基本+展開圧力138,3729.89%0.73470.28960.0824
E: 基本+距離適性138,3729.89%0.73160.28980.0822
F: 基本+馬場適性138,3729.89%0.72080.29300.0829
G: 基本+レース間隔138,3729.89%0.70730.29760.0842
H: 基本+馬体重138,3729.89%0.68220.30280.0851
I: 基本+騎手変更138,3729.89%0.73500.28890.0820
J: 全部入り(人気なし)138,3729.89%0.78930.27030.0780
K: 全部入り(人気あり)138,3729.89%0.84780.24270.0711

表3: NDCG比較 (test)

モデルNDCG@1NDCG@3NDCG@5pop NDCG@3delta@3モデル勝率
A: 基本特徴量のみ0.24370.35070.45310.6486-0.297918.19%
B: 基本+人気0.55300.64850.73060.6486-0.00010.16%
C: 基本+脚質0.41560.52440.61940.6486-0.124223.48%
D: 基本+展開圧力0.36570.48020.57910.6486-0.168422.64%
E: 基本+距離適性0.40040.50910.60340.6486-0.139523.63%
F: 基本+馬場適性0.38560.49120.58740.6486-0.157322.67%
G: 基本+レース間隔0.35130.46540.56550.6486-0.183221.68%
H: 基本+馬体重0.32230.42990.52980.6486-0.218621.25%
I: 基本+騎手変更0.40590.51130.60370.6486-0.137223.49%
J: 全部入り(人気なし)0.44680.55770.65140.6486-0.090923.75%
K: 全部入り(人気あり)0.55300.64780.73020.6486-0.00082.61%

表4: 単勝シミュレーション (test)

モデル戦略ベット数的中数的中率投資額払戻額回収率最大DD最大連敗
A: 基本特徴量のみmodel_top113,6772,32717.01%1,367,700106294077.72%30650045
A: 基本特徴量のみpopularity_top113,6776,15144.97%1,367,700110690080.93%26096014
A: 基本特徴量のみmodel_top1_prob_ge_0.301424330.28%14,2001178082.96%317011
A: 基本特徴量のみmodel_top1_odds_ge_5.08,8555055.70%885,50066344074.92%231140111
A: 基本特徴量のみmodel_top1_odds_ge_10.06,4281933.00%642,80045062070.10%202000217
B: 基本+人気model_top113,6776,15144.97%1,367,700110690080.93%26096014
B: 基本+人気popularity_top113,6776,15144.97%1,367,700110690080.93%26096014
B: 基本+人気model_top1_prob_ge_0.3013,6136,13845.09%1,361,300110404081.10%25742013
B: 基本+人気model_top1_odds_ge_5.024520.83%2,4002680111.67%110011
B: 基本+人気model_top1_odds_ge_10.0100.00%10000.00%01
J: 全部入り(人気なし)model_top113,6774,77034.88%1,367,700103558075.72%33262020
J: 全部入り(人気なし)popularity_top113,6776,15144.97%1,367,700110690080.93%26096014
J: 全部入り(人気なし)model_top1_prob_ge_0.306,7602,96543.86%676,00053598079.29%14044017
J: 全部入り(人気なし)model_top1_odds_ge_5.02,4462118.63%244,60016397067.04%8169068
J: 全部入り(人気なし)model_top1_odds_ge_10.0724314.28%72,4004833066.75%2600095
K: 全部入り(人気あり)model_top113,6776,15244.98%1,367,700110793081.01%25993014
K: 全部入り(人気あり)popularity_top113,6776,15144.97%1,367,700110690080.93%26096014
K: 全部入り(人気あり)model_top1_prob_ge_0.3013,0155,96645.84%1,301,500106158081.57%24008016
K: 全部入り(人気あり)model_top1_odds_ge_5.028621.43%2,8003240115.71%110011
K: 全部入り(人気あり)model_top1_odds_ge_10.0100.00%10000.00%01

表5: EV候補評価 (test)

モデルEV閾値件数予測勝率実勝率cal.gap平均オッズ回収率
J: 全部入り(人気なし)>=1.075,5338.66%3.40%0.052684.163.84%
J: 全部入り(人気なし)>=1.169,9978.49%3.07%0.054287.663.21%
J: 全部入り(人気なし)>=1.265,0568.34%2.77%0.055690.962.70%
K: 全部入り(人気あり)>=1.053,3927.87%4.56%0.033194.162.86%
K: 全部入り(人気あり)>=1.144,5887.09%3.75%0.0335102.562.15%
K: 全部入り(人気あり)>=1.237,3686.36%3.08%0.0328110.859.88%

表6: オッズ帯別キャリブレーション (test, J: 全部入り人気なし)

オッズ帯件数予測勝率実勝率cal.gaploglossBrier回収率
1.0-1.97,21133.29%56.83%-0.23540.84680.308582.36%
2.0-2.97,86323.07%32.30%-0.09240.70570.240977.54%
3.0-4.912,86017.54%20.19%-0.02640.54260.171176.57%
5.0-9.920,68012.53%11.43%0.01100.38510.108178.51%
10.0-19.920,8498.87%5.67%0.03200.23910.058178.32%
20.0-49.927,0776.09%2.56%0.03530.14080.028478.80%
50.0+41,8322.90%0.50%0.02400.04790.006348.21%

表7: 人気帯別キャリブレーション (test, J: 全部入り人気なし)

人気帯件数予測勝率実勝率cal.gaploglossBrier回収率
113,67727.40%44.97%-0.17580.77960.275380.93%
2-327,35316.26%16.44%-0.00190.47030.143475.32%
4-527,3299.57%6.57%0.03000.25820.065471.55%
6-949,8815.04%2.25%0.02790.11890.024069.07%
10+20,1322.24%0.57%0.01670.04390.006351.01%

表8: 条件別評価 (test)

モデル条件レース数AUCNDCG@3delta@3sim ROIEV>=1.0 gap高オッズ帯gap
J: 全部入り(人気なし)全レース13,6770.78930.5577-0.090975.72%0.05260.0293
J: 全部入り(人気なし)1番人気が勝ったレース6,1510.91730.7184-0.1557101.96%0.08170.0533
J: 全部入り(人気なし)1番人気が負けたレース7,5260.68130.4264-0.037854.27%0.02710.0088
J: 全部入り(人気なし)6番人気以下が勝ったレース1,2370.43210.20370.014623.71%-0.0352-0.0870
J: 全部入り(人気なし)8番人気以下が勝ったレース4180.34240.1576-0.01773.61%-0.0501-0.0853
J: 全部入り(人気なし)単勝10倍以上が勝ったレース2,0840.49360.25210.020423.26%-0.0248-0.0874
J: 全部入り(人気なし)単勝20倍以上が勝ったレース9020.39670.1970-0.00969.79%-0.0442-0.0872
J: 全部入り(人気なし)人気順NDCG@3が低いレース3,4470.59100.28270.039939.09%0.0093-0.0214
K: 全部入り(人気あり)全レース13,6770.84780.6478-0.000881.01%0.03310.0077
K: 全部入り(人気あり)1番人気が勝ったレース6,1510.99960.8735-0.0006179.80%0.03080.0331
K: 全部入り(人気あり)1番人気が負けたレース7,5260.71990.4633-0.00100.26%0.0355-0.0139
K: 全部入り(人気あり)6番人気以下が勝ったレース1,2370.37320.1871-0.00190.12%0.0216-0.1096
K: 全部入り(人気あり)8番人気以下が勝ったレース4180.24940.1715-0.00390.36%0.0269-0.1068
K: 全部入り(人気あり)単勝10倍以上が勝ったレース2,0840.48370.23370.00200.17%-0.0166-0.1089
K: 全部入り(人気あり)単勝20倍以上が勝ったレース9020.36210.2048-0.00180.17%-0.0332-0.1079
K: 全部入り(人気あり)人気順NDCG@3が低いレース3,4470.61090.24730.00440.12%0.0333-0.0447

表9: 特徴量重要度 (J: 全部入り人気なし)

上位30特徴量 (gain)

順位特徴量gainsplit
1front_index_rank_in_race104340.2136
2front_index_gap_to_top103294.1378
3past3_avg_rank98062.8410
4past3_top3_rate47237.762
5horse_jockey_top3_rate_raw35678.3407
6jockey_top3_rate_raw33111.9505
7past5_avg_rank30734.0246
8jockey_win_rate_raw28850.6364
9same_distance_bin_avg_rank27038.9355
10race_avg_front_index26632.2675
11pace_pressure_score26419.8513
12body_weight_percentile_in_race23847.4481
13same_distance_avg_rank20458.9428
14front_index_percentile_in_race18955.2215
15jockey_win_rate_smoothed_a518279.8281
16recent_avg_interval_517224.2519
17horse_jockey_win_rate_raw16202.6312
18past5_top3_rate15159.276
19同走馬の数14638.3449
20days_since_last_run11219.6524
21race_max_front_index10205.1380
22distance_diff_from_past_avg10081.5461
23same_distance_bin_win_rate9289.6241
24recent_avg_interval_38565.2399
25same_distance_bin_top3_rate7345.1227
26wet_going_runs7228.1284
27style_stability7143.8391
28same_going_avg_rank6991.5335
29距離6493.6282
30wet_going_avg_rank6322.6325

特徴量グループ別重要度 (gain)

グループ特徴量数gain合計gain平均
展開圧力10299248.329924.8
脚質12219150.518262.5
騎手変更12141177.711764.8
距離適性1291413.87617.8
馬体重1771841.14225.9
レース間隔1451062.43647.3
基本942451.44716.8
馬場適性1136335.03303.2
馬体重欠損3135.345.1

表10: Ablation 結果 (全部入り人気なしから1グループずつ除外)

除外グループ特徴量数AUCloglossBrierNDCG@3
(なし=全部入り)1000.78930.27030.07800.5577
馬体重830.78740.27100.07820.5564
馬体重欠損970.78910.27030.07800.5587
距離適性880.78720.27120.07830.5541
馬場適性890.78910.27030.07800.5578
騎手変更880.78130.27340.07870.5459
展開圧力900.77260.27670.07960.5559
レース間隔860.78770.27090.07820.5555
脚質880.78490.27180.07830.5517

考察

全部入り特徴量で精度は上がったか

baseline (A) の AUC は 0.6180 に対し、全部入り人気なし (J) は 0.7893 (+0.1713) でした。

人気なしモデルでの効果

人気を使わないモデルでは、features_v1 の特徴量をまとめることで明確な改善が見られました。

人気ありモデルでの効果

人気あり baseline (B) の AUC は 0.8450 に対し、全部入り人気あり (K) は 0.8478 (+0.0027) でした。 人気を入れても手作り特徴量の追加効果が残っています。

NDCG やシミュレーションでも改善したか

NDCG@3 は baseline (A) 0.3507 → 全部入り (J) 0.5577 (+0.2071) でした。

高オッズ帯の過大評価は悪化していないか

オッズ帯 20.0-49.9: calibration gap = 0.0353 オッズ帯 50.0+: calibration gap = 0.0240

高オッズ帯の calibration gap は比較的小さく、大きな過大評価は見られません。

どの特徴量グループが効いたか

gain 合計が大きい上位3グループは 展開圧力, 脚質, 騎手変更 でした。

逆にノイズになった特徴量はあるか

ablation の結果、除外して明確に AUC が上がるグループはありませんでした。

features_v1 を今後使う価値はあるか

features_v1 を使うことで、個別特徴量を毎回自前で作る手間が省けます。 今回の検証では全部入りモデルで baseline を上回る精度が得られており、今後の実験のベースとして使う価値があると考えられます。

まとめ

これまで個別に検証してきた特徴量を features_v1 としてまとめ、全部入りモデルの予測精度を多角的に評価しました。 人気なしモデルでは AUC が baseline 比 +0.1713 の改善を確認できました。 人気ありモデルでも AUC が baseline 比 +0.0027 の改善が見られました。 AUC だけでなく NDCG・キャリブレーション・特徴量重要度なども確認し、総合的な評価を行いました。

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