AIに予想を任せる上で、一番怖いのが「自分なら絶対買わない馬を本命にされること」。
実際、初期バージョンでは「展開不利+過剰人気+過去凡走」の馬が本命になっていて、「これ、罠すぎて買ったら負けるやつ…」となりました。
そこで私は“罠フィルター”と名付けた除外ロジックを作ることにしました。
感覚的に「これは消すべき」と思っていたパターンを、全部ルール化していく作業です。
💭まずは“買わない癖”を棚卸しした
手元の過去馬券記録やメモを見ながら、私が「買わない」と判断した理由を言語化。
例としてパターンはざっくりこんな感じです:
- 外枠に入った1番人気の逃げ馬(展開的に不利)
- テンが遅いのに中山1200を使ってくる差し馬(届かない確率高い)
- 前走で好走して人気上昇、でも時計的には特に優れていない馬(内容より印象で買われてる)
- 馬体重がマイナス10キロ以上で、直近に強い負荷調教をしている馬(データ的に消耗が強い)
- 脚質的に偏ってるレースで、唯一の“展開不向き”な馬(典型的に沈む)
- 長距離の川田
- ダートのルメール
- 差しの三浦武史
こういうパターンを全部“スコア”にして、規定値を超えたら自動除外する仕組みにしました。
🧠Pythonで書いた罠フィルター(抜粋)
def is_trap(horse):
# 外枠+逃げ脚質+過剰人気
if horse.draw >= 14 and horse.style == "逃げ" and horse.popularity <= 2:
return True
# 馬体重急減+過負荷調教
if horse.weight_change <= -10 and horse.last_training_type == "強負荷":
return True
# 展開ズレの差し馬(中山1200/小倉芝1200など)
if horse.course in ["中山1200", "小倉1200"] and horse.style == "差し" and horse.draw >= 12:
return True
# 騎手がテン乗り&過去騎乗経験なし
if horse.jockey_experience == 0 and horse.trainer_confidence == "低め":
return True
return False
この関数を馬ごとに適用して、“True”の馬は予想候補から自動的に除外されます。
正直、ここが一番“自分の予想スタンス”を詰め込んだ部分でした。
🔢“罠の度合い”をスコアで管理する構成へ進化
単純なTrue/Falseだけだと精度が粗いので、今は罠要素ごとにポイントを振って、総合スコアで判定しています。
例としては下記です。
| 要素 | 条件 | スコア |
|---|---|---|
| 外枠+逃げ | 14番枠以上かつ逃げ | +30 |
| 馬体重急減 | −10kg以上 | +25 |
| 騎手乗り替わり | テン乗りかつ経験なし | +20 |
| 過剰人気 | 単勝3倍未満で根拠薄 | +15 |
| 調教過信 | 美浦の軽め調教で“絶好”表示 | +10 |
合計スコアが60以上になると、「罠警告」を表示し、本命候補から除外。
これをUI側にも連携させて、「この馬、罠スコアが高いです」と人間にも説明できるようにしています。
📊表示例(UI側)
- 【罠判定】 11番 モズフレンド(罠スコア:65)
- 外枠+逃げ(+30)
- 騎手テン乗り(+20)
- 馬体重−12kg(+15)
⇒ 本命候補から除外
この表示があることで、私も「AIがちゃんと私の感覚を反映してるな」と納得できるようになりました。
🤝今後の追加予定
罠フィルターは完成形ではなく、まだ進化中です。今後追加したい項目:
- ローカルコースでの騎手別信頼度(小倉・福島などでの成績分布)
- 人気順の変動(発売直前に急落した馬)
- 厩舎別“勝負仕上げ”パターン(過去の勝負設定と似てる週)
- パドック/返し馬の様子(視覚情報は難しいが、Netkeibaコメントで補完予定)
これらを加えることで、“買わない理由を定義するAI”として、さらに私好みに育てていく予定です。
次回:第7回「予想ロジックをどう組み立てたか:買う理由と絞り方」
次回は“買う側”の視点。
罠フィルターで候補を絞ったあと、「どの馬を中心に据えるか」をどう決めているのか。そのアルゴリズム設計とスコアリング、さらに買い目までどう落とし込んでいるかを整理します📘🎯🐎
予想は、自分の買わない癖を守ったうえで買う。その選び方を、次回は深掘りします。