【要約】競馬AI開発記録 #17 LightGBM rank_xendcg との死闘:勾配爆発を防ぐためのターゲット設計 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が、レース内の相対的な序列を予測するために、LightGBMの目的関数をランキング学習(rank_xendcg)へ変更した際、深刻な数値的不安定性に直面した。ターゲットラベルの設計が不適切であったため、学習が破綻した。
- ・RMSEが1.85965e+13という異常な数値を記録。
- ・feature_importanceが浮動小数点の限界値に達する。
- ・スピアマン相関係数が0.00となり、学習が完全に失敗。
- ・原因は、内部の利得計算式 Gain = 2^{rel} - 1 における指数関数的な爆発である。
// Approach
開発者は、モデルに渡すターゲットラベル(関連度)のスケールを、数学的に安定した範囲に収めるアプローチを採用した。目的関数の特性を考慮したスケーリング設計を行っている。
- ・ターゲットの正規化:頭数で除算し、値を 0 < target ≤ 1 の範囲に限定。
- ・スケーリング係数の最適化:Optunaを用い、target_alpha を 1.1 〜 1.9 の範囲で探索。
- ・モニタリング指標の変更:型エラーを回避するため、metric='ndcg' から metric='rmse' へ切り替え。
// Result
ターゲット設計の刷新により、数値的不安定性が完全に解消され、予測モデルとしての実用性を確保した。これにより、競馬における序列予測の精度が劇的に向上した。
- ・RMSEが10兆超から0.3 〜 0.5の正常値へ改善。
- ・スピアマン相関係数が0.00から0.4021へと大幅に向上。
- ・レース内の全出走馬の序列を高い精度で予測可能となった。
Senior Engineer Insight
> ライブラリのブラックボックス化を避けるべきだ。単に「精度が上がる」という理由で目的関数を選ぶのは危険である。特に指数関数を含む計算式が内部にある場合、ターゲットのスケーリングはチューニングではなく、モデルを動作させるための「前提条件」となる。警告ログ(ConstantInputWarning)を無視せず、数学的背景から原因を特定する姿勢が、大規模な学習パイプラインの安定稼働には不可欠である。