評価する(2:学習状況について)

評価

つくった学習・評価プログラムを実際に実行した結果のうち、学習の状況について考えました。まだまだかもしれません笑。まず、結果から。。。。

学習結果

CUDA available: True
Torch version: 2.7.1+cu118
GPU: NVIDIA GeForce RTX 3050 Laptop GPU
✅ 過去データの前処理
✅ 血統データマージ
✅ 特徴量セットを構築
✅ final_drop_columns 保存済み
✅ 馬ごとの時系列シーケンス化(スライディングウィンドウ)+特徴量拡張の前処理パイプライン
✅ main_feature_order 保存済み
✅ データ分割(リーク撲滅: レース単位 + 時系列)
✅ Embedding
✅ category_maps 保存済み
✅ embedding_info 保存済み
✅ スケーリング(高速版)
✅ final_feature_names_seq 保存済み
✅ scale_stats 保存済み
✅ train__model開始
🚀 Training started...
Epoch 1: total=4242.8841 | top1_prob=0.695 | top1_acc=0.754 | ndcg3=0.940 | ⏱️ 273.72s
[Epoch 0] LR[0]: 0.000500
Epoch 2: total=5004.9756 | top1_prob=0.645 | top1_acc=0.667 | ndcg3=0.935 | ⏱️ 313.59s
[Epoch 1] LR[0]: 0.000500
Epoch 3: total=4173.0593 | top1_prob=0.665 | top1_acc=0.691 | ndcg3=0.929 | ⏱️ 316.81s
[Epoch 2] LR[0]: 0.000500
Epoch 4: total=4658.6374 | top1_prob=0.701 | top1_acc=0.726 | ndcg3=0.940 | ⏱️ 314.77s
⛔ Early stopping: 改善停止(best=0.9495)
✅ transformer_model 保存済み
✅ final_feature_names_seq 保存済み

今回の学習は、以下の環境で実行されました。

  • GPU: NVIDIA GeForce RTX 3050 Laptop GPU
  • PyTorch: 2.7.1 + CUDA 11.8
  • CUDA 有効化済み: GPUを活用して効率的に学習が進められました

前処理の流れ

学習前に、データに対して一連の前処理が行われています:

  • 過去レースデータの前処理
  • 血統データとのマージ
  • 特徴量セットの構築と不要列の削除
  • 馬ごとの時系列シーケンス化(スライディングウィンドウ方式)+特徴量拡張
  • カテゴリ特徴量の埋め込み(Embedding)とマッピング情報の保存
  • スケーリング処理(正規化)
  • レース単位・時系列を考慮したデータ分割(リーク防止)

これにより、馬ごとの履歴を取り込んだ時系列特徴量+血統やカテゴリ特徴量を組み合わせた学習データが準備されました。


学習の進行

学習は Transformer モデルを使って進められました。
ログには各エポックごとの主要な指標が記録されています:

  • total: 損失関数の値(小さいほど良い)
  • top1_prob: 予測確率の上位1位の平均値
  • top1_acc: 上位1位が的中した精度
  • ndcg3: 上位3頭に関するランキング精度(今回の主指標)
  • ⏱️: 1エポックの学習時間(秒)

学習経過(抜粋)

  • Epoch 1
    損失 4242.88、Top1精度 0.754、NDCG@3 0.940 と好スタート。
  • Epoch 2
    一時的に精度が下がり、Top1精度は 0.667 に。
  • Epoch 3
    やや持ち直し、Top1精度 0.691
  • Epoch 4
    再び精度が向上し、Top1精度 0.726、NDCG@3 0.940 に到達。

Early Stopping

⛔ Early stopping: 改善停止(best=0.9495)
モデルの性能改善が一定回数止まったため、早期終了が適用されました。
これにより、過学習を防ぎつつ「ベスト性能(NDCG@3=0.9495)」が保存されています。


保存データ

  • transformer_model (学習済みモデル本体)
  • final_feature_names_seq (学習で利用した特徴量の最終リスト)

これらにより、再学習なしで推論や評価を再現可能です。


まとめ

この学習ログからわかるポイントは:

  • RTX 3050 Laptop GPU でも数百秒単位で学習可能
  • 時系列・血統・カテゴリを組み合わせた特徴量設計を実装済み
  • NDCG@3 ≈ 0.95 という高いランキング精度を達成
  • Early stopping により過学習を防止

👉 実運用に耐えうる形で、Transformerモデルを用いた競馬予測システムが構築できていることが示されています。


学習結果から見える課題と今後の対応

今回の学習では NDCG@3 ≈ 0.95 と高い精度を達成しましたが、ログを詳しく見るといくつかの課題や改善ポイントが浮かび上がります。


1. 精度の変動(安定性の不足)

  • Epoch 1 → 2 の間で、Top1精度が 0.754 → 0.667 へ急落しています。
  • その後持ち直しているものの、学習が安定して収束していない印象です。

対応案

  • 学習率スケジューリング(CosineAnnealing、ReduceLROnPlateauなど)の導入
  • 勾配クリッピングや重み減衰(Weight Decay)の調整
  • データシャッフルやサンプル分布の再確認(偏りがある可能性)

2. Early Stopping による打ち切り

  • 最良スコアは NDCG@3=0.9495 ですが、その後改善が停滞し早期終了しました。
  • まだ余力があった可能性があります。

対応案

  • patience(改善待ちのエポック数)の調整
  • バリデーションセットの構成を工夫(より多様なレースを含める)
  • 学習データの拡張(履歴ウィンドウを広げる、血統特徴の強化など)

3. 評価指標の偏り

  • 今回は主に NDCG@3 を指標にしていますが、Top1精度やTop1確率のブレが大きく、ランキング以外の観点では不安定さが見えます。
  • 例えば「1着を当てる精度」と「上位3着をカバーする精度」のバランスをどう評価するかは、用途次第で調整が必要です。

対応案

  • 複数指標の併用(Top-k Accuracy, MAP, Brier Score など)
  • 目的に応じた損失関数の再設計(例: ランキング損失, Focal Loss)

4. モデルの表現力と汎化性能

  • Transformer モデルを使っているものの、カテゴリ特徴(血統や馬ID以外の情報)への寄与度はまだ不明確。
  • PFI の結果を踏まえて「効いていない特徴量」を整理する必要があります。

対応案

  • PFIの結果を反映した特徴量選択・次元削減
  • 新しい特徴量の追加(馬場状態、騎手データ、調教師データなど)
  • モデルアーキテクチャの拡張(マルチモーダル対応、Graph Neural Network 併用など)

まとめ

今回の学習で高い NDCG@3 を得られた一方で、

  • 学習の安定性不足
  • 早期終了のタイミング調整
  • 指標の多角的評価
  • 特徴量・モデル構造の見直し

といった改善課題が浮き彫りになったともいえますね。

次のステップとしては、PFIで得られた特徴量重要度を活用した特徴選択や、学習率制御・評価指標の拡張に取り組むことで、より安定的かつ汎化性能の高いモデルを目指せそうです。

皆さんの参考になれば幸いです。

私も、もうすこし、改良について考えます。。。。笑。

でも、次回、評価結果についても考えてみます!

コメント

タイトルとURLをコピーしました