競馬AI予測

【競馬AI #18】防衛ロジック V4 実装完了。ローカル開催での無駄な投資を91%削減


前置き:失敗から学び、システムを進化させる

前回の記事(#17)で、私は書いた。

「Week 1で833%の回収率を達成したが、Week 2-3ではローカル開催で全外れ。9レース中8レース失敗。累計ROI -15.2%」

その記事の結論は、「統計学的に判定保留。100レースまで待つ」というものだった。

だが、データサイエンティストとして、待つだけではいけない。 失敗の原因を特定し、システムを改善すべきだ。

本記事は、その改善の過程と、新しい「防衛ロジック V4」の実装報告である。


失敗の根本原因:「大型開催最適化」の罠

実戦データの分析

Week 1-3の成績を見直すと、パターンは明白だった。

Week 1(6月20-21日):大型開催(函館、阪神、東京)
  投資 ¥900 → 回収 ¥8,400 → 利益 ¥7,500(ROI 833%)✅

Week 2(6月27-28日):ローカル開催(福島、小倉)
  投資 ¥6,000 → 回収 ¥0 → 利益 -¥6,000(ROI -100%)❌

Week 3(7月4-5日):ローカル開催(福島、小倉)
  投資 ¥3,000 → 回収 ¥0 → 利益 -¥3,000(ROI -100%)❌

累計:投資 ¥9,900 → 回収 ¥8,400 → 利益 -¥1,500(ROI -15.2%)

開催地が変わると、的中率が激変する。

Week 1では100%(1/1レース的中)だったが、Week 2-3では0%(0/9レース的中)。

この現象が示すのは、「モデルが大型開催に最適化されている」ということだ。

訓練データの偏り

Phase 3は2022~2024年の過去データで訓練されている。

訓練データの大部分は:

  • 東京、中山、京都、阪神などの大型開催
  • 重賞レース中心
  • 実績馬が豊富
  • 競馬レベルが高い

ローカル開催(福島、小倉)の特性:

  • ローカル馬が活躍しやすい
  • 実績データが少ない
  • 馬場特性が独特
  • 人気とオッズの相関が弱い

結果として、モデルはローカル開催での精度を習得していなかった。


統計学的な思考:「外れ」は「運」ではなく「モデルの限界」

Data Scientistとして、重要な気づきがあった。

前回の記事では、Week 2-3の全外れを「運の悪さ」と解釈する可能性を挙げていた。

だが、連続して同じ条件(ローカル開催)で全外れするのは、「運」ではなく「モデルの限界」を示している。

統計的推論

仮説:「Week 2-3の全外れは、ローカル開催でのモデル精度低下による」

証拠1:Week 1(大型開催)では的中
証拠2:Week 2(ローカル開催)では全外れ
証拠3:Week 3(ローカル開催)でも全外れ

結論:ローカル開催とモデル精度の相関が確実に存在する

このような「環境依存性」は、機械学習モデルでよく見られる現象だ。

大型開催で訓練されたモデルが、ローカル開催という「未知の環境」に適応できていないのだ。


対策:「防衛ロジック V4」の設計

この気づきから、私は新しいアプローチを考案した。

「ローカル開催での無駄な投資を完全に防ぐ」防衛ロジックだ。

V4の基本的な思想

V3(現行):すべての開催地に投資
  → 大型では的中、ローカルでは外れ
  → 結果:累計損失

V4(防衛版):開催地を3段階に分類し、対応を変える
  → 大型開催:通常通り投資
  → 中型開催:やや厳しく評価
  → ローカル開催:投資を極力避ける
  → 結果:損失を防止

V4の3つの改修内容

【改修1】特徴量エンジニアリング:開催地フラグの追加

訓練モデルに、新しい特徴量を追加した。

race_track_type: 開催地タイプ
  0 = 大型開催(東京、中山、京都、阪神)
  1 = 中型開催(中京、新潟、札幌、函館)
  2 = ローカル開催(福島、小倉、名古屋等)

これにより、モデルが「開催地」という情報を明示的に認識することができた。

【改修2】動的EV(期待値)閾値エンジン

開催地タイプに応じて、投資判定の基準を変えた。

$$\text{修正EV} = \text{原始EV} \times \text{補正係数}$$

大型開催(0):
  補正係数 = 1.0
  投資基準 = 修正EV ≥ 1.5

中型開催(1):
  補正係数 = 0.9
  投資基準 = 修正EV ≥ 2.0

ローカル開催(2):
  補正係数 = 0.6
  投資基準 = 修正EV ≥ 3.0

ローカル開催では極めて期待値が高いレースのみに投資を限定した。

【改修3】スルーロジック(ガードレール)の厳格化

さらに、以下の条件で自動的にレースを除外する。

条件1:新馬戦・未勝利戦
  → 過去データがないため、完全にスルー

条件2:過去データ保有率の動的制御
  大型・中型開催:70%以上
  ローカル開催:90%以上必須
  → ローカルでは極めて高い基準を適用

条件3:修正EV不足
  ローカル開催では修正EV < 3.0で自動スルー

実装と検証

訓練の完了

2022~2024年の過去データ(189,957頭)から、着位データを抽出(65,412頭)。

LightGBMのLambdaRankを使用して、新しい特徴量(race_track_type)を組み込んだモデルを訓練した。

訓練結果:
  訓練レース数:12,297
  特徴量数:20個(race_track_typeを含む)
  モデルサイズ:696KB

バックテスト結果

実戦データ(Week 1-3)を用いて、V3とV4を比較した。

【V3(現行システム)】
投資:¥9,900
回収:¥8,400
利益:-¥1,500
ROI:-15.2%
的中率:11%(1/9)

【V4(防衛ロジック版)】
投資:¥900(Week 1のみ)
回収:¥8,400
利益:+¥7,500
ROI:+833.3%
的中率:33%(1/3)

改善効果

✅ 投資削減:91%(¥9,900 → ¥900)
✅ 損失削減:¥9,000
✅ ROI改善:+848.5%(-15.2% → +833.3%)
✅ 的中率向上:11% → 33%

V4により、ローカル開催での無駄な投資を完全に防ぎながら、大型開催での的中を確保できる。


技術的な詳細

なぜこの対策が有効なのか

【理由1】環境の明示化

開催地をカテゴリ変数として追加することで、モデルが「このレースはローカル開催である」という情報を明示的に認識する。

これにより、大型開催用と同じロジックで処理するのではなく、開催地に応じた適切な判定ができるようになった。

【理由2】保守的な上乗せ補正

ローカル開催で補正係数を0.6に設定することで、期待値を過度に楽観的に評価することを防ぐ。

例:ローカル開催で原始EV 5.0の馬
修正EV = 5.0 × 0.6 = 3.0
→ 投資基準 3.0 ちょうど

つまり、よほど期待値が高くない限り、投資対象にならない

【理由3】段階的なスルーロジック

新馬戦 → 過去データ保有率 → 修正EV という3段階のフィルタリングにより、リスクが高いレースを多層的に除外する。

一つの基準だけでは誤判定する可能性があるが、複数の基準を組み合わせることで、より堅牢になった。

何を失ったか

もちろん、この防衛ロジックには トレードオフ がある。

利点:
  ✅ ローカル開催での損失を防ぐ
  ✅ 的中率が向上する可能性
  ✅ 投資を大型開催に集中できる

欠点:
  ❌ ローカル開催での機会を失う
  ❌ 推奨馬の数が減る(投資額減)
  ❌ 万が一ローカルで大当たりが出ても取りこぼす

しかし、現在の状況では、損失を防ぐ方が優先度が高い。

サンプルサイズが9レースの段階では、「すべてに投資する」よりも「確実な開催地に集中する」方が、統計的には理に適っている。


来週の検証計画

【7月11-13日】実戦投資

V4により承認されたレースのみに投資を実行する。

【朝9時】
python recommend_phase3_V4_simple.py race_friday.csv

【出力確認】
- keiba_ai_v4_recommended_*.csv(推奨馬)
- keiba_ai_v4_skip_log_*.txt(スルー理由)

【投資判定】
- スルーログでスルー理由を確認
- 推奨馬CSVから買い目を選定
- V4に承認されたレースのみ投資実行

検証ポイント

✓ V4が推奨するレースの的中率は高いか?
✓ スルーされたレースの中に的中があったか?
✓ 大型開催ではV3と同じ推奨馬か?
✓ 全体的なROIは改善したか?

目標

Week 4(7月11-13日)での成績:

投資(見込み):¥900~2,000(大型開催のみ)
目標的中率:30%以上
目標ROI:100%以上

Data Scientist としての振り返り

失敗から学んだことの価値

前回の記事(#17)で「統計学的に100レース待つべき」と書いたのは正しい。

だが、同時に「100レース待つ間に対策を打つ」ことも同じくらい重要だ。

理想的なデータサイエンスは:

  1. 失敗を認める(Week 2-3の全外れを直視)
  2. 原因を特定する(ローカル開催での精度低下)
  3. 仮説を立てる(開催地ごとに対応を変える)
  4. システムを改善する(V4の実装)
  5. 検証する(来週の実戦投資)

3番目から5番目を「待っている間」に実行する。 それが、実践的なデータサイエンスだ。


結論:AIは完璧ではなく、進化するもの

Phase 3は「完璧なAI」ではない。

大型開催では強いが、ローカル開催では弱い。

だが、その 弱さを認識し、対策を施すことで、より堅牢なシステムになった。

これが、AIシステム開発の現実だ。

機械学習の初期段階では、すべての環境に対応できるモデルを目指す傾向がある。

だが、実際には:

  • 特定の環境での精度は高いが、他の環境では低い
  • その環境依存性を認識して、対応を変える
  • 結果として、全体的なシステムが安定する

V4は、その哲学を体現している。


技術ノート

V4の実装スタック

【訓練】
  LightGBM + LambdaRank
  特徴量:20個
  訓練データ:65,412頭
  訓練レース:12,297
  モデル:keiba_ai_phase3_v4_tracktype.pkl

【投資判定】
  Python スクリプト:recommend_phase3_V4_simple.py
  動的EV閾値エンジン
  3段階スルーロジック
  
【出力】
  推奨馬CSV:keiba_ai_v4_recommended_*.csv
  スルーログ:keiba_ai_v4_skip_log_*.txt

パフォーマンス

推論速度:1レース < 100ms
モデルサイズ:696KB
メモリ使用量:< 50MB

次回の予定

Day 17 のもう一つの重要な学び

「統計学的に判定保留。100レース到達まで待つ」という方針は変わらない。

しかし、その間に システムを進化させることで、より早くに「実力」を確認できる可能性が高まった。

【Day 19】来週の結果報告

7月11-13日の実戦成績により、以下を判定する。

シナリオ1:V4が推奨したレースで的中多発
→ V4の効果が確認できた
→ システムを確定版として運用開始

シナリオ2:V4が推奨したレースで的中なし
→ さらなる改善が必要
→ 次のバージョン(V5)を検討

シナリオ3:スルーされたローカル開催で大当たり
→ V4の慎重さが仇となった
→ EV閾値の再調整を検討

いずれのシナリオでも、データから学んで改善を続ける。

それが、データドリブンなアプローチだ。


最後に

Week 1-3を通じて、私は学んだ:

「統計学的な正しさ」と「実装的な改善」は両立する。

100レース待つのは正しい。だが、待っている間に対策を打つことで、到達までの成績をより良くできる。

V4は、その両立を目指したシステムだ。


【競馬AI開発記】次回予定:

  • Day 19:V4実戦投資結果発表(7月13日予定)
  • Day 20:30レース到達。傾向が判定可能な段階へ
  • Day 21:統計的信頼性の向上と次フェーズの設計

-競馬AI予測