Back to models
Metric

MeanAbsolutePercentageErrorStabilized

Rolling MAD-stabilized symmetric mean absolute percentage error (msMAPE).

A variant of symmetric MAPE that adds a rolling mean absolute deviation (MAD) term to the denominator, stabilizing the metric when actual and predicted values are near zero.

For a univariate, non-hierarchical sample of true values \(y_1, \dots, y_n\) and predicted values \(\widehat{y}_1, \dots, \widehat{y}_n\), evaluate or call returns

\[\text{msMAPE} = \frac{1}{n} \sum_{i=1}^{n} \frac{|y_i - \widehat{y}_i|}{(|y_i| + |\widehat{y}_i|) / 2 + S_i}\]

where

\[S_1 = 0, \qquad S_i = \frac{1}{i-1} \sum_{k=1}^{i-1} |y_k - \bar{y}_{i-1}| \quad (i \ge 2)\]

and \(\bar{y}_{i-1} = \frac{1}{i-1} \sum_{k=1}^{i-1} y_k\) is the rolling mean of the first \(i-1\) true values.

The \(S_i\) term provides stability when both \(y_i\) and \(\widehat{y}_i\) are near zero, addressing a known weakness of sMAPE.

To avoid division by zero, any denominator is replaced by eps if it is smaller than eps; the value of eps defaults to np.finfo(np.float64).eps if not specified.

multioutput and multilevel control averaging across variables and hierarchy indices, see below.

evaluate_by_index returns, at a time index \(t_i\), the stabilized absolute percentage error at that time index, \(\frac{|y_i - \widehat{y}_i|}{(|y_i| + |\widehat{y}_i|) / 2 + S_i}\), for all time indices \(t_1, \dots, t_n\) in the input.

Quickstart

python
from sktime.performance_metrics.forecasting import MeanAbsolutePercentageErrorStabilized

estimator = MeanAbsolutePercentageErrorStabilized(multioutput='uniform_average', multilevel='uniform_average', by_index=False, eps=None)

Parameters(4)

epsfloat, default=None
Numerical epsilon used in denominator to avoid division by zero. Absolute values smaller than eps are replaced by eps. If None, defaults to np.finfo(np.float64).eps
multioutput‘uniform_average’ (default), 1D array-like, or ‘raw_values’

Whether and how to aggregate metric for multivariate (multioutput) data.

  • If 'uniform_average' (default), errors of all outputs are averaged with uniform weight.

  • If 1D array-like, errors are averaged across variables, with values used as averaging weights (same order).

  • If 'raw_values', does not average across variables (outputs), per-variable errors are returned.

multilevel{‘raw_values’, ‘uniform_average’, ‘uniform_average_time’}

How to aggregate the metric for hierarchical data (with levels).

  • If 'uniform_average' (default), errors are mean-averaged across levels.

  • If 'uniform_average_time', metric is applied to all data, ignoring level index.

  • If 'raw_values', does not average errors across levels, hierarchy is retained.

by_indexbool, default=False

Controls averaging over time points in direct call to metric object.

  • If False (default), direct call to the metric object averages over time points, equivalent to a call of the evaluate method.

  • If True, direct call to the metric object evaluates the metric at each time point, equivalent to a call of the evaluate_by_index method.

Examples

>>> import numpy as np
>>> from sktime.performance_metrics.forecasting import (
... MeanAbsolutePercentageErrorStabilized,
... )
>>> y_true = np. array ([3, 5, 2, 7 ])
>>> y_pred = np. array ([2.5, 4, 2, 8 ])
>>> metric = MeanAbsolutePercentageErrorStabilized ()
>>> metric (y_true, y_pred) np.float64(0.13004235907461714)

References

  1. Chen, Z. and Yang, Y. (2004). “Assessing Forecast Accuracy Measures”, Preprint 2004-10, Iowa State University.