MASE (Mean Absolute Scaled Error)

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

Discover more from Insightful Data Lab

Subscribe to get the latest posts sent to your email.

Similar Posts

Questions, corrections, or additional insights?

This site uses Akismet to reduce spam. Learn how your comment data is processed.