{
  "milestone": "M2+M3",
  "generated_at_utc": "2026-08-02T01:39:07+00:00",
  "is_real": true,
  "warning": null,
  "models": {
    "baseline": {
      "name": "seasonal_naive_168h",
      "description": "demand at the same hour, 7 days earlier",
      "season_hours": 168
    },
    "challenger": {
      "name": "lightgbm_global_direct",
      "description": "one global LightGBM over all horizons; horizon is a feature (direct multi-horizon, no recursion)",
      "library": "lightgbm",
      "params": {
        "objective": "l1",
        "metric": "l1",
        "learning_rate": 0.05,
        "num_leaves": 63,
        "min_data_in_leaf": 40,
        "feature_fraction": 0.9,
        "bagging_fraction": 0.9,
        "bagging_freq": 1,
        "lambda_l2": 1.0,
        "num_threads": 0,
        "verbose": -1,
        "seed": 20260728,
        "deterministic": true,
        "force_row_wise": true
      },
      "num_boost_round": 300,
      "train_origin_stride_hours": 6,
      "refits": 55,
      "train_rows_last_fold": 67220,
      "n_features": 27,
      "features": [
        "horizon_h",
        "hour",
        "dayofweek",
        "month",
        "is_weekend",
        "is_holiday",
        "demand_lag_24h",
        "demand_lag_48h",
        "demand_lag_168h",
        "demand_lag_336h",
        "demand_same_hour_of_week_mean_4w",
        "demand_last_1h",
        "demand_roll_mean_24h",
        "demand_roll_std_24h",
        "demand_roll_min_24h",
        "demand_roll_max_24h",
        "demand_roll_mean_168h",
        "temp_lag_168h",
        "temp_last_1h",
        "temp_roll_mean_24h",
        "temp_fcst_target",
        "temp_fcst_spread_target",
        "humidity_fcst_target",
        "dewpoint_fcst_target",
        "wind_fcst_target",
        "cloud_fcst_target",
        "temp_fcst_target_minus_lag_168h"
      ]
    }
  },
  "data": {
    "kind": "eia_api_v2",
    "is_real": true,
    "respondent": "PJM",
    "weather_site": "philadelphia_pa",
    "weather_sites": [
      "chicago_il",
      "washington_dc",
      "philadelphia_pa",
      "baltimore_md",
      "newark_nj",
      "pittsburgh_pa",
      "cleveland_oh",
      "columbus_oh",
      "richmond_va"
    ],
    "has_weather_forecast": true,
    "warning": null,
    "panel": {
      "rows": 17524,
      "start_utc": "2024-08-01T21:00:00+00:00",
      "end_utc": "2026-08-02T00:00:00+00:00",
      "missing_demand_hours": 0,
      "has_temperature": true,
      "has_weather_forecast": true
    }
  },
  "backtest": {
    "protocol": "walk-forward, daily cutoffs, no temporal leakage",
    "note": "identical folds and horizons for both models (models.backtest)",
    "weeks": 8,
    "cutoff_hour_utc": 12,
    "folds": 55,
    "skipped_folds": 0,
    "horizons_h": [
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15,
      16,
      17,
      18,
      19,
      20,
      21,
      22,
      23,
      24
    ],
    "first_cutoff_utc": "2026-06-07T12:00:00+00:00",
    "last_cutoff_utc": "2026-07-31T12:00:00+00:00",
    "warnings": []
  },
  "metrics": {
    "units": {
      "mae": "MWh",
      "rmse": "MWh",
      "bias": "MWh",
      "mape_pct": "%"
    },
    "baseline": {
      "overall": {
        "mae": 13359.478,
        "mape_pct": 11.7267,
        "rmse": 16862.5848,
        "bias": -1750.728,
        "n": 1320
      },
      "by_horizon": [
        {
          "horizon_h": 1,
          "mae": 10184.71,
          "mape_pct": 9.9238,
          "rmse": 12463.38,
          "bias": -1600.05,
          "n": 55
        },
        {
          "horizon_h": 2,
          "mae": 11742.42,
          "mape_pct": 10.9887,
          "rmse": 14469.91,
          "bias": -1729.18,
          "n": 55
        },
        {
          "horizon_h": 3,
          "mae": 13477.38,
          "mape_pct": 12.1615,
          "rmse": 16703.83,
          "bias": -1844.29,
          "n": 55
        },
        {
          "horizon_h": 4,
          "mae": 15226.22,
          "mape_pct": 13.2649,
          "rmse": 18640.9,
          "bias": -2006.65,
          "n": 55
        },
        {
          "horizon_h": 5,
          "mae": 16744.95,
          "mape_pct": 14.08,
          "rmse": 20300.73,
          "bias": -2234.47,
          "n": 55
        },
        {
          "horizon_h": 6,
          "mae": 17695.62,
          "mape_pct": 14.4366,
          "rmse": 21298.93,
          "bias": -2386.49,
          "n": 55
        },
        {
          "horizon_h": 7,
          "mae": 18280.76,
          "mape_pct": 14.5563,
          "rmse": 21955.63,
          "bias": -2442.58,
          "n": 55
        },
        {
          "horizon_h": 8,
          "mae": 18174.71,
          "mape_pct": 14.1656,
          "rmse": 21902.11,
          "bias": -2396.82,
          "n": 55
        },
        {
          "horizon_h": 9,
          "mae": 17560.64,
          "mape_pct": 13.4254,
          "rmse": 21345.31,
          "bias": -2238.78,
          "n": 55
        },
        {
          "horizon_h": 10,
          "mae": 17069.42,
          "mape_pct": 12.9091,
          "rmse": 20776.67,
          "bias": -2055.13,
          "n": 55
        },
        {
          "horizon_h": 11,
          "mae": 16665.49,
          "mape_pct": 12.6598,
          "rmse": 20366.9,
          "bias": -1884.15,
          "n": 55
        },
        {
          "horizon_h": 12,
          "mae": 16235.45,
          "mape_pct": 12.5776,
          "rmse": 19963.0,
          "bias": -1727.13,
          "n": 55
        },
        {
          "horizon_h": 13,
          "mae": 15311.44,
          "mape_pct": 12.2621,
          "rmse": 18892.49,
          "bias": -1662.45,
          "n": 55
        },
        {
          "horizon_h": 14,
          "mae": 14300.24,
          "mape_pct": 11.84,
          "rmse": 17702.19,
          "bias": -1585.44,
          "n": 55
        },
        {
          "horizon_h": 15,
          "mae": 13371.49,
          "mape_pct": 11.7012,
          "rmse": 16572.79,
          "bias": -1534.84,
          "n": 55
        },
        {
          "horizon_h": 16,
          "mae": 12534.36,
          "mape_pct": 11.6359,
          "rmse": 15503.38,
          "bias": -1487.42,
          "n": 55
        },
        {
          "horizon_h": 17,
          "mae": 11792.96,
          "mape_pct": 11.4718,
          "rmse": 14627.37,
          "bias": -1448.27,
          "n": 55
        },
        {
          "horizon_h": 18,
          "mae": 10889.62,
          "mape_pct": 11.0175,
          "rmse": 13512.64,
          "bias": -1458.2,
          "n": 55
        },
        {
          "horizon_h": 19,
          "mae": 10027.18,
          "mape_pct": 10.4896,
          "rmse": 12431.97,
          "bias": -1426.78,
          "n": 55
        },
        {
          "horizon_h": 20,
          "mae": 9298.24,
          "mape_pct": 9.9691,
          "rmse": 11501.5,
          "bias": -1384.45,
          "n": 55
        },
        {
          "horizon_h": 21,
          "mae": 8732.84,
          "mape_pct": 9.4503,
          "rmse": 10781.19,
          "bias": -1349.6,
          "n": 55
        },
        {
          "horizon_h": 22,
          "mae": 8399.73,
          "mape_pct": 9.008,
          "rmse": 10316.16,
          "bias": -1398.71,
          "n": 55
        },
        {
          "horizon_h": 23,
          "mae": 8220.87,
          "mape_pct": 8.6422,
          "rmse": 10018.39,
          "bias": -1394.0,
          "n": 55
        },
        {
          "horizon_h": 24,
          "mae": 8690.75,
          "mape_pct": 8.803,
          "rmse": 10641.73,
          "bias": -1341.58,
          "n": 55
        }
      ]
    },
    "lightgbm": {
      "overall": {
        "mae": 3049.7921,
        "mape_pct": 2.716,
        "rmse": 3863.6474,
        "bias": -1096.0136,
        "n": 1320
      },
      "by_horizon": [
        {
          "horizon_h": 1,
          "mae": 2285.46,
          "mape_pct": 2.2429,
          "rmse": 3058.51,
          "bias": -224.01,
          "n": 55
        },
        {
          "horizon_h": 2,
          "mae": 2205.63,
          "mape_pct": 2.0624,
          "rmse": 2890.87,
          "bias": 58.43,
          "n": 55
        },
        {
          "horizon_h": 3,
          "mae": 2542.25,
          "mape_pct": 2.3187,
          "rmse": 3319.68,
          "bias": 139.95,
          "n": 55
        },
        {
          "horizon_h": 4,
          "mae": 3234.71,
          "mape_pct": 2.8268,
          "rmse": 3865.07,
          "bias": -45.14,
          "n": 55
        },
        {
          "horizon_h": 5,
          "mae": 3630.44,
          "mape_pct": 3.0876,
          "rmse": 4407.47,
          "bias": -294.22,
          "n": 55
        },
        {
          "horizon_h": 6,
          "mae": 3521.44,
          "mape_pct": 2.9152,
          "rmse": 4371.13,
          "bias": 175.78,
          "n": 55
        },
        {
          "horizon_h": 7,
          "mae": 3481.35,
          "mape_pct": 2.8429,
          "rmse": 4211.71,
          "bias": -175.52,
          "n": 55
        },
        {
          "horizon_h": 8,
          "mae": 3519.47,
          "mape_pct": 2.7976,
          "rmse": 4265.73,
          "bias": -680.62,
          "n": 55
        },
        {
          "horizon_h": 9,
          "mae": 3823.49,
          "mape_pct": 2.958,
          "rmse": 4641.2,
          "bias": -862.13,
          "n": 55
        },
        {
          "horizon_h": 10,
          "mae": 3757.95,
          "mape_pct": 2.8614,
          "rmse": 4624.51,
          "bias": -1492.17,
          "n": 55
        },
        {
          "horizon_h": 11,
          "mae": 3658.4,
          "mape_pct": 2.8044,
          "rmse": 4649.2,
          "bias": -1290.31,
          "n": 55
        },
        {
          "horizon_h": 12,
          "mae": 3413.79,
          "mape_pct": 2.6463,
          "rmse": 4251.11,
          "bias": -1363.73,
          "n": 55
        },
        {
          "horizon_h": 13,
          "mae": 3489.45,
          "mape_pct": 2.8328,
          "rmse": 4302.93,
          "bias": -1933.92,
          "n": 55
        },
        {
          "horizon_h": 14,
          "mae": 3984.04,
          "mape_pct": 3.3219,
          "rmse": 5027.11,
          "bias": -2882.54,
          "n": 55
        },
        {
          "horizon_h": 15,
          "mae": 3382.33,
          "mape_pct": 2.9848,
          "rmse": 4265.57,
          "bias": -2098.17,
          "n": 55
        },
        {
          "horizon_h": 16,
          "mae": 3291.67,
          "mape_pct": 3.0617,
          "rmse": 3982.16,
          "bias": -2128.52,
          "n": 55
        },
        {
          "horizon_h": 17,
          "mae": 2896.04,
          "mape_pct": 2.8202,
          "rmse": 3516.34,
          "bias": -1672.64,
          "n": 55
        },
        {
          "horizon_h": 18,
          "mae": 2738.55,
          "mape_pct": 2.7767,
          "rmse": 3382.61,
          "bias": -1666.93,
          "n": 55
        },
        {
          "horizon_h": 19,
          "mae": 2404.58,
          "mape_pct": 2.5236,
          "rmse": 2997.2,
          "bias": -1161.92,
          "n": 55
        },
        {
          "horizon_h": 20,
          "mae": 2234.83,
          "mape_pct": 2.4089,
          "rmse": 2766.68,
          "bias": -1045.97,
          "n": 55
        },
        {
          "horizon_h": 21,
          "mae": 2060.7,
          "mape_pct": 2.2472,
          "rmse": 2560.41,
          "bias": -1133.4,
          "n": 55
        },
        {
          "horizon_h": 22,
          "mae": 2179.68,
          "mape_pct": 2.337,
          "rmse": 2695.83,
          "bias": -1322.06,
          "n": 55
        },
        {
          "horizon_h": 23,
          "mae": 2167.18,
          "mape_pct": 2.2752,
          "rmse": 2649.96,
          "bias": -1011.22,
          "n": 55
        },
        {
          "horizon_h": 24,
          "mae": 3291.59,
          "mape_pct": 3.2303,
          "rmse": 4287.76,
          "bias": -2193.36,
          "n": 55
        }
      ]
    },
    "comparison": {
      "mae_delta": -10309.69,
      "mae_delta_pct": -77.17,
      "mape_delta_pct_points": -9.0106,
      "horizons_won": 24,
      "horizons_total": 24,
      "by_horizon": [
        {
          "horizon_h": 1,
          "baseline_mae": 10184.71,
          "model_mae": 2285.46,
          "mae_delta": -7899.25,
          "mae_delta_pct": -77.56
        },
        {
          "horizon_h": 2,
          "baseline_mae": 11742.42,
          "model_mae": 2205.63,
          "mae_delta": -9536.79,
          "mae_delta_pct": -81.22
        },
        {
          "horizon_h": 3,
          "baseline_mae": 13477.38,
          "model_mae": 2542.25,
          "mae_delta": -10935.14,
          "mae_delta_pct": -81.14
        },
        {
          "horizon_h": 4,
          "baseline_mae": 15226.22,
          "model_mae": 3234.71,
          "mae_delta": -11991.5,
          "mae_delta_pct": -78.76
        },
        {
          "horizon_h": 5,
          "baseline_mae": 16744.95,
          "model_mae": 3630.44,
          "mae_delta": -13114.5,
          "mae_delta_pct": -78.32
        },
        {
          "horizon_h": 6,
          "baseline_mae": 17695.62,
          "model_mae": 3521.44,
          "mae_delta": -14174.18,
          "mae_delta_pct": -80.1
        },
        {
          "horizon_h": 7,
          "baseline_mae": 18280.76,
          "model_mae": 3481.35,
          "mae_delta": -14799.41,
          "mae_delta_pct": -80.96
        },
        {
          "horizon_h": 8,
          "baseline_mae": 18174.71,
          "model_mae": 3519.47,
          "mae_delta": -14655.24,
          "mae_delta_pct": -80.64
        },
        {
          "horizon_h": 9,
          "baseline_mae": 17560.64,
          "model_mae": 3823.49,
          "mae_delta": -13737.14,
          "mae_delta_pct": -78.23
        },
        {
          "horizon_h": 10,
          "baseline_mae": 17069.42,
          "model_mae": 3757.95,
          "mae_delta": -13311.47,
          "mae_delta_pct": -77.98
        },
        {
          "horizon_h": 11,
          "baseline_mae": 16665.49,
          "model_mae": 3658.4,
          "mae_delta": -13007.09,
          "mae_delta_pct": -78.05
        },
        {
          "horizon_h": 12,
          "baseline_mae": 16235.45,
          "model_mae": 3413.79,
          "mae_delta": -12821.66,
          "mae_delta_pct": -78.97
        },
        {
          "horizon_h": 13,
          "baseline_mae": 15311.44,
          "model_mae": 3489.45,
          "mae_delta": -11821.99,
          "mae_delta_pct": -77.21
        },
        {
          "horizon_h": 14,
          "baseline_mae": 14300.24,
          "model_mae": 3984.04,
          "mae_delta": -10316.2,
          "mae_delta_pct": -72.14
        },
        {
          "horizon_h": 15,
          "baseline_mae": 13371.49,
          "model_mae": 3382.33,
          "mae_delta": -9989.16,
          "mae_delta_pct": -74.7
        },
        {
          "horizon_h": 16,
          "baseline_mae": 12534.36,
          "model_mae": 3291.67,
          "mae_delta": -9242.69,
          "mae_delta_pct": -73.74
        },
        {
          "horizon_h": 17,
          "baseline_mae": 11792.96,
          "model_mae": 2896.04,
          "mae_delta": -8896.92,
          "mae_delta_pct": -75.44
        },
        {
          "horizon_h": 18,
          "baseline_mae": 10889.62,
          "model_mae": 2738.55,
          "mae_delta": -8151.07,
          "mae_delta_pct": -74.85
        },
        {
          "horizon_h": 19,
          "baseline_mae": 10027.18,
          "model_mae": 2404.58,
          "mae_delta": -7622.6,
          "mae_delta_pct": -76.02
        },
        {
          "horizon_h": 20,
          "baseline_mae": 9298.24,
          "model_mae": 2234.83,
          "mae_delta": -7063.41,
          "mae_delta_pct": -75.97
        },
        {
          "horizon_h": 21,
          "baseline_mae": 8732.84,
          "model_mae": 2060.7,
          "mae_delta": -6672.14,
          "mae_delta_pct": -76.4
        },
        {
          "horizon_h": 22,
          "baseline_mae": 8399.73,
          "model_mae": 2179.68,
          "mae_delta": -6220.05,
          "mae_delta_pct": -74.05
        },
        {
          "horizon_h": 23,
          "baseline_mae": 8220.87,
          "model_mae": 2167.18,
          "mae_delta": -6053.69,
          "mae_delta_pct": -73.64
        },
        {
          "horizon_h": 24,
          "baseline_mae": 8690.75,
          "model_mae": 3291.59,
          "mae_delta": -5399.16,
          "mae_delta_pct": -62.13
        }
      ]
    }
  },
  "ablation": {
    "forecast_weather": {
      "measured": true,
      "removed": [
        "fcst_temperature_c",
        "fcst_humidity_pct",
        "fcst_dewpoint_c",
        "fcst_wind_kmh",
        "fcst_cloud_pct",
        "fcst_temperature_spread_c"
      ],
      "protocol": "identical folds, horizons and hyperparameters; only the columns differ",
      "mae_without_forecast_weather": 5159.56,
      "mae_with_forecast_weather": 3049.79,
      "mae_delta": -2109.76,
      "mae_delta_pct": -40.89,
      "helped": true,
      "warning": null
    }
  },
  "feature_importance_gain_pct": [
    {
      "feature": "demand_lag_24h",
      "gain_pct": 36.54
    },
    {
      "feature": "temp_fcst_target",
      "gain_pct": 8.9
    },
    {
      "feature": "hour",
      "gain_pct": 7.38
    },
    {
      "feature": "month",
      "gain_pct": 4.57
    },
    {
      "feature": "dewpoint_fcst_target",
      "gain_pct": 3.73
    },
    {
      "feature": "dayofweek",
      "gain_pct": 3.67
    },
    {
      "feature": "demand_lag_168h",
      "gain_pct": 3.44
    },
    {
      "feature": "demand_lag_48h",
      "gain_pct": 3.4
    },
    {
      "feature": "temp_fcst_target_minus_lag_168h",
      "gain_pct": 2.63
    },
    {
      "feature": "demand_last_1h",
      "gain_pct": 2.34
    },
    {
      "feature": "is_weekend",
      "gain_pct": 2.06
    },
    {
      "feature": "demand_roll_mean_168h",
      "gain_pct": 1.93
    }
  ],
  "registry": {
    "backend": "sqlite:///mlflow.db (local, gitignored)",
    "experiment": "energy-demand-forecast",
    "run_id": "00262eac575e4f168e9324860ed71484",
    "registered_model": "energy-demand-forecaster",
    "version": "3",
    "alias": "champion",
    "uri": "models:/energy-demand-forecaster@champion",
    "beats_baseline": true,
    "promoted": true,
    "note": "mlruns/ and mlflow.db are local run state and are gitignored; metrics/*.json is the only published surface."
  }
}
