Scikit学习中的平均绝对百分比误差(MAPE)


23

我们如何使用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)

请参阅上stackOverflow-这个答案stackoverflow.com/questions/42250958/...
Arpit西索迪亚

Answers:


23

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

1
这个答案有误。应为(y_predy_true分母替换):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio 2014年

1
check_arrays被肮脏的沟渠抛弃了。有check_array在当前sklearn但它似乎并不像它的工作方式相同。
千焦

从.16中删除了check_arrays方法。
Arpit Sisodia'5


16

这是更新的版本:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.