Walk-forward CV of the data op with
quantile_strategy="multiple_regressors" (HGB, max_iter=2000),
horizons 1h, 12h, 24h, quantiles 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 8 CV splits, with
(recalibrate=True, 10 bins, calibrated on the last 4 inner folds of each training set) and without
calibration.Recalibrator. See calibration_demo.html for how the
correction works. Scores are those reported by the data op, averaged over the CV
splits. Coverage and width are for the 0.05–0.95 interval (nominal
coverage 0.90).
| horizon | coverage raw | coverage recalibrated | mean width (MW) raw | mean width (MW) recalibrated | width change |
|---|---|---|---|---|---|
| 1h | 0.815 | 0.904 | 2168 | 2732 | +26.0% |
| 12h | 0.764 | 0.910 | 3331 | 4784 | +43.6% |
| 24h | 0.761 | 0.904 | 3298 | 4788 | +45.2% |
mean_absolute_percentage_error of each model's median prediction,
averaged over the CV splits. The last column is the change in percentage points
(negative is better).
| horizon | MAPE of the median raw (%) | MAPE of the median recalibrated (%) | change (points) |
|---|---|---|---|
| 1h | 1.112 | 1.123 | 0.011 |
| 12h | 1.955 | 2.053 | 0.098 |
| 24h | 1.972 | 2.061 | 0.089 |
| test start | 1h raw | 1h recal. | 12h raw | 12h recal. | 24h raw | 24h recal. |
|---|---|---|---|---|---|---|
| 2023-06-03 | 1.43 | 1.44 | 2.19 | 2.29 | 2.25 | 2.36 |
| 2023-09-02 | 1.27 | 1.30 | 1.82 | 2.23 | 1.82 | 2.29 |
| 2023-12-02 | 1.27 | 1.29 | 2.17 | 2.47 | 2.14 | 2.30 |
| 2024-03-02 | 1.35 | 1.34 | 2.33 | 2.32 | 2.34 | 2.33 |
| 2024-06-01 | 0.79 | 0.83 | 1.53 | 1.55 | 1.59 | 1.61 |
| 2024-08-31 | 0.88 | 0.88 | 1.68 | 1.64 | 1.73 | 1.68 |
| 2024-11-30 | 0.93 | 0.93 | 2.02 | 2.02 | 1.98 | 1.98 |
| 2025-03-01 | 0.97 | 0.98 | 1.90 | 1.90 | 1.94 | 1.94 |
| quantile | d2 pinball raw | d2 pinball recalibrated | difference |
|---|---|---|---|
| q_0.05 | 0.7825 | 0.7974 | 0.0149 |
| q_0.1 | 0.8104 | 0.8199 | 0.0095 |
| q_0.25 | 0.8443 | 0.8400 | -0.0044 |
| q_0.5 | 0.8541 | 0.8476 | -0.0065 |
| q_0.75 | 0.8443 | 0.8466 | 0.0023 |
| q_0.9 | 0.8141 | 0.8315 | 0.0174 |
| q_0.95 | 0.7991 | 0.8157 | 0.0166 |
| mean over quantiles | 0.8213 | 0.8284 | 0.0071 |
| test start | 1h raw | 1h recal. | 12h raw | 12h recal. | 24h raw | 24h recal. |
|---|---|---|---|---|---|---|
| 2023-06-03 | 0.687 | 0.812 | 0.675 | 0.901 | 0.653 | 0.889 |
| 2023-09-02 | 0.749 | 0.861 | 0.775 | 0.891 | 0.785 | 0.884 |
| 2023-12-02 | 0.815 | 0.901 | 0.783 | 0.926 | 0.773 | 0.909 |
| 2024-03-02 | 0.827 | 0.937 | 0.776 | 0.923 | 0.788 | 0.928 |
| 2024-06-01 | 0.857 | 0.974 | 0.758 | 0.949 | 0.758 | 0.957 |
| 2024-08-31 | 0.850 | 0.937 | 0.781 | 0.913 | 0.763 | 0.904 |
| 2024-11-30 | 0.867 | 0.913 | 0.764 | 0.866 | 0.759 | 0.856 |
| 2025-03-01 | 0.864 | 0.901 | 0.797 | 0.916 | 0.807 | 0.907 |
max_iter=2000, new splitter (8 outer test folds of 13 weeks, aligned to the end,
2023-06-03 to 2025-05-31), calibration on the last 4 inner folds of each training set
(4 x 13 weeks, about 8.7k out-of-fold rows per split), 10 bins. Runtime was 1h45 (raw 27 min,
recalibrated 78 min).
Ground truth (black), median (line) and the 0.05–0.95 quantile band, for the raw (top) and recalibrated (bottom) models, concatenating the test folds of all the CV splits. The x axis is the target time (prediction time plus horizon). Use the dropdown to change the horizon. Drag a rectangle to zoom in both x and y; double-click to reset. The initial window is two weeks of the last split. The two panels look nearly identical because the correction is small: over these test folds the recalibrated median differs from the raw one by at most 1374 MW, and the interval bounds by at most 2689 MW (about 5.5% of the load). Zoom in to see it (for example around 2023-12-03 18:00).
Both plots below are reliability diagrams, but they check different properties. All the CV test folds are pooled.
For each nominal level τ, the empirical coverage: the fraction of observed values at or below the τ-quantile forecast, plotted against τ (one panel per horizon, dashed line = perfect calibration). It is the marginal check, averaged over all situations, so a model can be on the diagonal on average while being miscalibrated in particular situations, with errors cancelling out.
The marginal coverage above can hide over-confidence in some regions and under-confidence in others. Here the test cases are split into 10 bins of equal size by each model's predicted median, and in each bin we compute the observed coverage of the 0.05–0.95 interval (the fraction of observations inside it). The dashed line is the nominal level. A curve below it means the interval is too narrow at that predicted load, above it too wide.
One panel per quantile level τ (use the dropdown to change the horizon). The test cases
are split into 10 bins of equal size by predicted value (each model's own predictions);
in each bin, x is the mean prediction and y is the mean prediction plus the τ-quantile of
the residuals y − p in the bin. Using the residuals (rather than the plain
quantile of y in the bin) removes an artefact of the predictions varying inside a
bin, so a perfectly calibrated model lies exactly on the dashed 45° diagonal (actual =
predicted); the axes are on the same scale (1:1). This is the conditional check: it asks
whether the claimed level holds for the cases with that prediction, and reveals
miscalibration that depends on the predicted value, which the coverage curve can hide.
The same check, with the conditional τ-quantile estimated by isotonic regression: sort the cases by prediction, then repeatedly pool adjacent blocks whenever their τ-quantile would decrease. The result is a monotone step function whose blocks are placed by the data, with no bin width to choose. Again, a perfectly calibrated model lies on the dashed 45° diagonal, and the axes are on the same scale (1:1).
For q_0.95, q_0.5 and q_0.05, one colour per CV split. Lines: the correction (shift in MW added to the predicted quantile) learned by the recalibrator on the training set of the split, as a function of the predicted value. Points: the same measured on the outer test fold with the raw predictions (equal-count bins of the predicted value, shift = quantile of y − p in the bin), i.e. what the correction should have been on the test data. If the calibration transfers from the training set to the test fold, the lines go through the points. Bottom: the correction itself; top: the same as predicted quantile → actual quantile (predicted + shift), where the dashed diagonal is a calibrated model (the corrections are small compared to the range of loads, so the bottom row is easier to read).