Scikit-learn 中的平均绝对百分比误差 (MAPE)

机器算法验证 预测模型 Python scikit-学习 马佩
2022-01-30 12:56:31

我们如何使用 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)
2个回答

如前所述(例如,在 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