はじめに
今回は「馬の脚質」を数値化したときに、LightGBMの1着予測精度が改善するかを確認しました。
脚質とは、レース中での馬の位置取り傾向のことです。「逃げ(先頭付近)」「先行」「差し」「追込(後方から)」のように分類されます。ただし、脚質は馬の固定属性ではなく、距離・競馬場・騎手・メンバー構成によって変わる可能性があります。
今回は単純なラベル付けだけでなく、過去走の通過順から複数の脚質特徴量を作り、どの作り方が予測精度に効くかを比較しました。
今回確認すること
- 過去走の通過順から脚質特徴量を数値化できるか
- 脚質特徴量を追加するとLightGBMの1着予測AUCが改善するか
- どの数値化方法(前走のみ・複数走平均・連続値指数・ラベル割合)が効くか
- 距離変更・競馬場変更・騎手変更によってノイズが増えるか
- 人気あり・なしで脚質特徴量の効果が変わるか
脚質をどう数値化するか
通過順の扱い
地方競馬の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%)でした。
重要:今走の通過順は使っていない
今走の通過順はレース後にしか分からない情報です。そのため、今走の通過順・4角位置・脚質ラベルは特徴量に使っていません。
使っているのは、過去走から計算した通過順・位置取り傾向のみ です。
すべての脚質特徴量は shift(1) してから rolling() で計算しており、今走の情報は含まれません。
使用データ
- データソース: ローカル環境のレース結果データベース(
common.db) - 対象テーブル:
result_table - 目的変数(主):
1着(1着に入るか) - 目的変数(補助):
3着内(3着内に入るか) - 除外条件: 着順が0またはNULLのレコード(取消・除外・中止など)を除外
- 帯広除外: ばんえい競馬(帯広)を除外しました(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 |
作成した脚質特徴量
以下の8パターンの特徴量セットを比較しました。
- A_baseline: ベース特徴量のみ(脚質なし)
- B_prev_race: 前走の first/final position rate + position gain
- C_rolling: 直近3走・5走の平均 first/final position rate・gain・標準偏差
- D_indices: 連続値の脚質指数(front_index / early_front_index / closing_index / style_stability)
- E_labels: 脚質ラベル割合(逃げ・先行・差し・追込の割合)直近5走
- F_distance: 距離帯を考慮した脚質(同距離帯の平均 position rate)
- G_track: 競馬場を考慮した脚質(同競馬場の平均 position rate)
- ALL_style: すべての脚質特徴量を結合
脚質ラベルのしきい値(仮の定義)
今回は以下のしきい値で脚質ラベルを定義しましたが、これは仮の定義です。
しきい値を変えると結果が変わる可能性があります。
| 脚質 | 条件 |
|---|---|
| 逃げ | final_position_rate <= 0.1 |
| 先行 | 0.1 < final_position_rate <= 0.35 |
| 差し | 0.35 < final_position_rate <= 0.7 |
| 追込 | final_position_rate > 0.7 |
比較方法
時系列分割(ランダム分割なし)でLightGBMモデルを学習しました。
訓練期間: 2017-01-01 ~ 2022-12-31
検証期間: 2023-01-01 ~ 2023-12-31
テスト期間: 2024-01-01 ~ 2024-12-31
各特徴量セットについて、以下の2条件で比較しました:
- 人気なしモデル: 人気(単勝人気順)を特徴量に含めない
- 人気ありモデル: 人気(単勝人気順)を特徴量に含める
人気ありモデルの結果から、人気には脚質や展開をある程度織り込んでいる可能性があります。
結果
人気なしモデル(1着予測)
| 特徴量セット | AUC (test) | logloss (test) | Brier (test) | AUC差分(Aとの比較) |
|---|---|---|---|---|
| A_baseline | 0.7341 | 0.2895 | 0.0823 | – |
| B_prev_race | 0.7454 | 0.2865 | 0.0818 | +0.0113 (改善) |
| C_rolling | 0.7468 | 0.2858 | 0.0816 | +0.0127 (改善) |
| D_indices | 0.7467 | 0.2857 | 0.0816 | +0.0126 (改善) |
| E_labels | 0.7455 | 0.2862 | 0.0817 | +0.0114 (改善) |
| F_distance | 0.7449 | 0.2864 | 0.0818 | +0.0108 (改善) |
| G_track | 0.7511 | 0.2847 | 0.0815 | +0.0170 (改善) |
| ALL_style | 0.7736 | 0.2764 | 0.0795 | +0.0395 (改善) |
人気ありモデル(1着予測)
| 特徴量セット | AUC (test) | logloss (test) | Brier (test) | AUC差分(Aとの比較) |
|---|---|---|---|---|
| A_baseline | 0.8461 | 0.2437 | 0.0714 | – |
| B_prev_race | 0.8460 | 0.2438 | 0.0714 | -0.0001 (同程度) |
| C_rolling | 0.8460 | 0.2437 | 0.0714 | -0.0001 (同程度) |
| D_indices | 0.8461 | 0.2437 | 0.0714 | +0.0000 (同程度) |
| E_labels | 0.8460 | 0.2437 | 0.0714 | -0.0001 (同程度) |
| F_distance | 0.8461 | 0.2437 | 0.0714 | +0.0000 (同程度) |
| G_track | 0.8461 | 0.2437 | 0.0714 | +0.0000 (同程度) |
| ALL_style | 0.8462 | 0.2436 | 0.0713 | +0.0001 (同程度) |
人気なしモデル(3着内予測)補助確認
| 特徴量セット | AUC (test) | logloss (test) | Brier (test) |
|---|---|---|---|
| A_baseline | 0.7196 | 0.5422 | 0.1819 |
| B_prev_race | 0.7298 | 0.5359 | 0.1797 |
| C_rolling | 0.7287 | 0.5360 | 0.1798 |
| D_indices | 0.7290 | 0.5358 | 0.1798 |
| E_labels | 0.7277 | 0.5368 | 0.1801 |
| ALL_style | 0.7528 | 0.5191 | 0.1733 |
脚質特徴量の重要度(人気なし・ALL_style)
| 特徴量名 | 重要度(gain) |
|---|---|
| relative_front_index | 223969.9 |
| past3_avg_rank | 169755.9 |
| past3_top3_rate | 54556.8 |
| race_avg_front_index | 40802.6 |
| 馬体重 | 35174.2 |
| 同走馬の数 | 28683.5 |
| track_avg_final_pos | 26561.9 |
| prev1_final_pos_rate | 17267.8 |
| escape_candidates_in_race | 15105.1 |
| roll5_std_final_pos | 14078.0 |
| 年齢 | 13344.3 |
| roll3_std_final_pos | 12443.6 |
| 距離 | 11666.2 |
| 斤量 | 11605.2 |
| 馬体重増減 | 11396.7 |
条件別サブグループ分析(ALLスタイル特徴量・テスト期間)
| 条件 | AUC | logloss | Brier | サンプル数 |
|---|---|---|---|---|
| 距離帯変更あり | 0.7674 | 0.2631 | 0.0745 | 25,187 |
| 距離帯変更なし | 0.7785 | 0.2708 | 0.0776 | 107,883 |
| 競馬場変更あり | 0.7588 | 0.2924 | 0.0847 | 19,444 |
| 競馬場変更なし | 0.7795 | 0.2654 | 0.0757 | 113,626 |
| 騎手変更あり | 0.7604 | 0.2472 | 0.0685 | 57,192 |
| 騎手変更なし | 0.7833 | 0.2861 | 0.0834 | 75,878 |
考察
今回のデータでは、人気なしモデルにおいて ALL_style の特徴量セットが ベースライン(脚質なし)に対してAUCで+0.0395の改善が見られました。
また、脚質は馬の固定属性ではなく、距離・競馬場・騎手の判断・メンバー構成によって変わる可能性があります。
人気ありモデルの結果から、人気が脚質情報の一部をすでに織り込んでいることが推察されます。
