エキスパート評価を正解データとして、モーター能力指数 v2
(motor_ability_index_v2.md)の
スコア表・ペナルティ・採用節数 をチューニングした motor4 成分と、
それを採用する予想者 v4_motor の設計。
notebooks/motor_score_tuning/report.md
(正解データ・探索ハーネス・再現スクリプト同梱)scripts/boatrace/index_features.py / scripts/boatrace/predictors/registry.pydata/estimate/motor_ability_score_v4.csvbuild_weights.py(SHORT_HISTORY_COMPONENTS)、infra/run-*.sh(ACTIVE_PREDICTORS)v1 設計書の未決事項に「スコア表は根拠なく決めている」「-100 ペナルティの妥当性未検証」が 残っていた。ドメインエキスパートのモーター評価(場公式サイトが公開する SS〜E 等の グレード)を正解として、これらのパラメータをデータ駆動で決め直す。
2026-07-19 取得のスナップショット 4 場・計 183 機
(詳細: notebooks/motor_score_tuning/ground_truth/)。
| 場 | 評価 | n | 備考 |
|---|---|---|---|
| 04 平和島(おかぺん) | SS〜E 11段階 | 43 | |
| 23 唐津 | 素性 S〜D 5段階 | 60 | |
| 24 大村 | 評価平均 1〜7点 | 70 | |
| 14 鳴門 | 金/銀/銅 | 10 | 上位10のみの打ち切りラベル |
目的関数 = 場別 Spearman ρ のラベル数加重平均。
| パラメータ | v2 (motor) |
v4 (motor4) |
定数 |
|---|---|---|---|
| スコア表 | 着順に線形(等間隔) | γ=1.5 凸カーブ(整数丸め) | MOTOR4_SCORE_FILENAME |
| 事故ペナルティ | -100 | -50 | MOTOR4_NEGATIVE_SCORE |
| 採用節数 | 6 | 5 | MOTOR4_HISTORY_SESSIONS |
| 半減期 / 収縮 k / lane補正 | 60日 / 10 / ON | 変更なし(現行値が最適圏) | — |
スコア表 v4: 行別スケール A ∈ {125,100,125,75,100,50} を維持し、
pt(着順k) = round(A × ((6-k)/5)^1.5)。
行間スケール(A)を据え置いた理由: lane補正(z残差化)が ON のとき、セル内
標準化 (raw − μ_cell)/σ_cell がスコア表の行に対する線形変換を吸収するため、
行間の水準差は原理的に出力へ影響しない。効くのは行内の間隔形状(γ)と
ペナルティの相対深さのみ。
| 構成 | 平和島 | 唐津 | 大村 | 鳴門 | 加重平均 |
|---|---|---|---|---|---|
| v2(現行 motor) | +0.623 | +0.590 | +0.589 | +0.290 | +0.581 |
| (参考)公式2連対率のみ | +0.660 | +0.386 | +0.600 | +0.338 | +0.530 |
| v4(提案) | +0.656 | +0.611 | +0.641 | +0.372 | +0.620 |
計算式は v2 と共通で、パラメータだけを keyword 引数で差し替える:
load_motor_score_table(repo, filename=...) — v4 表の読み込みscore_motor_run(table, run, negative_score=...) — ペナルティ差し替えmotor_ability_pt(..., negative_score=..., max_sessions=...) — 節数スライス
(履歴は従来どおり 6 節ロードし、先頭 5 節 = 直近 5 節を使う)compute_lane_baseline / compute_class_grade_avg に negative_score 引数FeatureContext.motor4_score_table() / lane_baselines4(day) — v4 用の
スコア表・コース baseline(v4 表 + ペナルティ -50 + 5 節で別計算・別キャッシュ)compute_features_for_day が long-format 出力に motor4 列を追加予想者 v4_motor(モーター予想、slot=4、started_at=2026-07-20)は
control (v1_basic) の motor を motor4 に差し替えた 5 成分。ラベルは
「モーターpt」を共用し、CSV 列名を v1_basic と互換に保つ。
build_weights.py の SHORT_HISTORY_COMPONENTS に motor4 を追加済み
(motor と同じ履歴ビルダーを使うため backfill 制約も同じ)。
検証: 本番コードパス(FeatureContext 経由)の motor4 出力が、チューニングに
使った独立実装ハーネスと最大誤差 4e-15 で一致することを確認済み。
ユニットテストは scripts/tests/unit/test_motor_ability_v4.py。
python scripts/build_weights.py --month YYYY-MM --predictor v4_motorpython scripts/build_index.py --date $TODAY --mode daily --predictor v4_motor
で N枠_モーターpt の分布(平均 50・SD 10)を目視確認infra/run-*.sh の ACTIVE_PREDICTORS は同期済み(v1_basic v4_motor)status="retired" に変更(データ・ロジックは残置)