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).