mean_linex_error(y_true, y_pred, a=1.0, b=1.0, horizon_weight=None, multioutput='uniform_average', **kwargs)[source]

Calculate mean linex error.

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

Many forecasting loss functions (like those discussed in [Ra7beba1eea18-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.

The linex error function accounts for this by penalizing errors on one side of a threshold approximately linearly, while penalizing errors on the other side approximately exponentially.

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.

aint or float

Controls whether over- or under- predictions receive an approximately linear or exponential penalty. If a > 0 then negative errors (over-predictions) are penalized approximately linearly and positive errors (under-predictions) are penalized approximately exponentially. If a < 0 the reverse is true.

bint or float

Multiplicative penalty to apply to calculated errors.

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.


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.


Calculated as b * (np.exp(a * error) - a * error - 1), where a != 0 and b > 0 according to formula in [2]_.



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


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


>>> import numpy as np
>>> from aeon.performance_metrics.forecasting import mean_linex_error
>>> y_true = np.array([3, -0.5, 2, 7, 2])
>>> y_pred = np.array([2.5, 0.0, 2, 8, 1.25])
>>> mean_linex_error(y_true, y_pred)  
>>> mean_linex_error(y_true, y_pred, b=2)  
>>> mean_linex_error(y_true, y_pred, a=-1)  
>>> y_true = np.array([[0.5, 1], [-1, 1], [7, -6]])
>>> y_pred = np.array([[0, 2], [-1, 2], [8, -5]])
>>> mean_linex_error(y_true, y_pred)  
>>> mean_linex_error(y_true, y_pred, a=-1)  
>>> mean_linex_error(y_true, y_pred, multioutput='raw_values')  
array([0.17220024, 0.36787944])
>>> mean_linex_error(y_true, y_pred, multioutput=[0.3, 0.7])