競馬予測モデルのための機械学習入門

競馬予測モデルのための機械学習入門

AIに実装を任せても、設計・評価・改善を判断できるロードマップ

Codex / 鈴垣美影

機械学習初心者が、競馬予測モデルの目的変数、オッズ、期待値、評価指標、live OOS、候補モデル運用を自分の言葉で説明できるようになるための入門書。

概要音声

読む前に全体の道筋を30秒で確認できます。

目次

章メモ

各章のメモはこのブラウザに自動保存されます。後から育てる材料にする時は、JSONを書き出してください。

Chapter 01

機械学習はパラメーターいじりではなく、関係を学ぶ仕組み

最初の誤解は、機械学習を「パラメーターをいじって当たる形を探すもの」と見てしまうことです。実務では、むしろ「どの入力が、どの結果と、どの条件で関係しているのか」を学ばせる仕組みとして見る方が安定します。

定義

機械学習とは、データの中にある入力と結果の関係を、モデルが損失を下げる方向に学ぶ仕組みです。ここでいう損失とは、予測と実際のズレを数値化したものです。

日常例なら、天気、気温、曜日から『傘が売れそうか』を予測するようなものです。人間が全部の条件分岐を書くのではなく、過去の販売データから関係を学ばせます。

競馬例なら、距離、馬場、枠、馬の近走、騎手、調教、オッズなどから『この馬が勝つ確率』や『複勝圏に入る確率』を推定します。モデルは魔法ではなく、過去データに見える関係を使って未来に近いレースを推測します。

要点

パラメーター調整は機械学習の一部ですが、中心ではありません。中心は、どんな問題を解かせるか、何を入力にするか、何を正解として学ばせるか、どう評価するかです。

競馬予測で意思決定者が見るべき問いは、『LightGBMのnum_leavesはいくつか』より先に、『そのモデルは勝率を推定しているのか、買い目を選んでいるのか、期待値を直接狙っているのか』です。

実装はAIやCodexに任せられます。でも、AIに任せる指示が『なんか当たるようにして』だと、出てくる実験は偶然当たっただけのものになりがちです。

比較

悪い見方は『パラメーターを増やして、バックテストが良くなる組み合わせを探す』です。この見方だと、過去にだけ合う設定を見つけた時にも成功に見えます。

良い見方は『どの情報から、どの確率を、どの時点で予測するのか』を固定し、その上でモデルの表現力や学習条件を調整することです。

つまり、調整の前に設計があります。目的変数、特徴量、データ分割、評価指標が先で、ハイパーパラメーター探索はその後です。

具体例

同じ過去レースデータでも、『勝つかどうか』を学ばせるのと、『複勝圏に入るか』を学ばせるのでは、正解ラベルが変わります。正解ラベルが変われば、モデルが学ぶ関係も変わります。

たとえば長距離で末脚がある馬は複勝率には効くが勝率にはそこまで効かないかもしれません。逆に逃げ馬の単騎逃げは勝率に効きやすいが、崩れる時は複勝圏外まで落ちるかもしれません。

この違いを説明できるようになると、AIに『勝率モデルと複勝率モデルを別々に作って、校正とROIを比較して』と指示できます。これは単なるパラメーターいじりではありません。

くろだ向け実務メモ

モデル改善の相談をAIに投げる時は、最初に『いま何を予測しているモデルか』を一文で固定してください。例: T-5時点で各馬の単勝勝率を推定するモデル。

次に『その予測をどう買い判断に変えるか』を別の一文で固定します。例: 自分の勝率が市場確率より一定以上高い時だけpaper_betsに出す。

この二文がない改善案は、だいたい評価が混ざります。モデルの話なのか、買い目ルールの話なのか、検証基盤の話なのかを分けてください。

出典メモ

特徴量とラベルの関係、損失を下げる学習、パラメーターとハイパーパラメーターの違いは、Google Machine Learning Crash Courseの説明と整合するように整理しています。

機械学習は、つまみを適当に回す作業ではなく、特徴量と結果の関係を学ぶ作業として見る。
機械学習は、つまみを適当に回す作業ではなく、特徴量と結果の関係を学ぶ作業として見る。

理解チェック

Q1機械学習を競馬予測で使う時、最初に固定すべき問いはどれですか。

Q2『過去では当たった』だけで本番投入しにくい理由はどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 機械学習は入力と結果の関係を損失が下がるように学ぶ仕組み。
  • パラメーター調整より先に、目的変数・特徴量・評価設計を決める。
  • 意思決定者は、モデルが何を予測しているかを説明できる必要がある。

Chapter 02

競馬予測でいう特徴量・目的変数・モデル

用語が混ざると、AIへの依頼も評価も混ざります。この章では、競馬予測モデルを一つの工場として見て、どの部品が何を担当しているかを整理します。

定義

特徴量とは、モデルに渡す入力情報です。競馬なら、距離、馬場状態、枠順、斤量、脚質、前走内容、騎手、調教師、調教時計、人気、T-5オッズなどが候補になります。

目的変数とは、モデルに予測させたい正解です。『勝ったか』『3着以内に入ったか』『期待値プラスだったか』のように、学習時の答えとして用意します。

モデルとは、特徴量から目的変数を予測する関数の形です。LightGBM、XGBoost、ロジスティック回帰、ニューラルネットなどは、関係を表現するための道具です。

パラメーターとハイパーパラメーター

パラメーターとは、学習によってモデル内部に決まる値です。線形モデルなら重み、木モデルなら分岐条件や葉の値がそれに近い役割を持ちます。

ハイパーパラメーターとは、学習前に人間やAIが決める設定です。木の深さ、学習率、正則化、試行回数などが該当します。

日常例でいえば、料理の味そのものがパラメーター、火加減や調理時間の方針がハイパーパラメーターです。競馬MLでは、モデルが学んだ『距離適性の重み』はパラメーター、木の深さをいくつにするかはハイパーパラメーターです。

比較

特徴量を増やすこと、目的変数を変えること、モデルを変えること、評価指標を変えることは、全部違う実験です。

たとえば『T-5オッズを特徴量に入れる』のは入力の変更です。『勝率ではなく複勝率を予測する』のは目的変数の変更です。『LightGBMからXGBoostへ変える』のはモデルの変更です。

これらを一度に変えると、改善した理由がわかりません。意思決定者は、改善実験を一つずつ分ける設計をAIに要求する必要があります。

具体例

単勝勝率モデルなら、1頭1行のデータを作り、目的変数はその馬が勝ったら1、負けたら0です。モデル出力は『この馬が勝つ確率』です。

複勝率モデルなら、目的変数は3着以内なら1、それ以外なら0です。モデル出力は『この馬が複勝圏に入る確率』です。

期待値プラス分類なら、あるオッズと払戻条件に基づいて『買えば期待値がプラスだったか』を正解にします。ただし、この正解はオッズの時点、手数料、馬券種、買い方に強く依存します。

くろだ向け実務メモ

モデル比較表には、最低限 `features_version`, `target_definition`, `odds_snapshot`, `split_policy`, `metric_set` を入れてください。モデル名だけでは再現性が足りません。

『勝率モデルv3』のような名前だけではなく、『win_prob_T5_no_final_odds_time_split_2024Q4』のように、何を予測し、どの時点の情報を使うかが見える名前にします。

AIに実装させる時は、特徴量追加と目的変数変更を同じPRに混ぜない方がレビューしやすいです。

出典メモ

GoogleのML教材では、feature、label、model、parameter、hyperparameterを区別して説明しています。この本ではそれを競馬予測に対応させています。

特徴量は入力、目的変数は学習時の正解、モデルは入力から予測を作る関数として分ける。
特徴量は入力、目的変数は学習時の正解、モデルは入力から予測を作る関数として分ける。

理解チェック

Q1『前走上がり3F』はどれに近いですか。

Q2『この馬が勝ったら1、負けたら0』は何ですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 特徴量は入力、目的変数は正解、モデルは入力から予測を作る仕組み。
  • パラメーターは学習で決まる値、ハイパーパラメーターは学習前に決める設定。
  • 実験では、特徴量・目的変数・モデル・評価を混ぜずに記録する。

Chapter 03

勝率を予測するモデルと、利益を出す判断は別物

競馬MLで一番大事な分岐です。モデルが出す確率は『起きやすさ』であり、買うかどうかは『その確率に対して価格が安いか』です。

定義

勝率予測とは、各馬が勝つ確率を推定することです。たとえばモデルがA馬に0.28を出したなら、似た条件のレース群ではA馬が約28%勝つと見ている、という意味です。

利益判断とは、その確率とオッズを比較して、買う価値があるかを決めることです。小数オッズなら、1単位賭けた時の期待値は、おおまかに `推定確率 × オッズ - 1` で見られます。

日常例なら、商品が良いかどうかと、今の値段で買うべきかは別です。良い商品でも高すぎれば見送り、普通の商品でも安すぎれば買いになることがあります。

要点

勝率が高い馬は、たいてい人気になり、オッズが低くなります。人気馬を当てる能力だけでは、払戻が見合うとは限りません。

逆に勝率が低い馬でも、市場がさらに低く見積もっていてオッズが高すぎるなら、期待値はプラスになりえます。

競馬MLの利益判断は、『当たりそうか』ではなく『市場価格より自分の推定が高いか』です。

比較

モデル出力だけで買うルールは危険です。たとえば勝率30%以上を全部買うルールは、オッズ1.5倍の馬も、4.0倍の馬も同じように扱ってしまいます。

買い判断では、推定勝率と市場確率の差を見ます。小数オッズ4.0なら暗黙確率は25%程度です。モデルが35%と見ているなら差があります。

この差が、いわゆる市場の歪みです。モデル上は `p_model - p_market`、または `p_model × odds - 1` のように表現できます。

具体例

A馬: モデル勝率40%、オッズ2.0。期待値は 0.40 × 2.0 - 1 = -0.20 です。かなり勝ちそうでも、この価格では割高です。

B馬: モデル勝率18%、オッズ7.0。期待値は 0.18 × 7.0 - 1 = +0.26 です。勝率は低いですが、価格が十分高ければ買う理由があります。

100%当たるなら、オッズが1.0を超える限り利益です。でも現実の予測は100%ではありません。だから『的中率』ではなく『確率と価格の差』を見る必要があります。

くろだ向け実務メモ

`paper_bets` には、モデル確率、使用したオッズ、暗黙確率、期待値、閾値、買い判定理由を同じ行に残してください。後で負けた時に、モデルが悪いのか価格が悪いのか分けられます。

勝率モデルを差し替えた時は、買い目抽出ルールを同時に変えないでください。そうしないと、ROI改善がモデル由来なのかルール由来なのかわかりません。

くろだくんの役割は、『当たりそう』という感覚を、『どの価格なら買えるか』に翻訳することです。

出典メモ

小数オッズの暗黙確率は 1 / odds で近似できます。競馬の控除やブックメーカーのマージンがある場合は、その分を補正して見る必要があります。

勝率予測は前段、買うかどうかはオッズ比較を含む後段の意思決定。
勝率予測は前段、買うかどうかはオッズ比較を含む後段の意思決定。

理解チェック

Q1モデル勝率30%、小数オッズ2.0の単勝を1単位買う時、期待値の見方として近いものはどれですか。

Q2市場の歪みをモデル上で見る時に近い表現はどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 勝率予測は起きやすさ、利益判断は価格との比較。
  • 高勝率でもオッズが低すぎれば期待値はマイナスになりうる。
  • 市場の歪みは、モデル確率と市場確率の差として表現できる。

Chapter 04

的中率だけでは勝てない理由

的中率は気持ちよく見える指標です。しかし、馬券で資金を増やすかどうかは、当たる頻度と当たった時の払戻の組み合わせで決まります。

定義

的中率とは、買った馬券のうち当たった割合です。10回買って4回当たれば的中率40%です。

回収率とは、賭けた総額に対して戻ってきた払戻総額の割合です。10,000円賭けて11,000円戻れば回収率110%です。

ROIとは、投下資金に対する利益率です。賭け金10,000円、払戻11,000円なら利益1,000円なのでROIは10%です。回収率110%とROI10%は同じ状況を別の表し方で見ています。

的中率が高くても負ける例

100回買って60回当たり、毎回オッズ1.4倍だったとします。1回100円なら賭け金は10,000円、払戻は60 × 140円 = 8,400円です。的中率60%でも1,600円負けます。

この例では、当たる頻度は高いですが、当たった時の払戻が低すぎます。期待値は 0.60 × 1.4 - 1 = -0.16 です。

人気馬中心のモデルはこの罠に入りやすいです。勝ちそうな馬は市場も評価しているので、オッズが下がります。

的中率が低くても勝てる例

100回買って18回しか当たらず、平均オッズ7.0倍だったとします。1回100円なら賭け金は10,000円、払戻は18 × 700円 = 12,600円です。的中率18%でも2,600円勝ちます。

この例の期待値は 0.18 × 7.0 - 1 = +0.26 です。低的中率でも、価格が十分に高ければプラスになります。

ただし、低的中率戦略は分散が大きいです。短期間の負けが普通に起きます。だからROIだけでなく、件数、ドローダウン、CLV、長期OOSを見ます。

比較

的中率は『当たりやすさ』を見ます。ROIと回収率は『資金が増えたか』を見ます。CLVは『買った価格が、締切時点の価格より良かったか』を見ます。

どれか一つだけでは足りません。的中率だけだと価格を見落とし、ROIだけだと少数の大当たりに騙され、CLVだけだと精算結果を見落とします。

利益判定では、買い目数、平均オッズ、的中率、回収率、ROI、CLVを一緒に見ます。

くろだ向け実務メモ

月次レポートでは、的中率を先頭に置かない方がいいです。先頭は `bet_count`, `stake`, `return`, `ROI`, `CLV`, `calibration` にして、的中率は補助にします。

大穴が一発当たった月は、ROIが跳ねます。その時こそ、CLVと買い目の期待値分布を見てください。たまたま当たったのか、価格を取り続けているのかを分けます。

`paper_bets` が0件の時は、的中率もROIも計算できません。それは『負けていない』ではありますが、『勝てる証拠』ではありません。

的中率が高くても払戻が低いと負け、的中率が低くても価格が良ければ勝てる。
的中率が高くても払戻が低いと負け、的中率が低くても価格が良ければ勝てる。

理解チェック

Q1的中率60%、平均オッズ1.4倍の戦略は、簡易期待値でどう見えますか。

Q2ROIだけを短期間で見る危険はどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 的中率は当たりやすさ、回収率とROIは資金結果を見る。
  • 100%当たるなら利益だが、現実には確率が不確実なのでオッズ比較が必要。
  • 利益判定は、的中率・平均オッズ・ROI・CLV・件数をセットで見る。

Chapter 05

オッズ、市場確率、期待値

競馬MLで利益を狙うとは、市場が付けた価格と、自分のモデルが見る確率のズレを探すことです。この章では、オッズを確率として読む練習をします。

定義

小数オッズとは、1単位賭けて当たった時に戻る総額の倍率です。オッズ5.0なら、100円が500円として戻ります。利益は400円です。

市場確率とは、オッズから逆算される市場の見立てです。小数オッズなら単純には `1 / オッズ` で暗黙確率を見ます。オッズ5.0なら20%です。

期待値とは、同じ条件を何度も繰り返した時の平均的な損益見込みです。単勝の簡易式なら `自分の推定確率 × オッズ - 1` です。

要点

買う理由は、オッズが高いことではありません。自分の推定確率に対してオッズが高いことです。

たとえばオッズ20倍でも、勝率が3%しかないなら期待値は 0.03 × 20 - 1 = -0.40 です。高配当でも割高です。

逆にオッズ3倍でも、勝率45%と見られるなら 0.45 × 3 - 1 = +0.35 です。オッズが低めでも価格が良ければ候補になります。

市場確率と自分の推定確率

市場確率は、他の参加者の評価が集まった価格です。完全ではありませんが、かなり強いベースラインです。

自分の推定確率は、モデルが特徴量から出した見立てです。ここにはモデルの誤差、校正ズレ、データの偏りが入ります。

狙うのは、`自分の確率 > 市場確率 + 安全マージン` の場所です。安全マージンを置くのは、モデル確率が完璧ではないからです。

T-5オッズとfinalオッズ

T-5オッズとは、発走約5分前など、買い判断時点で観測できるオッズです。モデルが本番で使える情報として扱えます。

finalオッズとは、締切後に確定した最終オッズです。精算ROIや最終的な市場評価を見るには必要ですが、買い判断時点ではまだ確定していません。

T-5で買い判断をしたのに、学習や選別にfinalオッズを混ぜると、未来データ混入に近い問題が起きます。finalは精算・CLV・事後分析に使い、買い判断の特徴量には原則として入れません。

CLVの役割

CLV、Closing Line Valueは、買った時のオッズが締切時点のオッズより良かったかを見る考え方です。単純には、買値がfinalより有利なら、市場が後から自分側に寄った可能性があります。

CLVは利益そのものではありません。買い目が外れれば精算損益はマイナスです。ただし、長期でCLVが良いなら、価格を取れている兆候として見られます。

競馬では締切直前にオッズが動きます。T-5で見えていた期待値がfinalでは消えることもあります。だから、T-5期待値、final精算ROI、CLVを別々に記録します。

くろだ向け実務メモ

`paper_bets` には `odds_snapshot=T-5` と `settlement_odds=final` を分けて保存してください。買う時に見えていた価格と、精算された価格を混同しないためです。

T-5ではプラスだったのにfinalでマイナスになった馬が多いなら、締切直前のオッズ変動を織り込む改善が候補です。ただし、それはモデル改善ではなく市場変動予測や執行設計の改善かもしれません。

『市場の歪みを取る』とは、派手な穴馬を当てることではなく、確率に対して安く売られている馬を継続的に見つけることです。

出典メモ

小数オッズと暗黙確率、CLVの説明は、Pinnacle系の解説と、競馬市場効率性に関する研究を参照して初心者向けに再構成しています。

市場確率と自分の推定確率の差を見て、期待値が残る場所だけを買い候補にする。
市場確率と自分の推定確率の差を見て、期待値が残る場所だけを買い候補にする。

理解チェック

Q1小数オッズ5.0の暗黙確率に近いものはどれですか。

Q2T-5オッズとfinalオッズの使い分けとして近いものはどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • オッズは市場が示す価格であり、暗黙確率に変換して読める。
  • 期待値は自分の推定確率と市場価格の差から生まれる。
  • T-5、final、CLVは役割が違うので別々に保存する。

Chapter 06

目的変数をどう設計するか

この本の中心章です。競馬MLの多くの失敗は、モデルが悪いというより、何を正解として学ばせるかが曖昧なことから始まります。

定義

目的変数は、モデルが学習時に当てにいく正解です。競馬では、勝つ、複勝圏に入る、期待値プラスだった、ROIが高かった、などが候補になります。

勝率モデルは、単勝で勝ったかどうかを目的変数にします。出力は勝つ確率です。

複勝率モデルは、3着以内など複勝圏に入ったかを目的変数にします。出力は複勝圏確率です。

勝率モデル

勝率モデルのメリットは、目的がシンプルで解釈しやすいことです。『この馬が勝つ確率』は、オッズ比較、期待値計算、校正確認に直接使えます。

危険性は、勝つというイベントが少ないため、サンプル効率が悪く、レースや人気の偏りを受けやすいことです。また、勝率が高い馬ほど市場も評価しているので、利益とは別に見る必要があります。

勝率モデルは、単勝の期待値判断や、勝ち切る能力を評価したい時に向きます。

複勝率モデル

複勝率モデルのメリットは、勝率よりイベント数が多く、学習が安定しやすいことです。初心者には、確率校正の練習にも向きます。

危険性は、複勝圏に入る能力と単勝で勝ち切る能力が同じではないことです。複勝率が高いから単勝を買う、という変換は雑です。

複勝率モデルは、複勝やワイド、保守的な買い目候補の評価に向きます。ただし、馬券種ごとの払戻構造と必ず合わせます。

期待値プラス分類

期待値プラス分類は、『この馬をこの条件で買えば期待値がプラスだったか』を直接当てにいく設計です。直感的には、利益に近い正解を学ばせるので魅力的に見えます。

しかし危険が多いです。第一に、期待値プラスかどうかはオッズ時点に強く依存します。T-5なのかfinalなのかで正解が変わります。

第二に、真の期待値は観測できません。観測できるのは、結果として当たったか外れたか、または後から見たオッズとの関係です。これは直接ラベルではなく代理ラベルになりやすいです。

第三に、少数の高配当や外れの偶然でラベルが荒れます。『期待値プラスだったはず』と『たまたま当たった』を混同しやすくなります。

第四に、finalオッズや確定払戻を正解作成に使うと、買い判断時点では見えない情報が混入する危険があります。

ROI直接最適化

ROI直接最適化は、モデルやルールを直接ROIが高くなるように選ぶ考え方です。目的に近いので強そうに見えます。

危険性は、ROIがノイズの大きい指標であることです。買い目数が少ないと、1本の高配当で最適化結果が大きく変わります。

また、ROIを探索の目標にしすぎると、過去の偶然に合ったルールを拾いやすくなります。研究ラインでは見てもよいですが、official_evalでの最終判定とは分けるべきです。

なぜまず勝率・複勝率が扱いやすいのか

勝率や複勝率は、レース結果から比較的まっすぐ作れる目的変数です。モデル出力が確率なので、校正、LogLoss、AUC、市場確率比較に使いやすいです。

オッズは後段で使うと、モデルの確率品質と買い判断の品質を分けて診断できます。確率は良いが買いルールが悪いのか、確率自体が悪いのかを分解できます。

期待値プラスを直接学習すると、この分解が難しくなります。モデルが価格を学んだのか、結果を学んだのか、オッズ変動を拾ったのかが見えにくくなります。

したがって最初の基本形は、勝率または複勝率を予測し、後段でT-5オッズと比較し、final精算とCLVで評価する流れです。

くろだ向け実務メモ

最初の標準ラインは `win_prob` と `place_prob` を別モデルで作るのが扱いやすいです。どちらも確率として校正し、オッズ比較は後段に切り出します。

`expected_value_positive` は研究テーマとしてはありです。ただし、必ず `odds_snapshot`, `label_formula`, `minimum_bet_count`, `leakage_check` をセットにしてください。

`ROI直接最適化` は official_eval の主役にしないでください。研究ラインで候補を作り、凍結した評価窓で最後に確認する使い方が安全です。

出典メモ

Googleのラベル解説では、直接ラベルと代理ラベルを区別します。期待値プラス分類は、競馬では代理ラベルになりやすい点に注意が必要です。

目的変数には勝率、複勝率、期待値プラス、ROI直接最適化がある。最初は確率モデルから分けて作る方が診断しやすい。
目的変数には勝率、複勝率、期待値プラス、ROI直接最適化がある。最初は確率モデルから分けて作る方が診断しやすい。

理解チェック

Q1初心者が最初に扱いやすい基本形はどれですか。

Q2期待値プラス分類が危ない理由として近いものはどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 目的変数は、モデルが何を正解として学ぶかを決める設計の中心。
  • 勝率・複勝率モデルは、確率として校正しやすく、オッズ比較と分けやすい。
  • 期待値プラス分類やROI直接最適化は研究候補だが、リークと過学習に強く注意する。

Chapter 07

過学習とリーク

競馬MLでは、過去データに強く見えるモデルほど危ないことがあります。過学習とリークは、見かけの成績を良くして本番成績を悪くする代表的な原因です。

定義

過学習とは、モデルが過去データの本質的な関係ではなく、偶然の細部まで覚えてしまうことです。テスト勉強で答えの並びだけ覚えるようなものです。

リークとは、予測時点では使えない情報が学習や評価に入り込むことです。scikit-learnの説明でも、予測時点で利用できない情報をモデル構築に使うと、評価が楽観的になるとされています。

未来データ混入とは、時系列上で未来にしかわからない情報を、過去の予測に使ってしまうことです。競馬ではfinalオッズ、確定払戻、レース後指数などが典型です。

要点

過学習は、過去では良く、本番で悪く見えます。リークは、過去評価を不自然に良く見せます。未来混入は、実運用では再現できない強さを作ります。

これらは、モデル実装のバグだけではありません。データ定義、特徴量作成、分割方法、評価窓、集計タイミングの設計ミスとして起きます。

競馬予測では、日付、発走時刻、オッズ取得時刻、結果確定時刻を持たないデータは危険です。『いつ見えた情報か』を記録しないと、リークを検査できません。

具体例

レース後に更新された馬の能力指数を、発走前予測の特徴量に入れてしまうとリークです。モデルは未来の結果を薄く読んでしまいます。

T-5で買い判断するはずなのに、finalオッズを特徴量に入れるのも危険です。finalは締切後の市場情報を含みます。

同じレース内の他馬結果を使って、ある馬の勝敗を予測する特徴量を作るのも危険です。レース単位の集計は、予測時点で使える形に制限する必要があります。

比較

過学習は、モデルが複雑すぎる、特徴量が多すぎる、探索回数が多すぎる、評価窓が小さすぎる時に起きやすいです。

リークは、使ってはいけない情報が混ざる時に起きます。モデルが単純でも、リークがあれば成績は良く見えます。

未来混入は、時系列タスク特有のリークです。競馬は時間が本質なので、ランダム分割だけでは見逃しやすいです。

くろだ向け実務メモ

全特徴量に `available_at` を持たせる設計をAIに要求してください。発走前に見える情報か、締切後にしか見えない情報かを機械的に検査できます。

新しい特徴量が強すぎる時は、まずリークを疑います。『なぜ効くのか』を説明できない強特徴は、候補入り前に入手時刻を確認します。

official_evalに入れる前に、特徴量一覧、オッズ時点、目的変数、分割方法のリークレビューを1枚にまとめる運用にしてください。

出典メモ

データリークの定義と、評価が楽観的になり本番で悪化する説明は、scikit-learnのCommon pitfallsを参照しています。

過学習・リーク・未来混入は、過去評価をよく見せるが本番では再現できない。
過学習・リーク・未来混入は、過去評価をよく見せるが本番では再現できない。

理解チェック

Q1T-5で買うモデルにfinalオッズを特徴量として入れる問題は何ですか。

Q2新特徴量を入れたら急に成績が跳ねた時、まず確認すべきことはどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 過学習は過去の偶然を覚え、リークは使えない情報を混ぜる。
  • 競馬ではfinalオッズ、確定払戻、レース後指数の扱いに注意する。
  • 特徴量には、いつ利用可能だったかを記録する。

Chapter 08

データ分割とlive OOS評価

モデルを作るだけなら全データで学習すればよさそうに見えます。しかし、目的は過去に合うことではなく、未来のレースで判断できることです。

定義

trainは、モデルを学習させるデータです。validationは、ハイパーパラメーターやルールを調整するための検証データです。

testは、最後の確認に使うデータです。何度も見て調整するとtestではなくなります。

time splitとは、時間順に過去で学習し、未来側で評価する分割です。競馬のような時系列データでは、ランダム分割より現実に近いです。

live OOSとは、モデル作成後に実際に流れてくる新しいレースで、事前に決めたルールのまま評価することです。OOSはout-of-sample、学習外データという意味です。

要点

過去データを使ったvalidationは、研究には必要です。しかし、何度も見ているうちに、その窓に合った選択をしてしまいます。

testは最後の試験ですが、それでも過去データです。市場環境、データ取得、オッズ変動、馬場傾向、出走構成は変わります。

live OOSは、実運用での再現性を測るために必要です。モデルもルールも固定し、事前に見えていた情報だけでpaper_betsを出します。

なぜ過去で良いモデルが本番で崩れるか

第一に、探索しすぎると過去の偶然に合ったモデルを拾います。100個試せば、たまたま良いモデルが出ます。

第二に、市場が変わります。騎手、調教師、馬場、オッズ参加者、データ提供元、締切直前の資金流入が変われば、過去の関係が弱くなります。

第三に、実装差が出ます。学習時にはきれいだった特徴量が、本番では欠損、遅延、時刻ズレを起こします。GoogleのRules of MLでいうtraining-serving skewに近い問題です。

paper_betsとfinal精算

`paper_bets` は、実際に資金を入れず、事前ルールで買ったことにする記録です。賭ける前に評価基盤を作るための安全な運用です。

paper_betsには、予測時刻、モデルバージョン、特徴量バージョン、T-5オッズ、買い理由、期待値、閾値を保存します。

レース後にfinalオッズと結果で精算し、ROIや回収率を出します。ここで初めて、買い判断が実際の精算にどうつながったかを見ます。

paper_betsが0件の意味

paper_betsが0件なら、現在のモデルと閾値では買い条件を満たす馬がなかった、という意味です。

これは『モデルが悪い』とは限りません。市場に歪みが少なかった、閾値が厳しい、モデルが保守的、オッズ取得が欠損、フィルタが壊れている、など複数の可能性があります。

同時に、『負けていないから良い』でもありません。評価する機会がないので、利益性の証拠は増えていません。0件の日は、候補数、閾値直下の馬、オッズ欠損、フィルタ通過数を確認します。

くろだ向け実務メモ

live OOSでは、途中で閾値や買いルールを触らない期間を作ってください。触るなら、その日から別バージョンとして記録します。

0件の日を失敗扱いしすぎないでください。ただし、0件が続くなら `threshold too strict`, `odds feed issue`, `model underconfident`, `market no-edge` のどれかを切り分けます。

評価基盤改善、モデル改善、買いルール改善は、別チケットに分けるのが安全です。

出典メモ

時系列データでは未来側の観測で評価する必要がある点は、scikit-learnのTimeSeriesSplit説明と整合します。本番との差分監視はGoogle Rules of MLのtraining-serving skewの考え方を参照しています。

time splitでは過去で学習し、未来側で検証する。live OOSは作成後の新しいレースで固定ルールを試す。
time splitでは過去で学習し、未来側で検証する。live OOSは作成後の新しいレースで固定ルールを試す。

理解チェック

Q1live OOS評価で避けるべきことはどれですか。

Q2paper_betsが0件の時に正しい解釈はどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • train/validation/testは、学習・調整・最終確認を分けるためにある。
  • 競馬では時間順分割とlive OOSが重要。
  • paper_bets 0件は、条件未達であり、利益性の証拠ではない。

Chapter 09

評価指標の読み方

指標は道具です。1つの数字で全部を判断しようとすると、モデルの良し悪し、買い判断の良し悪し、運用の良し悪しが混ざります。

LogLoss

LogLossは、確率予測がどれだけ外れたかを評価する指標です。特に、自信満々に間違えると大きく罰します。

競馬では、モデルが勝率80%と言った馬が普通に負けるような過信を見つけやすいです。

ただし、LogLossが良いから利益が出るとは限りません。確率の質を見る指標であり、価格比較を直接見ているわけではないからです。

Calibration

Calibration、校正とは、モデルが出した確率が実際の頻度として解釈できる状態です。たとえば30%と出した馬群が長期で約30%勝つなら、よく校正されています。

校正が悪いと、期待値計算が崩れます。モデルが本当は20%程度の馬を30%と出していれば、オッズ比較で買いすぎます。

競馬で利益判断に確率を使うなら、ランキング能力だけでなく校正が必要です。

AUC

AUCは、陽性例と陰性例をどれだけ正しく順位付けできるかを見る指標です。勝つ馬を負ける馬より上に並べられるかを測るイメージです。

AUCが高いモデルは、候補の順位付けがうまい可能性があります。しかし、確率の絶対値が正しいとは限りません。

AUCが良くても、30%と出した確率が実際は20%なら、期待値判断では危険です。

ROIと回収率

ROIは、投下資金に対してどれだけ利益が出たかを見る指標です。回収率は払戻総額を賭け金で割ったものです。

ROIと回収率は、最終的な資金結果に近い指標です。ただし、買い目数が少ないと分散が大きく、偶然に強く引っ張られます。

そのため、ROIは `bet_count`, `stake`, `average_odds`, `confidence_interval` に近い不確実性メモと一緒に見ます。

CLV

CLVは、買った時の価格が締切時点の価格より良かったかを見ます。長期でCLVが良ければ、市場が後から自分の方向へ動いた可能性があります。

CLVは、短期の当たり外れに左右されにくい価格取得の指標として使えます。ただし、finalオッズを真の確率とみなせるわけではありません。

競馬では締切直前のオッズ変動が大きいので、CLVは重要ですが万能ではありません。精算ROIとセットで見ます。

比較

LogLossは確率予測の罰、Calibrationは確率の信頼性、AUCは順位付け、ROIと回収率は資金結果、CLVは価格取得を見ます。

モデル改善ではLogLoss、Calibration、AUCを見ます。買い判断改善ではROI、回収率、CLV、閾値別成績を見ます。

official_evalでは、これらをあらかじめ固定した表で見ます。後から都合の良い指標だけ選ぶと、研究ではなく後付けになります。

くろだ向け実務メモ

モデル候補を採用する条件を、先に文章で決めてください。例: live OOSでbet_countが最低100、CLVがプラス傾向、ROIが大きく悪化せず、Calibrationが現行より悪化しない。

ROIが良くてもLogLossとCalibrationが悪化しているモデルは、たまたま買い目が当たっただけかもしれません。

AUCが上がってもROIが出ない場合は、順位付けは改善したが価格差のある馬を見つけていない可能性があります。

出典メモ

LogLoss、Calibration、AUCの説明はscikit-learnの公式ドキュメントを参照しています。CLVはPinnacleの解説を、競馬での使い方に合わせて説明しています。

LogLoss、Calibration、AUC、ROI、回収率、CLVは、それぞれ違う失敗を検出する。
LogLoss、Calibration、AUC、ROI、回収率、CLVは、それぞれ違う失敗を検出する。

理解チェック

Q1AUCが高いのに期待値判断が危ないケースはどれですか。

Q2CLVが主に見ているものはどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • LogLossとCalibrationは確率品質、AUCは順位付けを見る。
  • ROIと回収率は資金結果、CLVは価格取得を見る。
  • 1つの指標ではなく、役割別に固定した評価表で判断する。

Chapter 10

候補モデルを大量に回す研究ラインの作り方

AIやCodexに任せると、候補モデルを大量に作れます。これは強みです。ただし、大量探索は過去の偶然を拾う力も強くします。

定義

`offline_sweep` とは、過去データ上で特徴量、モデル、ハイパーパラメーター、閾値などを大量に試す研究ラインです。

`research_obs` とは、研究用に観測した結果や仮説メモです。正式な採用判定ではなく、次の候補を作るための材料です。

`candidate_backlog` とは、良さそうだがまだ採用していない候補の待機リストです。

`official_eval` とは、事前に固定したルールで、候補を正式に評価する場所です。

要点

offline_sweepは探索に向いています。未知の特徴量、目的変数、閾値、モデル構造を試す場です。

しかし、offline_sweepの一番良い結果をそのまま本番に出すのは危険です。大量に試した分だけ、過去に偶然合った候補を拾いやすくなります。

候補はcandidate_backlogに置き、リークチェック、再現性確認、別期間評価、live OOSで段階的に絞ります。

具体例

AIに100パターンの特徴量セットを作らせ、過去3年でROIを比較したとします。その中でROI180%の候補が出ても、まず疑います。

疑うポイントは、買い目数が少なすぎないか、finalオッズが混ざっていないか、特定期間の大穴に依存していないか、閾値を後から合わせていないかです。

それを通過した候補だけをbacklogに入れ、固定ルールで別期間に回します。そこで初めて、採用議論の入り口です。

研究ラインの設計

offline_sweepの出力は、モデルファイルだけでは足りません。実験ID、入力データ版、特徴量版、目的変数、分割、評価窓、指標、乱数シード、生成したAI指示を残します。

research_obsには、『なぜ良さそうに見えたか』『どのリスクが残るか』『次に検証すること』を短く書きます。

candidate_backlogには、採用待ち候補を状態付きで置きます。例: `needs_leakage_review`, `needs_live_oos`, `rejected_low_bet_count`, `ready_for_official_eval`。

くろだ向け実務メモ

AIに大量実験を依頼する時は、最初に『official_evalには触らない』と指示してください。研究ラインが正式評価を汚さないようにします。

候補モデルの採用理由は、ROIだけでなく『どの仮説が支持されたか』で書かせます。例: T-5からfinalへのオッズ低下を拾える馬は、CLVが改善した。

backlogの候補が多すぎる時は、採用候補を増やすより、棄却理由を整備した方が前に進みます。

offline_sweepは探索の場。良い候補はすぐ本番へ送らず、backlogと追加検証を通す。
offline_sweepは探索の場。良い候補はすぐ本番へ送らず、backlogと追加検証を通す。

理解チェック

Q1offline_sweepの最高ROI候補をすぐ本番に出しにくい理由はどれですか。

Q2candidate_backlogに残すべき情報として近いものはどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • offline_sweepは探索、research_obsは観測メモ、candidate_backlogは採用前の待機場所。
  • 大量探索の最高成績は、過去の偶然を拾った可能性がある。
  • 候補はリーク確認、別期間評価、live OOSを通してから採用判断する。

Chapter 11

official_eval / research_obs / offline_sweep の運用設計

良いモデルを作るには、研究の自由さと、評価の厳格さを両方持つ必要があります。自由な研究ラインだけでは過学習し、厳格な評価だけでは改善候補が出ません。

定義

`official_eval` は、正式な利益判定用の評価レーンです。評価対象、期間、指標、買いルール、オッズ時点を事前に固定します。

`research_obs` は、研究観測レーンです。探索結果、仮説、失敗例、怪しい改善案を記録しますが、正式な成績としては扱いません。

`offline_sweep` は、過去データを使って大量に実験するレーンです。候補発見のための場であり、採用判定の場ではありません。

なぜ分けるのか

official_evalを研究のたびに見て調整すると、official_eval自体に過学習します。最終試験の答えを見ながら勉強法を変えるようなものです。

research_obsを禁止すると、改善候補が出ません。自由に試す場所は必要です。ただし、そこで得た数字を正式な利益証拠にしてはいけません。

offline_sweepは仮説生成装置です。過去で良い候補を発見する力はありますが、未来で通用する証明にはなりません。

評価基盤改善とモデル改善を混ぜない

評価基盤改善とは、データ取得、オッズ保存、精算ロジック、CLV計算、メモ出力、レポート形式を改善することです。

モデル改善とは、特徴量、目的変数、アルゴリズム、校正、閾値などを変えることです。

この2つを同時に変えると、成績が変わった理由がわかりません。まず評価基盤を安定させ、その上でモデルを比較します。

推奨フロー

1. offline_sweepで候補を作る。2. research_obsに観測と仮説を書く。3. candidate_backlogへ入れる。4. リークレビューを通す。

5. 別期間の固定評価を行う。6. live OOSでpaper_betsを出す。7. official_evalで採用判定する。8. 採用または棄却理由を残す。

この流れなら、AIに大量実装を任せても、くろだくんが『どこまで証拠がある候補か』を判断できます。

くろだ向け実務メモ

official_evalの定義ファイルは、人間がレビューして固定します。AIが勝手に変更できないようにするのが理想です。

research_obsには、失敗した実験も残してください。後から同じ方向をAIが再提案した時に、棄却理由を参照できます。

candidate_backlogの状態遷移を決めると、判断が楽になります。例: `proposed -> leakage_reviewed -> live_oos_running -> official_eval_ready -> accepted/rejected`。

official_eval、research_obs、offline_sweepは役割を分ける。研究の自由さと正式評価の厳格さを混ぜない。
official_eval、research_obs、offline_sweepは役割を分ける。研究の自由さと正式評価の厳格さを混ぜない。

理解チェック

Q1official_evalを研究のたびに見て調整する危険はどれですか。

Q2評価基盤改善とモデル改善を同時に行う問題はどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • official_evalは正式判定、research_obsは研究観測、offline_sweepは探索。
  • 評価基盤改善とモデル改善を同時に混ぜると判断不能になる。
  • AIに任せるほど、固定評価レーンを人間が守る必要がある。

Chapter 12

くろだが今後モデル改善を判断するためのチェックリスト

ここまでの内容を、実務の確認リストにまとめます。AIやCodexが実装した候補を、くろだくんが判断するための順番です。

定義

改善判断とは、候補モデルや候補ルールを本番またはlive OOSへ進めるか、保留するか、棄却するかを決めることです。

判断は、単発のROIではなく、目的変数、特徴量、オッズ時点、リーク、分割、確率品質、価格取得、資金結果を合わせて行います。

この章のチェックリストは、実装者ではなく意思決定者としてのくろだくん用です。

チェック1: 何を予測しているか

候補モデルの目的変数を一文で説明できるか確認します。勝率、複勝率、期待値プラス分類、ROI直接最適化のどれか。

目的変数が変わったなら、現行モデルとの比較は慎重にします。勝率モデルと複勝率モデルを同じLogLossだけで横並びにしても、意味がずれます。

期待値プラスを直接学習しているなら、正解ラベルの作り方、オッズ時点、リークチェックを必ず確認します。

チェック2: 予測時点で見える情報だけか

特徴量の `available_at` を確認します。T-5で買うなら、T-5時点で見える情報だけを使っている必要があります。

finalオッズ、確定払戻、レース後指数、レース後に更新された能力値が混ざっていないかを見ます。

リーク疑いが解消できない候補は、成績がどれだけ良くても採用しません。

チェック3: 確率として信用できるか

勝率や複勝率モデルなら、LogLossとCalibrationを見ます。30%と言った馬群が本当に30%前後になっているかを確認します。

AUCは順位付けの確認に使いますが、AUCだけで期待値判断に進めません。

確率が過信気味なら、閾値やオッズ比較が壊れます。買い目を減らす前に、校正や確率補正を検討します。

チェック4: 価格を取れているか

T-5期待値がプラスでも、finalでオッズが下がりすぎるなら利益が残らないかもしれません。

CLVを見て、買った価格が締切価格より有利だったか確認します。長期でCLVが悪い候補は、モデルが市場に遅れている可能性があります。

ただし、CLVが良くても精算ROIが伴わない期間はあります。件数と期間を確保して判断します。

チェック5: 評価レーンは汚れていないか

offline_sweepの結果をofficial_evalの成績として扱っていないか確認します。

評価基盤の変更とモデル変更を同時に入れていないか確認します。精算バグ修正の前後でROIが変わったなら、モデルの勝利とは言えません。

live OOSの途中で閾値や買いルールを変えたなら、そこから別バージョンとして集計します。

採用判断テンプレート

採用に進める候補: 目的変数が明確、リークなし、確率品質が悪化しない、価格取得の兆候がある、live OOSで十分な件数がある。

保留する候補: 方向性は良いが件数不足、CLVは良いがROI未確認、校正が少し悪い、データ取得に欠損がある。

棄却する候補: 目的変数が曖昧、final情報が混入、official_evalを見て調整した、少数の大穴だけでROIが良い、再現手順が残っていない。

くろだ向け実務メモ

AIにレビューさせる時は、『この候補を採用すべきか』ではなく、『この候補を採用しない理由を先に列挙して』と聞くと、防御的な判断になります。

次に、『採用に進めるための最小追加検証は何か』を聞きます。追加実験を無限に増やさず、必要な証拠だけを集めます。

最後に、採用・保留・棄却を1行で記録します。意思決定者の価値は、後から見ても判断理由が追えることです。

3行で言うなら

まず、モデルが何を予測しているかを固定する。

次に、見えていた情報だけで予測し、確率と価格を分けて評価する。

最後に、研究ラインと正式評価ラインを分け、live OOSで証拠を積む。

改善判断は、目的・オッズ・リーク・OOS・ROIを順番に確認する。
改善判断は、目的・オッズ・リーク・OOS・ROIを順番に確認する。

理解チェック

Q1候補モデルの採用前に最初に確認すべきことはどれですか。

Q2『採用保留』に近い状態はどれですか。

章メモ

ここに、わかりにくかった所、足してほしい例、後で考えたい問いを残せます。

未入力

3行まとめ

  • 採用判断は、目的変数、情報時点、確率品質、価格取得、評価レーンの順で見る。
  • 期待値プラスやROI直接最適化は魅力的だが、リークと過学習を疑って扱う。
  • AIに実装を任せても、評価ルールを守るのは意思決定者の仕事。

出典メモ