競馬AI開発メモ:勝率モデルをAUCではなく回収率とNDCGで評価してみる

競馬AI開発

はじめに

これまでの記事では、脚質・展開圧力・距離適性・馬場適性・レース間隔・馬体重・騎手特徴量など、主に「特徴量追加」による勝率モデルの精度改善を検証してきました。評価指標は AUC / logloss / Brier score が中心でした。

今後は特徴量追加だけでなく、学習重みの変更・ランキング学習・波乱レース重み付け・オッズ帯別キャリブレーション・堅いレース / 波乱レース用のモデル分離といった仕組みの検証をしていきたいと考えています。 その前段階として本記事では、今後のモデル比較で使う「評価基盤」を整理し、再利用しやすい関数として実装しました。

なぜAUCだけでは不十分なのか

AUC は「予測スコアの順位が良いか」を評価する指標としては便利ですが、実運用では以下のような弱点があります。

  • 確率の正しさ(キャリブレーション)を直接評価しない
  • レース内で人気順より上手いランキングを作れているかは分かりにくい
  • 回収率とは直接一致しない
  • 高オッズ馬の過大評価を見逃すことがある

logloss / Brier score は確率精度を測れますが、これも「レース単位で人気順に勝てているか」を直接見る指標ではありません。 そこで、本記事では以下を組み合わせて評価します。

  1. AUC / logloss / Brier(基本指標)
  2. レース内 NDCG(ランキング精度)
  3. 人気順 NDCG との差分(人気順に対する相対的な強さ)
  4. 単勝シミュレーション(回収率・最大ドローダウン・最大連敗)
  5. EV候補評価(期待値ベース候補の実性能)
  6. オッズ帯別 / 人気帯別キャリブレーション
  7. 人気集中度別評価(堅い / 荒れる レースでの挙動)

今回確認すること

  • 勝率モデルの AUC が同等でも、レース内ランキング(NDCG)や回収率で差は出るか
  • 「人気なしモデル」と「人気ありモデル」の差はどう見えるか
  • モデルは人気順に対して勝てているか / どの条件で勝ちやすいか
  • 高オッズ帯・EV候補で予測勝率と実勝率にどの程度ズレがあるか

使用データ

  • テーブル: result_table
  • 学習期間: 2017〜2022 年(787,381 件)
  • 検証期間: 2023〜2023 年(136,354 件, early stopping)
  • 評価期間: 2024〜2024 年(138,372 件, レース数 13,677)
  • 帯広(ばんえい競馬)は除外(124,418 行)

評価対象モデル

以下2種類の LightGBM 勝率モデルを比較対象としました。ハイパーパラメータは共通です。

  • 人気なしモデル: 距離・馬番・枠番・斤量・馬体重・馬体重増減・年齢・同走馬の数・月・曜日・過去3走平均着順・過去3走3着内率(すべて shift(1)→rolling で作成)
  • 人気ありモデル: 上記に 人気 を追加

確定オッズ(単勝)は学習特徴量に一切使っていません。 評価時のシミュレーション・参考指標としてのみ利用しています。

評価指標の定義

AUC / logloss / Brier

  • AUC: 1着馬とその他馬の予測スコアの順序が正しいか
  • logloss: 予測勝率と実際の勝敗(0/1)のクロスエントロピー
  • Brier: 予測勝率と実際の勝敗の二乗誤差平均

レース内 NDCG

レースを1つのランキングタスクとみなし、モデルの予測順位が実際の着順にどれだけ近いかを NDCG で計算します。 relevance は以下で定義しました。

  • 1着 = 3
  • 2着 = 2
  • 3着 = 1
  • 4着以下 = 0

レース単位に NDCG@1 / NDCG@3 / NDCG@5 を計算し、全レース平均を取ります。

人気順 NDCG との差分

モデル予測スコアで並べた NDCG に加え、単勝人気順(1番人気を最上位)で並べた NDCG も計算し、その差分を見ます。

  • delta_ndcg@3 = model_ndcg@3 - popularity_ndcg@3
  • delta_ndcg@3 > 0.02 なら model_beats_popularity
  • delta_ndcg@3 < -0.02 なら model_loses_to_popularity
  • それ以外は tie

閾値 0.02 は本記事の判定用に暫定的に設定した値です。今後の記事では変更する可能性があります。

単勝シミュレーション

各レースで対象スコアが最大の1頭を選び、単勝100円を購入したと仮定した場合の ベット数 / 的中率 / 投資額 / 払戻額 / 回収率 / 最大ドローダウン / 最大連敗数 を計算します。 参考指標として、単勝シミュレーション上の回収率も確認します(馬券購入の推奨ではありません)。

EV候補評価

EV = 予測勝率 × 単勝オッズ を計算し、EV≥1.0 / 1.1 / 1.2 の候補について 件数 / 予測勝率 / 実勝率 / calibration gap / 平均オッズ / 単勝回収率 を計算します。 確定オッズは学習には使わず、評価時のみに使います。

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

単勝オッズ帯(1.0-1.9 / 2.0-2.9 / 3.0-4.9 / 5.0-9.9 / 10.0-19.9 / 20.0-49.9 / 50.0+)ごとに、件数 / 平均予測勝率 / 実勝率 / calibration gap / logloss / Brier / 帯全体を購入したときの単勝回収率 を出します。

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

人気帯(1 / 2-3 / 4-5 / 6-9 / 10+)ごとに、上記と同様の指標を計算します。

比較方法

  • テスト期間(時系列分割の評価期間)でのみ集計する
  • 人気が欠損している行は該当集計から除外する
  • レース単位 NDCG では、着順が確定していないレースは対象外
  • 単勝シミュレーションは 1頭×100円 の単勝購入のみ扱う
  • 数値はすべて DB の実データから計算されており、架空の値は含まない

結果

通常指標

表1: 通常指標

モデル件数正例率AUCloglossBrier
人気なしモデル138,3720.09890.73590.28910.0822
人気ありモデル138,3720.09890.84590.24380.0715

NDCG 比較

表2: NDCG 比較(モデル vs 人気順)

モデルmodel_ndcg@1model_ndcg@3popularity_ndcg@1popularity_ndcg@3delta_ndcg@3人気順に勝ったレース率
人気なしモデル0.40530.51190.55300.6486-0.136723.40%
人気ありモデル0.55290.64790.55300.6486-0.00070.96%

単勝シミュレーション

表3: 単勝シミュレーション(人気なしモデル)

戦略ベット数的中数的中率投資額払戻額回収率最大DD最大連敗
モデル予測1位13,6774,22430.88%1,367,700円1028250円0.7518340330円28
人気1位13,6776,15144.97%1,367,700円1106900円0.8093260960円14
モデル予測1位 & 予測勝率≥0.303,7491,62943.45%374,900円295390円0.787980920円18
モデル予測1位 & オッズ≥5.03,7812877.59%378,100円263260円0.6963117540円78

表3-2: 単勝シミュレーション(人気ありモデル)

戦略ベット数的中数的中率投資額払戻額回収率最大DD最大連敗
モデル予測1位13,6776,15044.97%1,367,700円1107130円0.8095260730円14
人気1位13,6776,15144.97%1,367,700円1106900円0.8093260960円14
モデル予測1位 & 予測勝率≥0.3013,4166,07345.27%1,341,600円1088660円0.8115253100円17
モデル予測1位 & オッズ≥5.027622.22%2,700円3220円1.1926760円7

EV候補評価

表4: EV候補評価(人気なしモデル)

閾値EV件数予測勝率実勝率calibration gap平均オッズ単勝回収率
EV≥1.084,0830.08920.02850.060785.610.6213
EV≥1.179,9260.08800.02600.062089.020.6181
EV≥1.276,1500.08690.02360.063392.300.6086

表4-2: EV候補評価(人気ありモデル)

閾値EV件数予測勝率実勝率calibration gap平均オッズ単勝回収率
EV≥1.053,0500.08050.04610.034593.750.5890
EV≥1.144,3660.07280.03740.0354101.830.5646
EV≥1.237,2000.06520.03090.0344109.950.5619

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

表5: オッズ帯別キャリブレーション(人気なしモデル)

オッズ帯件数予測勝率実勝率calibration gaploglossBrier単勝回収率(帯全体)
1.0-1.97,2110.24080.5683-0.32750.99230.35770.8236
2.0-2.97,8630.18300.3230-0.14010.73930.24680.7754
3.0-4.912,8600.15150.2019-0.05040.55680.17270.7657
5.0-9.920,6800.12120.11430.00690.38360.10750.7851
10.0-19.920,8490.09810.05670.04140.24440.05950.7832
20.0-49.927,0770.07730.02560.05170.15210.03050.7880
50.0+41,8320.04770.00500.04270.06510.00820.4821

表5-2: オッズ帯別キャリブレーション(人気ありモデル)

オッズ帯件数予測勝率実勝率calibration gaploglossBrier単勝回収率(帯全体)
1.0-1.97,2110.46490.5683-0.10340.70050.25350.8236
2.0-2.97,8630.35040.32300.02740.64700.22660.7754
3.0-4.912,8600.20120.2019-0.00070.51110.16430.7657
5.0-9.920,6800.11150.1143-0.00270.36240.10270.7851
10.0-19.920,8490.06310.05670.00640.22550.05460.7832
20.0-49.927,0770.03390.02560.00830.12530.02550.7880
50.0+41,8320.01250.00500.00750.03450.00510.4821

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

表6: 人気帯別キャリブレーション(人気なしモデル)

人気帯件数予測勝率実勝率calibration gaploglossBrier単勝回収率(帯全体)
113,6770.20550.4497-0.24420.87520.30520.8093
2-327,3530.14560.1644-0.01880.47720.14350.7532
4-527,3290.10370.06570.03800.26470.06690.7155
6-949,8810.06750.02250.04500.13180.02590.6907
10+20,1320.03810.00570.03240.05800.00750.5101

表6-2: 人気帯別キャリブレーション(人気ありモデル)

人気帯件数予測勝率実勝率calibration gaploglossBrier単勝回収率(帯全体)
113,6770.44340.4497-0.00640.67630.24170.8093
2-327,3530.16460.16440.00020.44000.13550.7532
4-527,3290.06900.06570.00320.24010.06110.7155
6-949,8810.02330.02250.00080.10440.02190.6907
10+20,1320.00710.00570.00150.03420.00560.5101

人気集中度別の比較

1番人気の単勝オッズを人気集中度の代理指標として、レース単位の NDCG 勝敗を集計します。

人気なしモデル: 1番人気オッズ帯別

1番人気オッズ帯レース数モデル勝モデル負引分モデル勝率model_ndcg@3popularity_ndcg@3delta_ndcg@3
solid(1.5-2.5)7,3111,6764,3671,26822.92%0.51140.6557-0.1443
very_solid(<1.5)3,0295581,65981218.42%0.65020.7740-0.1237
moderate(2.5-4.0)3,1579161,80843329.01%0.39520.5274-0.1322
wild(>=4.0)180501012927.78%0.25190.3758-0.1239

人気ありモデル: 1番人気オッズ帯別

1番人気オッズ帯レース数モデル勝モデル負引分モデル勝率model_ndcg@3popularity_ndcg@3delta_ndcg@3
solid(1.5-2.5)7,31169967,1460.94%0.65520.6557-0.0004
very_solid(<1.5)3,02918292,9820.59%0.77320.7740-0.0007
moderate(2.5-4.0)3,15743643,0501.36%0.52600.5274-0.0014
wild(>=4.0)180111780.56%0.37580.37580.0000

人気なしモデル: 頭数別

頭数帯レース数モデル勝モデル負引分モデル勝率model_ndcg@3popularity_ndcg@3delta_ndcg@3
medium(9-12)10,2492,3705,9851,89423.12%0.49690.6375-0.1406
small(<=8)2,6196481,51645524.74%0.58710.7172-0.1301
large(>=13)80918243419322.50%0.45830.5667-0.1084

人気ありモデル: 距離帯別

距離帯レース数モデル勝モデル負引分モデル勝率model_ndcg@3popularity_ndcg@3delta_ndcg@3
mile(1400-1799)9,049721128,8650.80%0.64770.6484-0.0007
short(<1400)4,10250633,9891.22%0.65040.6513-0.0008
middle(1800-2199)4909134681.84%0.63050.6307-0.0002
long(>=2200)3602340.00%0.62650.6368-0.0104

考察

AUCが良くても回収率が良いとは限らない

AUC は順序性を測る指標なので、確率の絶対値やレース単位でのランキングとは切り離されて評価されます。本記事のテーブルでも、AUC の差と回収率・NDCG の差は必ずしも同じ向きに動きません。評価は AUC / logloss / Brier / NDCG / ROI / キャリブレーションを併記して総合的に判断すべきだと考えます。

モデルは人気順に勝てているか

NDCG@3 で人気順とモデル予測を直接比較しました。人気順は非常に強いベースラインです。人気なしモデルは人気順に肉薄できるか、モデル勝ちレース率がどの程度に落ち着くかを、上の表2および人気集中度別の表で確認できます。

高オッズ馬を過大評価していないか

オッズ帯別・人気帯別のキャリブレーションテーブルで、高オッズ帯(10倍以上)や下位人気帯の 予測勝率 - 実勝率(calibration gap)に注目します。gap が正に大きいほど過大評価です。EV候補評価も同様で、EV≥1.0 の候補について予測勝率と実勝率の差、単勝回収率を確認しています。

EV候補の実勝率は予測勝率に追いついているか

EV≥1.0 / 1.1 / 1.2 と閾値を上げるほど候補数が絞られ分散が大きくなります。実勝率が予測勝率に追いついているか、単勝回収率が 1.0 を超えているかは、テスト期間の1年評価だけでは判断できません。今後は複数年での安定性を見る必要があります。

今後のモデル比較で重視すべき指標

本記事のテーブル群を、以下の検証で共通の評価基盤として使う想定です。

  • オッズ帯別に学習重みを変えると予測精度は上がるのか
  • 人気薄を重く学習すると高オッズ馬の見極めは改善するのか
  • 波乱レースを重く学習すると荒れるレースに強くなるのか
  • ランキング学習は勝率モデルよりレース内順位を改善するのか
  • オッズ帯別キャリブレーションで期待値評価は改善するのか
  • 堅いレース用モデル・波乱レース用モデルを分けると精度は上がるのか

まとめ

  • AUC / logloss / Brier だけでは勝率モデルの実運用上の性能は測りきれない
  • レース内 NDCG と人気順 NDCG の差分は「モデルが人気順に対してどれだけ有利か」を直感的に見せてくれる
  • 単勝シミュレーション(回収率・最大DD・最大連敗)は分散が大きく、単年評価だけで判断しない
  • オッズ帯別 / 人気帯別のキャリブレーションで、高オッズ帯の過大評価を可視化できる
  • 本記事で作った評価関数を今後の学習重み・ランキング学習・キャリブレーション補正の記事で共通利用する
タイトルとURLをコピーしました