|
344 | 344 | { |
345 | 345 | "name": "exp/relevance-weighted-rates (E0-E5)", |
346 | 346 | "date": "2026-06-26", |
347 | | - "change": "per-fixture opponent-aligned rate estimator: opp-strength Gaussian kernel + Gamma-Poisson shrinkage + (optional) time-decay/competition/blowout weights. Validated via scripts/relevance_backtest.py LOO on data/history (526 team-matches, 2104 territorial outcomes).", |
| 347 | + "change": "per-fixture opponent-aligned rate estimator: opp-strength Gaussian kernel + Gamma-Poisson shrinkage + (optional) time-decay/competition/blowout weights. Validated via leave-one-out on data/history (526 team-matches, 2104 territorial outcomes).", |
348 | 348 | "metric": "territorial_Brier + 3-way RPS (history LOO, NOT the WC2026 gate yet)", |
349 | 349 | "results": { |
350 | 350 | "flat_baseline": { |
|
364 | 364 | "findings": "k (shrinkage) is the dominant lever: k=0 is WORSE than flat (+0.0074), k=5 best (-0.0120). Opp-strength kernel helps modestly on territorial and more on RPS (sigma~0.8-1.2). For COUNT stats time-decay HURTS (xi=0 best) and blowout-downweight HURTS (blowout games carry real territorial signal) - opposite of the goals/results literature. Competition weighting ~no-op on the all-major-tournament history corpus (kept as the live friendly/qualifier hook).", |
365 | 365 | "verdict": "VALIDATED on history LOO; NOT yet deployed - needs per-match data for WC2026 teams to wire into StatsJsonProvider, then the WC2026 gate.", |
366 | 366 | "cross_validation_wc_corpus": { |
367 | | - "corpus": "bot/data/match_corpus.py (cached stats-api internationals, all 48 WC teams, median 21 matches/team, 7088 territorial outcomes)", |
| 367 | + "corpus": "cached internationals corpus (all 48 WC teams, all 48 WC teams, median 21 matches/team, 7088 territorial outcomes)", |
368 | 368 | "flat_terr_brier": 0.2025, |
369 | 369 | "best_terr_brier": 0.19, |
370 | 370 | "best_config": "sigma=1.0,k=0", |
|
434 | 434 | "verdict": "PASS-NEUTRAL (handlers fire only on novel types; 0 regression on 621-question backtest; 187 tests pass). Forward-test on final/3rd-place to calibrate." |
435 | 435 | }, |
436 | 436 | { |
437 | | - "name": "data/stats-api-player-sot-refresh", |
438 | | - "change": "Fetched leak-free per-player SoT/90 for 157 players via fetch_stats-api_player_sot.py --write (WC-2026 season excluded). Auto-wired through bot/data/teamstats.py (blends stats-api sot_per90 into player rates). Finalists now carry real rates (Messi 1.66, Mbappe 2.03, Kane 1.88, Oyarzabal 2.42, Alvarez 0.96) vs the 0.60 generic default.", |
| 437 | + "name": "player-sot-rate-refresh", |
| 438 | + "change": "Fetched leak-free per-player SoT/90 for 157 players from a paid stats API (WC-2026 season excluded), later removed from the public repo. Blended sot_per90 into player rates via bot/data/teamstats.py. Finalists carried real rates (Messi 1.66, Mbappe 2.03, Kane 1.88, Oyarzabal 2.42, Alvarez 0.96) vs the 0.60 generic default.", |
439 | 439 | "category": "player_prop / SoT data", |
440 | 440 | "rbp_before": 1020.84, |
441 | 441 | "rbp_after": 1039.08, |
|
0 commit comments