Python 中的 MAPE 计算

新手上路,请多包涵

我想计算预测值和真实值的平均绝对百分比误差 (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

我正在使用 spyder3。我的预测值是 np.array 类型,真实值是 dataframe

 type(predicted)
Out[7]: numpy.ndarray
type(y_test)
Out[8]: pandas.core.frame.DataFrame

我如何清除此错误并继续进行 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

原文由 Magg_rs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

在 Python 中比较需要 != ,而不是 <>

所以需要:

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

来自 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

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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

我希望它有所帮助。

原文由 Pablo Andrés Castañeda 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题