我们如何使用 Python 和 scikit-learn 计算预测的平均绝对百分比误差 (MAPE)?
从文档中,我们只有这 4 个回归度量函数:
- metrics.explained_variance_score(y_true, y_pred)
- metrics.mean_absolute_error(y_true, y_pred)
- metrics.mean_squared_error(y_true, y_pred)
- metrics.r2_score(y_true, y_pred)
我们如何使用 Python 和 scikit-learn 计算预测的平均绝对百分比误差 (MAPE)?
从文档中,我们只有这 4 个回归度量函数:
如前所述(例如,在 Wikipedia 中),MAPE 可能存在问题。最明显的是,它可能导致被零除的错误。我的猜测是,这就是为什么它不包含在 sklearn 指标中的原因。
但是,实现起来很简单。
from sklearn.utils import check_arrays
def mean_absolute_percentage_error(y_true, y_pred):
y_true, y_pred = check_arrays(y_true, y_pred)
## Note: does not handle mix 1d representation
#if _is_1d(y_true):
# y_true, y_pred = _check_1d_array(y_true, y_pred)
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
像任何其他指标一样使用...:
> y_true = [3, -0.5, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> mean_absolute_percentage_error(y_true, y_pred)
Out[19]: 17.738095238095237
(请注意,我乘以 100 并返回一个百分比。)
...但要小心:
> y_true = [3, 0.0, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> #Note the zero in y_pred
> mean_absolute_percentage_error(y_true, y_pred)
-c:8: RuntimeWarning: divide by zero encountered in divide
Out[21]: inf
这是一个更新的版本:
import numpy as np
def mean_absolute_percentage_error(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100