はじめに
前回は各馬の過去走通過順から脚質特徴量を作り、予測精度への貢献を確認しました。 今回はその発展として、今走メンバー全体の脚質構成から「展開圧力」を数値化し、LightGBMの1着予測精度が改善するかを検証しました。
今回確認すること
- 各馬の過去脚質指数から「今走のメンバー全体の展開圧力」を数値化できるか
- 展開圧力特徴量を追加するとLightGBMの1着予測AUCが改善するか
- 馬単体の脚質特徴量と展開圧力特徴量の効果に違いがあるか
- 単騎逃げ候補・前争い候補・後方×高圧力などの条件別に結果に差があるか
- 人気あり・なしで展開圧力特徴量の効果が変わるか
展開圧力とは何か
「展開圧力」とは、今走のメンバー全体を見たときに、前に行きたい馬がどれくらいいるか、という概念です。
逃げ候補が多いレースでは、先頭争いが激化し、前に行く馬の消耗が大きくなりやすいとされます。逆に逃げ候補が1頭だけなら、単騎で楽なペースに持ち込める可能性があります。
今回はこの展開圧力を、各馬の過去走から作った脚質指数を使って数値化しました。
馬単体の脚質特徴量との違い
今回の記事では、以下2種類の特徴量を明確に区別しています。
| 種類 | 内容 |
|---|---|
| 馬単体の脚質特徴量 | その馬自身が過去にどの位置で走ってきたか |
| 展開圧力特徴量 | 今走の出走メンバー全体を見たとき、前に行きたい馬がどれくらいいるか |
馬単体の脚質特徴量は「この馬はどんなタイプか」という情報です。展開圧力特徴量は「このレースはどんな展開になりそうか」という情報です。
展開圧力特徴量は、今走の出走メンバーの過去走脚質指数を使って作ります。今走の通過順・4角位置・脚質ラベル・着順は一切使いません。
使用データ
- データソース: ローカル環境のレース結果データベース(
common.db) - 対象テーブル:
result_table - 目的変数(主):
1着(1着に入るか) - 目的変数(補助):
3着内(3着内に入るか) - 帯広除外: ばんえい競馬(帯広)を除外しました(124,418件)。ばんえい競馬は通常の地方競馬とはレース構造が異なり、通過順・脚質・展開の意味が他場と異なる可能性があります。
| 分割 | 期間 | 件数 | 正例率(1着割合) |
|---|---|---|---|
| 訓練 (train) | 2017-01-01 ~ 2022-12-31 | 787,381 | 0.100 |
| 検証 (valid) | 2023-01-01 ~ 2023-12-31 | 136,354 | 0.100 |
| テスト (test) | 2024-01-01 ~ 2024-12-31 | 138,372 | 0.099 |
通過順の扱い
地方競馬のDBには 通過1〜通過4 のカラムがありますが、短距離レースでは4角まで通過しない場合があります。 そのため、4角固定ではなく、取得できる通過順のうち 最初(first) と 最後(final) を使いました。
通過1, 通過2, 通過3, 通過4 がある場合: first=通過1, final=通過4
通過3, 通過4 だけがある場合: first=通過3, final=通過4
通過1, 通過2 だけがある場合: first=通過1, final=通過2
通過順がない場合: 欠損(NaN)扱い
位置は頭数で正規化しています:
position_rate = (通過順 - 1) / (出走頭数 - 1)
前にいるほど0に近く、後ろにいるほど1に近い値になります。
今回のデータでは、通過順が取得できたレコードは 1,062,107件 / 1,062,107件(100.0%)でした。
馬単体の脚質指数の作り方
展開圧力特徴量を作る土台として、まず各馬の過去走から以下の脚質指数を計算しました。すべての特徴量は shift(1) してから rolling() で計算しており、今走の情報は含まれません。
| 特徴量名 | 定義 | 意味 |
|---|---|---|
avg_first_position_rate | 直近5走のfirst_position_rate平均 | 序盤の位置取り傾向 |
avg_final_position_rate | 直近5走のfinal_position_rate平均 | 終盤の位置取り傾向 |
front_index | 1 - avg_final_position_rate | 高いほど前に行く馬 |
early_front_index | 1 - avg_first_position_rate | 序盤の前傾度 |
closing_index | avg_first_position_rate - avg_final_position_rate | 末脚度(正で末脚タイプ) |
style_stability | 直近5走のfinal_position_rate標準偏差 | 脚質の安定性(低いほど安定) |
front_index は0〜1の値で、1に近いほど普段から前に行く馬、0に近いほど後方になりやすい馬という解釈です。
展開圧力特徴量の作り方
各馬の front_index(過去走から計算済み)を使って、今走レース内で集計します。
各馬の過去走のみからfront_indexを作る
↓
今走の出走メンバーについて、各馬の過去front_indexを並べる
↓
そのレース内で逃げ候補数・先行馬密度・相対先行指数などを作る
展開圧力特徴量は、今走の結果情報を一切含みません。
しきい値
今回は以下のしきい値を使いました。これは仮の定義であり、しきい値を変えると結果が変わる可能性があります。
| 名称 | 条件 |
|---|---|
| 逃げ候補(escape_candidates) | front_index >= 0.85 |
| 先行候補(front_runner_candidates) | front_index >= 0.65 |
| 後方馬(closer) | front_index <= 0.35 |
| 単騎逃げ判定ギャップ | front_index差 >= 0.1 |
| 高圧力レース判定 | front_runner_candidates >= 3 |
特徴量定義表への案内
各展開圧力特徴量の詳細な定義(入力・計算方法・リーク対策・注意点)は、同フォルダの feature_definitions.md を参照してください。
比較方法
時系列分割(ランダム分割なし)でLightGBMモデルを学習しました。
訓練期間: 2017-01-01 ~ 2022-12-31
検証期間: 2023-01-01 ~ 2023-12-31
テスト期間: 2024-01-01 ~ 2024-12-31
以下の特徴量セットを比較しました:
- A_baseline: ベース特徴量のみ(脚質・展開圧力なし)
- B_horse_style_only: 馬単体の脚質特徴量のみ追加(avg_first/final_position_rate, front_index等)
- C_race_pressure_only: 展開圧力特徴量のみ追加(馬単体の脚質指数は含まない)
- D_horse_style_plus_pressure: 馬単体脚質 + 展開圧力特徴量(A〜D)を追加
- E_pressure_interactions: 馬単体脚質 + 相対先行力 + 交互作用フラグを追加
- F_all_pressure_features: すべての展開圧力特徴量を追加(A〜Eすべて)
人気あり・なしの2条件でも比較しています:
- 人気なしモデル: 人気(単勝人気順)を特徴量に含めない
- 人気ありモデル: 人気(単勝人気順)を特徴量に含める
人気を含めると、市場参加者が展開や脚質をある程度織り込んでいる可能性があります。人気なしモデルの方が、展開圧力特徴量そのものの情報量が見えやすいと考えられます。
結果
人気なしモデル(1着予測)
| 特徴量セット | AUC (test) | logloss (test) | Brier (test) | AUCの差分(Aとの比較) |
|---|---|---|---|---|
| A_baseline | 0.7341 | 0.2895 | 0.0823 | – |
| B_horse_style_only | 0.7464 | 0.2858 | 0.0816 | +0.0123 (改善) |
| C_race_pressure_only | 0.7638 | 0.2797 | 0.0801 | +0.0297 (改善) |
| D_horse_style_plus_pressure | 0.7657 | 0.2791 | 0.0800 | +0.0316 (改善) |
| E_pressure_interactions | 0.7646 | 0.2795 | 0.0801 | +0.0305 (改善) |
| F_all_pressure_features | 0.7657 | 0.2791 | 0.0800 | +0.0316 (改善) |
人気ありモデル(1着予測)
| 特徴量セット | AUC (test) | logloss (test) | Brier (test) | AUCの差分(Aとの比較) |
|---|---|---|---|---|
| A_baseline | 0.8461 | 0.2437 | 0.0714 | – |
| B_horse_style_only | 0.8462 | 0.2437 | 0.0714 | +0.0001 (同程度) |
| C_race_pressure_only | 0.8467 | 0.2434 | 0.0713 | +0.0006 (改善) |
| D_horse_style_plus_pressure | 0.8465 | 0.2435 | 0.0713 | +0.0004 (改善) |
| E_pressure_interactions | 0.8463 | 0.2435 | 0.0714 | +0.0002 (改善) |
| F_all_pressure_features | 0.8465 | 0.2435 | 0.0713 | +0.0004 (改善) |
人気なしモデル(3着内予測・補助)
| 特徴量セット | AUC (test) | logloss (test) | Brier (test) |
|---|---|---|---|
| A_baseline | 0.7196 | 0.5422 | 0.1819 |
| B_horse_style_only | 0.7287 | 0.5360 | 0.1798 |
| C_race_pressure_only | 0.7442 | 0.5253 | 0.1755 |
| D_horse_style_plus_pressure | 0.7455 | 0.5242 | 0.1751 |
| F_all_pressure_features | 0.7455 | 0.5242 | 0.1751 |
どの展開圧力特徴量が効いたか
特徴量重要度(人気なし・F_all_pressure_features)
| 特徴量名 | 重要度(gain) |
|---|---|
| front_index_gap_to_second | 164421.0 |
| past3_avg_rank | 157425.3 |
| relative_front_index | 78435.0 |
| front_index_gap_to_top | 56414.0 |
| past3_top3_rate | 31288.3 |
| 馬体重 | 30887.3 |
| opponent_avg_front_index | 19619.3 |
| 同走馬の数 | 19105.7 |
| style_stability | 16576.4 |
| 年齢 | 11961.4 |
| 斤量 | 11097.8 |
| 馬体重増減 | 10535.6 |
| front_index_percentile_in_race | 10021.0 |
| 距離 | 9706.8 |
| race_max_front_index | 9195.2 |
しきい値の感度分析
逃げ候補判定に使うfront_indexのしきい値を変えた場合の影響を確認しました。
| しきい値 | AUC (test) | logloss (test) |
|---|---|---|
| front_index >= 0.8 | 0.7588 | 0.2816 |
| front_index >= 0.85 | 0.7572 | 0.2823 |
| front_index >= 0.9 | 0.7541 | 0.2831 |
しきい値はあくまで仮の定義です。どのしきい値でも大きな差がない場合は、しきい値自体の影響は限定的と考えられます。
条件別分析
逃げ候補数・単騎逃げ候補・前争い候補・後方×高圧力などの条件別に、テスト期間のAUCを比較しました。
注意: 条件別AUCは条件ごとの難易度差と混ざるため、単純な大小比較だけで結論を出すのは危険です。また、サンプル数が少ない条件は信頼性が低くなります。
| 条件 | AUC | logloss | Brier | サンプル数 |
|---|---|---|---|---|
| 逃げ候補0頭 | 0.7376 | 0.2954 | 0.0847 | 58,273 |
| 逃げ候補1頭 | 0.7840 | 0.2700 | 0.0774 | 46,292 |
| 逃げ候補2頭以上 | 0.7860 | 0.2634 | 0.0754 | 33,807 |
| 先行候補1頭以下 | 0.7354 | 0.3062 | 0.0884 | 26,164 |
| 先行候補2-3頭 | 0.7732 | 0.2803 | 0.0806 | 51,860 |
| 先行候補4頭以上 | 0.7713 | 0.2663 | 0.0758 | 60,348 |
| 単騎逃げ候補=1 | 0.6853 | 0.5762 | 0.1956 | 5,208 |
| 単騎逃げ候補=0 | 0.7548 | 0.2600 | 0.0728 | 127,862 |
| 前争い候補=1 | 0.6991 | 0.4772 | 0.1540 | 7,847 |
| 前争い候補=0 | 0.7630 | 0.2596 | 0.0728 | 125,223 |
| 後方×高圧力=1 | 0.7344 | 0.0991 | 0.0214 | 16,859 |
| 後方×高圧力=0 | 0.7506 | 0.2975 | 0.0858 | 116,211 |
人気あり・人気なしの比較
人気を特徴量に含めた場合と含めない場合の比較です。人気には市場参加者が展開・脚質を織り込んだ情報が含まれている可能性があります。
| 特徴量セット | AUC(人気なし) | AUC(人気あり) | 差分 |
|---|---|---|---|
| A_baseline | 0.7341 | 0.8461 | +0.1120 (改善) |
| B_horse_style_only | 0.7464 | 0.8462 | +0.0998 (改善) |
| C_race_pressure_only | 0.7638 | 0.8467 | +0.0829 (改善) |
| D_horse_style_plus_pressure | 0.7657 | 0.8465 | +0.0808 (改善) |
| E_pressure_interactions | 0.7646 | 0.8463 | +0.0817 (改善) |
| F_all_pressure_features | 0.7657 | 0.8465 | +0.0808 (改善) |
考察
今回のデータでは、人気なしモデルにおいて D_horse_style_plus_pressure の特徴量セットが ベースラインに対してAUCで+0.0316の改善が見られました。
馬単体の脚質特徴量のみ追加(B): ベース比+0.0123、展開圧力のみ追加(C): ベース比+0.0297という結果でした。
馬単体脚質に展開圧力を組み合わせた(D)は、馬単体脚質のみ(B)に対してAUCが+0.0193という結果でした。
展開圧力は「今走メンバーの構成」から作る特徴量であり、各馬の過去脚質の質や量に依存します。過去走が少ない馬ではfront_indexの信頼性が低く、展開圧力の集計値にもノイズが入りやすくなります。
逃げ候補・先行候補のしきい値は仮の定義です。今後は実際のレース展開(逃げ馬が実際に逃げたか)との照合が必要です。
人気ありモデルでは、展開圧力特徴量の追加効果が小さく見える可能性があります。市場参加者が展開・脚質をある程度織り込んでいれば、展開圧力特徴量の独立した情報量は小さくなります。
条件別分析では、条件ごとのサンプル数や難易度の差が結果に影響します。単純なAUCの大小だけで判断せず、サンプル数も確認してください。

