python中的MAPE计算

Mag*_*_rs 4 python numpy python-3.x pandas spyder

我想计算预测值和真值的平均绝对百分比误差(MAPE).我从这里找到了一个解决方案,但是这会给出错误并在行中显示无效的语法mask = a <> 0

    def mape_vectorized_v2(a, b): 
    mask = a <> 0
    return (np.fabs(a - b)/a)[mask].mean() 

   def mape_vectorized_v2(a, b): 
       File "<ipython-input-5-afa5c1162e83>", line 1
         def mape_vectorized_v2(a, b):
                                       ^
     SyntaxError: unexpected EOF while parsing
Run Code Online (Sandbox Code Playgroud)

我正在使用spyder3.我的预测值是类型np.array,真值是数据帧

type(predicted)
Out[7]: numpy.ndarray
type(y_test)
Out[8]: pandas.core.frame.DataFrame
Run Code Online (Sandbox Code Playgroud)

如何清除此错误并继续进行MAPE计算?

编辑:

predicted.head()
Out[22]: 
   Total_kWh
0   7.163627
1   6.584960
2   6.638057
3   7.785487
4   6.994427

y_test.head()
Out[23]: 
     Total_kWh
79         7.2
148        6.7
143        6.7
189        7.2
17         6.4

np.abs(y_test[['Total_kWh']] - predicted[['Total_kWh']]).head()
Out[24]: 
   Total_kWh
0        NaN
1        NaN
2        NaN
3        NaN
4   0.094427
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 17

在python中用于比较不等于需要!=,不是<>.

所以需要:

def mape_vectorized_v2(a, b): 
    mask = a != 0
    return (np.fabs(a - b)/a)[mask].mean()
Run Code Online (Sandbox Code Playgroud)

stats.stackexchange的另一个解决方案:

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
Run Code Online (Sandbox Code Playgroud)

  • 这给了我一个楠.你知道什么时候会产生这样的价值吗?我的第二个数组包含0的值,如何修改后一个解决方案以包含这些情况? (3认同)
  • 第一个函数会不会导致a的负值的MAPE负值?分母也是绝对的,计算不应该是`(np.fabs((a-b))/ a)[mask] .mean()`吗? (2认同)

O. *_*sen 9

新版本的 scikit-learn (v0.24) 有一个计算 MAPE 的函数。 sklearn.metrics.mean_absolute_percentage_error

您所需要的只是两个类似数组的变量:y_true存储实际/真实值,并y_pred存储预测值。

您可以参考这里的官方文档。

  • sklearn Mean_absolute_percentage_error 给出了错误的值,即使在本文档中,如果您看到给出的示例,也会获得 112589990684262.48 的大值作为结果。 (2认同)

Pab*_*eda 7

两种解决方案都不适用于零值。这是我的工作:

def percentage_error(actual, predicted):
    res = np.empty(actual.shape)
    for j in range(actual.shape[0]):
        if actual[j] != 0:
            res[j] = (actual[j] - predicted[j]) / actual[j]
        else:
            res[j] = predicted[j] / np.mean(actual)
    return res

def mean_absolute_percentage_error(y_true, y_pred): 
    return np.mean(np.abs(percentage_error(np.asarray(y_true), np.asarray(y_pred)))) * 100
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助。