Skip to the content.

Metrics

Metrics are implemented in src/evaluation/metrics.py. They are computed per bottom-level series and then summarized with an unweighted mean unless the caller performs a different aggregation.

MASE

Mean Absolute Scaled Error divides forecast MAE by the in-sample seasonal-naive MAE:

MASE = mean(abs(y - y_hat)) / mean(abs(y_t - y_(t-m)))

m defaults to seven for daily data. The code protects degenerate denominators with a small numerical floor.

RMSSE

Root Mean Squared Scaled Error is the squared-error analogue of MASE. M5 also uses scaled squared error, but this repository’s reported mean RMSSE is not the official M5 WRMSSE: it omits the official sales weights and hierarchical aggregation levels.

Pinball loss

For quantile q and forecast y_hat_q:

L_q = max(q * (y - y_hat_q), (q - 1) * (y - y_hat_q))

Pinball loss is asymmetric and evaluates a forecast quantile rather than only a point estimate.

Repository WQL variant

The pipeline totals pinball loss across requested quantiles and horizon steps and normalizes it using in-sample seasonal-naive MAE times the horizon:

WQL = 2 * sum_q sum_h L_(q,h) / scale

The in-sample denominator avoids division by an empty test-window demand total for intermittent series. This is a deliberate project-specific choice and should not be conflated with every library’s WQL definition or the official M5 uncertainty metric. Compare values only when the definition, quantile grid, horizon, and data are held constant.

Coverage

Coverage is the fraction of observations at or below each predicted quantile. It is a calibration diagnostic: over many comparable observations, a calibrated q quantile should have coverage near q.