mean_asymmetric_error#

mean_asymmetric_error(y_true, y_pred, asymmetric_threshold=0.0, left_error_function='squared', right_error_function='absolute', left_error_penalty=1.0, right_error_penalty=1.0, horizon_weight=None, multioutput='uniform_average', **kwargs)[source]#

Calculate mean of asymmetric loss function.

Output is non-negative floating point. The best value is 0.0.

Error values that are less than the asymmetric threshold have left_error_function applied. Error values greater than or equal to asymmetric threshold have right_error_function applied.

Many forecasting loss functions (like those discussed in [1]) assume that over- and under- predictions should receive an equal penalty. However, this may not align with the actual cost faced by users’ of the forecasts. Asymmetric loss functions are useful when the cost of under- and over- prediction are not the same.

Setting asymmetric_threshold to zero, left_error_function to ‘squared’ and right_error_function to ‘absolute` results in a greater penalty applied to over-predictions (y_true - y_pred < 0). The opposite is true for left_error_function set to ‘absolute’ and right_error_function set to ‘squared`.

The left_error_penalty and right_error_penalty can be used to add differing multiplicative penalties to over-predictions and under-predictions.

Parameters:
y_truepd.Series, pd.DataFrame or np.array of shape (fh,) or (fh, n_outputs) where fh is the forecasting horizon

Ground truth (correct) target values.

y_predpd.Series, pd.DataFrame or np.array of shape (fh,) or (fh, n_outputs) where fh is the forecasting horizon

Forecasted values.

asymmetric_thresholdfloat, default = 0.0

The value used to threshold the asymmetric loss function. Error values that are less than the asymmetric threshold have left_error_function applied. Error values greater than or equal to asymmetric threshold have right_error_function applied.

left_error_function{‘squared’, ‘absolute’}, default=’squared’

Loss penalty to apply to error values less than the asymmetric threshold.

right_error_function{‘squared’, ‘absolute’}, default=’absolute’

Loss penalty to apply to error values greater than or equal to the asymmetric threshold.

left_error_penaltyint or float, default=1.0

An additional multiplicative penalty to apply to error values less than the asymetric threshold.

right_error_penaltyint or float, default=1.0

An additional multiplicative penalty to apply to error values greater than the asymmetric threshold.

horizon_weightarray-like of shape (fh,), default=None

Forecast horizon weights.

multioutput{‘raw_values’, ‘uniform_average’} or array-like of shape (n_outputs,), default=’uniform_average’

Defines how to aggregate metric for multivariate (multioutput) data. If array-like, values used as weights to average the errors. If ‘raw_values’, returns a full set of errors in case of multioutput input. If ‘uniform_average’, errors of all outputs are averaged with uniform weight.

Returns:
asymmetric_lossfloat

Loss using asymmetric penalty of on errors. If multioutput is ‘raw_values’, then asymmetric loss is returned for each output separately. If multioutput is ‘uniform_average’ or an ndarray of weights, then the weighted average asymmetric loss of all output errors is returned.

See also

mean_linex_error

Notes

Setting left_error_function and right_error_function to “aboslute”, but choosing different values for left_error_penalty and right_error_penalty results in the “lin-lin” error function discussed in [2].

References

[1]

Hyndman, R. J and Koehler, A. B. (2006). “Another look at measures of forecast accuracy”, International Journal of Forecasting, Volume 22, Issue 4.

[2]

Diebold, Francis X. (2007). “Elements of Forecasting (4th ed.)”, Thomson, South-Western: Ohio, US.

Examples

>>> import numpy as np
>>> from aeon.performance_metrics.forecasting import mean_asymmetric_error
>>> y_true = np.array([3, -0.5, 2, 7, 2])
>>> y_pred = np.array([2.5, 0.0, 2, 8, 1.25])
>>> mean_asymmetric_error(y_true, y_pred)
0.5
>>> mean_asymmetric_error(y_true, y_pred, left_error_function='absolute',     right_error_function='squared')
0.4625
>>> y_true = np.array([[0.5, 1], [-1, 1], [7, -6]])
>>> y_pred = np.array([[0, 2], [-1, 2], [8, -5]])
>>> mean_asymmetric_error(y_true, y_pred)
0.75
>>> mean_asymmetric_error(y_true, y_pred, left_error_function='absolute',     right_error_function='squared')
0.7083333333333334
>>> mean_asymmetric_error(y_true, y_pred, multioutput='raw_values')
array([0.5, 1. ])
>>> mean_asymmetric_error(y_true, y_pred, multioutput=[0.3, 0.7])
0.85