# -*- coding: utf-8 -*-
from sklearn.utils.validation import check_array, column_or_1d as c1d
import numpy as np
from .compat.numpy import DTYPE
__all__ = ['smape']
def _check_array(y):
return c1d(
check_array(y, ensure_2d=False, force_all_finite=False,
copy=True, dtype=DTYPE))
[docs]def smape(y_true, y_pred):
r"""Compute the Symmetric Mean Absolute Percentage Error.
The symmetric mean absolute percentage error (SMAPE) is an accuracy measure
based on percentage (or relative) errors. Defined as follows:
:math:`\frac{100\%}{n}\sum_{t=1}^{n}{\frac{|F_{t}-A_{t}|}{
(|A_{t}|+|F_{t}|)/2}}`
Where a perfect SMAPE score is 0.0, and a higher score indicates a higher
error rate.
Parameters
----------
y_true : array-like, shape=(n_samples,)
The true test values of y.
y_pred : array-like, shape=(n_samples,)
The forecasted values of y.
Examples
--------
A typical case:
>>> import numpy as np
>>> y_true = np.array([0.07533, 0.07533, 0.07533, 0.07533,
... 0.07533, 0.07533, 0.0672, 0.0672])
>>> y_pred = np.array([0.102, 0.107, 0.047, 0.1,
... 0.032, 0.047, 0.108, 0.089])
>>> smape(y_true, y_pred)
42.60306631890196
A perfect score:
>>> smape(y_true, y_true)
0.0
References
----------
.. [1] https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error # noqa: E501
"""
y_true = _check_array(y_true) # type: np.ndarray
y_pred = _check_array(y_pred) # type: np.ndarray
abs_diff = np.abs(y_pred - y_true)
return np.mean((abs_diff * 200 / (np.abs(y_pred) + np.abs(y_true))))