KLDivergenceNormal
KL-divergence based forecast error assuming normal errors (KL-N).
KL-N uses the Kullback-Leibler divergence between the actual and predicted distributions, assuming normally distributed forecast errors scaled by a rolling variance of the true values. Output is non-negative floating point, lower is better, with 0.0 indicating a perfect forecast.
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
where
is the rolling sample variance of the first \(i-1\) true values, and \(\bar{y}_{i-1}\) is their mean.
\(S_1^2\) is undefined (no prior observations) and \(S_2^2\) can be zero (single prior observation); both are clamped to eps.
multioutput and multilevel control averaging across variables and hierarchy indices, see below.
evaluate_by_index returns jackknife pseudo-values of KL-N, at each time index \(t_i\), computed as \(n \cdot \text{KL-N} - (n-1) \cdot \text{KL-N}_{-i}\), where \(\text{KL-N}_{-i}\) removes the i-th error contribution from the aggregate while keeping the rolling variances \(S_i^2\) fixed (since they depend causally on prior observations).
Quickstart
from sktime.performance_metrics.forecasting import KLDivergenceNormal
estimator = KLDivergenceNormal(multioutput='uniform_average', multilevel='uniform_average', by_index=False, eps=None, window=None)Parameters(5)
- windowint or None, default=None
Number of prior observations used to estimate the rolling variance.
If
None(default), an expanding window is used: all prior observations \(y_1, \dots, y_{i-1}\) contribute to \(S_i^2\).If
int, a fixed-length rolling window of the given size is used. For example,window=5reproduces the KL-N1 variant andwindow=10reproduces the KL-N2 variant of Chen & Yang (2004).
- epsfloat, default=None
- Numerical epsilon used in denominator to avoid division by zero. 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 theevaluatemethod.If
True, direct call to the metric object evaluates the metric at each time point, equivalent to a call of theevaluate_by_indexmethod.
Examples
>>> import numpy as np
>>> from sktime.performance_metrics.forecasting import KLDivergenceNormal
>>> y_true = np. array ([3.0, 5.0, 2.0, 7.0, 4.0, 6.0 ])
>>> y_pred = np. array ([3.0, 5.0, 3.0, 6.0, 5.0, 5.5 ])
>>> kln = KLDivergenceNormal ()
>>> kln (y_true, y_pred) np.float64(0.5771341616115743)References
- Chen, Z. and Yang, Y. (2004). “Assessing Forecast Accuracy Measures”, Preprint 2004-10, Iowa State University.