← All findingssource · memory/project_mlb_under_is_base_rate.md
- Outcomes are genuinely 75.0% UNDER (4,475 / 1,494). MLB batter props sit on 0.5 lines for rare events (HR, SB, walks, RBI) — those mostly don't clear. Zero integer lines served, ever (line distribution: 0.5 n=4513, 1.5 n=1271, 2.5 n=135, rest negligible).
- Model predicts UNDER 94.7% (5,653/5,969) and scores 73-76% — that IS the base rate. Any accuracy-maximizing trainer learns "say UNDER". The headline accuracy is price-blind and says nothing about edge.
- Secondary amplifier: the heuristic's direction defaults UNDER and flips OVER only when l5_delta_frac > 0 (
mlb/services/heuristic_generator.py:302,311-321) — ties go UNDER.
Two GENUINE MLB bugs found, both unfixed (not in scope of the NBA branch):
- Push-as-UNDER, latent.
mlb/services/accuracy_tracker.py:124labels actual==line as UNDER, andmlb/services/trainer.py:148turns that into y=0. Same bug WNBA fixed (wnba/services/accuracy_tracker.py:125-130voids pushes). Injects ~0% skew TODAY because every served line is a half-line — becomes real poisoning the day pitcher props (integer lines) are wired, whichaccuracy_tracker.py:10-12currently excludes. Fix before wiring pitcher props. _season_games_estimategames=1 fallback (mlb/services/heuristic_generator.py:348-360): when season at_bats is missing, season_per_game becomes the season TOTAL (e.g. 120 hits/game) — a huge outlier that inflates scaler mean/std for features 2 and 5. Its docstring claims this biases safely toward UNDER; that is backwards.
MLB shares NBA's model machinery (MLBPropPredictionModel subclasses PropPredictionModel) so the missing→0.0→negative-z mechanism EXISTS structurally (no has_* indicators, FEATURE_VERSION=1, missing L5/L10/season deltas encode as exactly -1.0), but it is not what drives the observed skew. Train/serve parity is exact by construction (the served _features vector round-trips through accuracy reports into training).
Ratchet: mlb/batch.py:483-486 has the same unstamped-ratchet pattern; observed 4 straight refusals (v95-98, Jul 30-Aug 2, improvement −0.016 to −0.005) with deployedHoldoutAccuracy pinned at 0.759 ≈ the constant-UNDER base rate — the dangerous configuration. Self-recovered v99-102. Not stuck now, mechanism live.
Real next step for MLB is not a bias fix — it's odds-aware evaluation (Brier vs implied prob / CLV), because 76% accuracy at a 75% base rate is zero demonstrated edge. See feedback_model_edge_calibration and project_brier_vs_vegas_closed.