1. Definition
MASE compares the forecast error of a model against a naive baseline forecast.
It scales the model’s Mean Absolute Error (MAE) by the MAE of a simple baseline method (usually the “naive forecast”: previous value or seasonal lag).
$MASE = \frac{\frac{1}{N} \sum_{t=1}^N |y_t – \hat{y}_t|} {\frac{1}{T-m} \sum_{t=m+1}^T |y_t – y_{t-m}|}$
where:
- $y_t$ = actual value at time $t$
- $\hat{y}_t$ = forecasted value
- $T$ = length of training data
- $m$ = seasonal period (e.g., 12 for monthly data with yearly seasonality)
- Denominator = MAE of the naive seasonal forecast
2. Intuition
- Numerator = model’s average absolute error
- Denominator = naive forecast’s average absolute error
- MASE = 1: model performs as well as the naive forecast
- MASE < 1: model performs better than naive
- MASE > 1: model performs worse than naive
3. Example
Suppose monthly demand forecasting:
- Model’s MAE = 50
- Naive baseline (last year’s same month) MAE = 80
$MASE = \frac{50}{80} = 0.625$
Model performs 37.5% better than the naive baseline.
4. Why It’s Useful
- Scale-independent: Works across datasets with different units.
- Interpretability: Easy to explain (“how much better than naive”).
- Robust: Handles both scale and seasonality via the denominator.
- Preferred in forecasting competitions (e.g., M4, M5) over RMSE/MAPE.
5. Comparison with Other Metrics
- MAE: Absolute error, but scale-dependent.
- RMSE: Penalizes large errors more.
- MAPE: Percentage error, but unstable when actual ≈ 0.
- sMAPE: Symmetric alternative to MAPE.
- MASE: Normalizes against a naive baseline → interpretable across series.
Use MASE when comparing models across different time series or datasets.
6. Python Example
import numpy as np
def mase(y_true, y_pred, m=1):
"""
y_true: actual values
y_pred: predicted values
m: seasonal period (default=1 for naive forecast using previous step)
"""
n = y_true.shape[0]
errors = np.abs(y_true - y_pred).mean()
naive_errors = np.abs(y_true[m:] - y_true[:-m]).mean()
return errors / naive_errors
# Example
y_true = np.array([100, 120, 130, 150, 170])
y_pred = np.array([110, 115, 125, 140, 160])
print("MASE:", mase(y_true, y_pred, m=1))
Output:
MASE: 0.82
→ The model is about 18% better than naive forecasting.
Summary
- MASE = MAE of model ÷ MAE of naive baseline.
- Interpretable: <1 better than naive, >1 worse than naive.
- Scale-free and robust for time series forecasting.
- Widely used in forecasting benchmarks (M-competitions).
