PerfectGreen AIの予測システムは LightGBM アンサンブルモデル(60特徴量)で「各馬の1着確率」を推定している。このモデルは人気・オッズを含む豊富な特徴量で安定した予測を生み出すが、本質的に市場の予測に近い出力になりがちだ。
「オッズを使わない純粋な能力ベースの第2モデルを追加すれば、波乱レースで穴馬を拾えるのではないか」 — この仮説を検証した結果、Model Bは破棄することになった。全プロセスを報告する。
検証の全流れ
① コンセプト設計 → ② プロトタイプ学習 → ③ 統合レイヤー実装
→ ④ グリッドサーチ(不採用) → ⑤ Model A全レースバックテスト
→ ⑥ Model B v2再学習(AUC改善せず) → ⑦ ルールベース後補正
→ ⑧ 1年バックテスト(改善はノイズ) → ⑨ Model B破棄
① コンセプト:二段階予測アーキテクチャ
モデルA(順位予測) モデルB(大穴検出)
60特徴量(人気・オッズ含む) 35特徴量(人気・オッズ除外)
│ │
ランクスコア upset確率(0〜1)
│ │
▼ ▼
└──── 統合レイヤー ────┘
│
最終ランキング
Model Bはオッズ・人気を一切使わず、過去走能力・騎手・調教師・血統・適性などの純粋な能力データのみで「波乱確率」を予測する。統合レイヤーでModel Aの順位予測を補正する仕組み。
② プロトタイプ学習結果
Model B(v1)を学習。ターゲットは「人気3番以内以外が1着 = upset」。
- 学習データ: 121,835サンプル(9,005レース)
- 波乱レース率: 31.4%
- AUC: 0.656(5-Fold CV平均)
特徴量重要度 Top 5
| 順位 | 特徴量 | 重要度 | 意味 |
|---|---|---|---|
| 1 | lag1_last_3f | 2922 | 前走の上がり3ハロン |
| 2 | distance | 2718 | レース距離 |
| 3 | place_id | 2523 | 開催場所 |
| 4 | horse_weight | 2220 | 馬体重 |
| 5 | interval | 2201 | 休み期間 |
前走の上がり3Fがダントツ1位。オッズなしでも「末脚の鋭さ」が波乱の最も強いシグナルだった。
③ 統合レイヤー実装
当初は閾値ベース(upset_prob < 0.3 / 0.3-0.6 / > 0.6)の条件分岐を設計したが、フィードバックを受けてz-score連続調整に変更。不連続な閾値を廃止し、各馬の能力スコアを連続的な重みでModel Aに掛け合わせた。
宝塚記念5年バックテスト:
| 年 | 勝馬 | 人気 | 統合前 | 統合後 | 変化 |
|---|---|---|---|---|---|
| 2021 | クロノジェネシス | 1番 | 1位 | 1位 | = |
| 2022 | タイトルホルダー | 2番 | 6位 | 7位 | ▼-1 |
| 2023 | イクイノックス | 1番 | 1位 | 1位 | = |
| 2024 | ブローザホーン | 3番 | 2位 | 2位 | = |
| 2025 | メイショウタバル | 7番 | 6位 | 5位 | ▲+1 |
Top1命中: 2/5(40%)— 変化なし。
④ グリッドサーチ:不採用
UPSET_BOOST_SCALEを0.0〜1.5まで、pop閾値を4〜8でグリッドサーチ。
どの組み合わせでも Model A only(scale=0.0)が最適だった。 Model Bを統合すると逆に性能が下がる。
⑤ Model A単独の全レースバックテスト(1,307レース)
ここで方向転換。Model Bではなく、まずModel Aの現在地を正確に把握するため、直近6ヶ月の全レース(G1〜新馬、Other除外)でバックテストを実施。
グレード別
| グレード | レース数 | Top1% | 相関 | 1番人気勝率 |
|---|---|---|---|---|
| G1 | 16R | 43.8% | 0.757 | 56.2% |
| 3勝 | 65R | 43.1% | 0.581 | 29.2% |
| 1勝 | 385R | 39.0% | 0.597 | 29.4% |
| 2勝 | 163R | 34.4% | 0.496 | 33.7% |
| 未勝利 | 524R | 31.5% | 0.542 | 33.4% |
| G2 | 12R | 33.3% | 0.566 | 33.3% |
| OP/L | 45R | 28.9% | 0.527 | 24.4% |
| G3 | 20R | 20.0% | 0.570 | 25.0% |
| 新馬 | 77R | 23.4% | 0.505 | 27.3% |
距離別
| 距離 | レース数 | Top1% | 相関 |
|---|---|---|---|
| 短距離(<1400) | 355R | 45.6% | 0.617 |
| マイル(1400-1799) | 381R | 30.7% | 0.570 |
| 中距離(1800-2199) | 488R | 28.3% | 0.501 |
| 長距離(2200+) | 83R | 33.7% | 0.539 |
Model Aの弱点が判明
- G3のTop1 20.0% — 重賞で最も弱い
- OP/Lの1番人気勝率24.4% — 波乱が最も多いクラス
- 中距離の相関0.501 — 距離別で最低
逆にG1(相関0.757)、3勝(Top1 43.1%)、短距離(Top1 45.6%)ではModel Aがすでに強力。
⑥ Model B v2 再学習
バックテストで特定した弱点(G3/OP/L + 中距離)にフォーカスし、学習ターゲットをオッズベース(単勝5倍以上が1着 = upset)に変更して再学習。
- 学習データ: 2,717レース(37,691サンプル)
- 対象: G3 + OP/L + 中距離のみ(新馬・G1除外)
- 特徴量: 22個
- AUC: 0.6568 — v1(0.656)とほぼ不变
目標のAUC 0.70に届かず。 ターゲット変更も対象絞り込みも効果なし。
根本原因はアーキテクチャの限界:レース単位タスク × 馬単位特徴量のミスマッチ。全馬に同じラベル(upset=0/1)を付与しているため、LightGBMは「どの馬がアンダードッグか」ではなく「レース全体の平均的な傾向」しか学習できない。
⑦ ルールベース後補正
Model Bを諦め、「G3/OP/L + 中距離で1番人気のスコアをペナルティ」というシンプルなルールで検証。
6ヶ月(40R):
| ペナルティ倍率 | Top1% | 変化 |
|---|---|---|
| 1.00(ベース) | 25.0% | — |
| 1.15 | 30.0% | +5.0% ✅ |
一見、改善が見えた。
⑧ 1年バックテスト:改善はノイズだった
| 期間 | 対象R数 | ベースTop1 | 最適Top1 | 最適倍率 |
|---|---|---|---|---|
| 6ヶ月 | 40R | 25.0% | 30.0% (+5.0%) | 1.15 ✅ |
| 1年 | 106R | 34.0% | 30.2% (-3.8%) | 1.15 ❌ |
106レースで検証した結果、ペナルティは逆効果。 6ヶ月の「改善」は40R中2回の差 — 統計ノイズだった。あらゆる倍率(1.05〜2.00)でTop1が低下、相関も一貫して悪化。
⑨ 最終判断:Model B破棄
全アプローチを検証した結果:
| アプローチ | 結果 |
|---|---|
| Model B v1(人気ベース) | グリッドサーチで不採用 |
| Model B v2(オッズベース) | AUC 0.657、改善なし |
| ルールベース後補正 | 40Rで改善も106Rで逆効果 |
| Model A単独 | 全体Top1 34.0%、G1で43.8% |
Model Bは破棄。Model A単独運用を継続する。 学習スクリプト・モデルファイルは experiments/ に整理済み。
教訓
- 「2つ目のモデルを足せば良くなる」は間違いの典型 — 既存モデルがすでに強い領域に追加モデルを足しても逆ノイズになる。Model BがプラスになるにはAUC 0.70以上が必要だった
- バックテストは最低100R — 40Rの「改善」は信用しない。サンプルが増えると消滅する
- 期間の偏りに注意 — 6ヶ月だけのデータだと、その期間の偶然を過学習として読んでしまう
- タスク設計と特徴量設計の整合性 — レース単位の二値分類タスクに馬単位の特徴量を入れても、個別馬の予測精度は上がらない
- Model A自体の改善が最大の改善 — L1正則化 + 市場シグナル補正削除など、既存モデルの地道な改善が最も効果的だった
今後の方針
Model Aの特徴量改善にリソースを集中する。特に:
- G3のTop1 20%を引き上げる 特徴量の追加・調整
- 中距離の相関0.501を改善する 特徴量エンジニアリング
- ダートの予測精度 (Top1 35.9% → 40%+)
2026年6月2日 最終更新。全検証を完了し、Model Bは破棄。Model A単独運用に決定しました。