【问题标题】:How to find symmetric mean absolute error in python?如何在python中找到对称平均绝对误差?
【发布时间】:2018-12-28 14:37:37
【问题描述】:

如何使用 numpy 或 pandas 在 python 中计算对称平均绝对误差? scikit sklearn 中是否存在指标?

示例数据:

Actual value:   2,3,4,5,6,7,8,9
Forecast value: 1,3,5,4,6,7,10,7

SMAPE 公式见下图:

如何在 python 中使用 pandas 或 numpy 并计算 SMAPE。

注意:有关 SMAPE 的更多信息:https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error

【问题讨论】:

  • 据我所知,该指标在通用库中不可用。只需自己实现它......公式很简单。
  • @Kefeng91 我不明白怎么回事?如何获得100%/n。如果可能的话,你能写答案吗?
  • 100% 只是表示指标以百分比表示。没有它,结果将介于 0 和 1 之间。因此,您只需乘以 100。
  • @Kefeng91 如果可以的话请写一个答案:)
  • http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html,这可能对你有帮助。

标签: python numpy statistics


【解决方案1】:

将方程转换为 numpy 非常简单

import numpy as np

def smape(A, F):
    return 100/len(A) * np.sum(2 * np.abs(F - A) / (np.abs(A) + np.abs(F)))

A = np.array([2,3,4,5,6,7,8,9])
F = np.array([1,3,5,4,6,7,10,7])
print(smape(A, F))

【讨论】:

  • 很好的答案 - 只是想知道它是 100/len(A) 还是 1/len(A),因为它在函数中显示 100%
  • @gyx-hh:取决于你是否想要它作为百分比。通常,在数学中您不会输入 100%,而是将百分比表示为 [0, 1] 中的值,但这就是 OP 定义它的方式
  • @stonerock:n 值是您拥有的值的数量。所以,len(A)len(F)。只要确保它们是平等的
  • 对于 Python 2.7,您应该将 100 更改为 100.float(100)。否则,对于长度超过 100 的数组,它将等于 0。
  • 为了避免可能的division by zero,我会将(np.abs(A) + np.abs(F))更新为(np.abs(A) + np.abs(F)) + np.finfo(float).eps。我只是为某种正则化添加了epsilon 值。
【解决方案2】:

试试下面的。

def mape(row):
    return abs(row.Forecast - row.Actual) / ((abs(row.Actual) + abs(row.Forecast))/2)

# create the pandas dataframe if you dont have one already
df=pd.DataFrame.from_dict({'Actual':[2,3,4,5,6,7,8,9], 'Forecast':[1,3,5,4,6,7,10,7]})

# apply the above function on each row 
smape = df.apply(mape, axis=1).sum() * (1/len(df))

输出:0.19791666666666669

【讨论】:

  • @blue_note 的功能不错。如果你想使用 pandas,你可以通过调用 smape(df.Actual, df.Forecast) 来使用他的功能
【解决方案3】:

我评论了接受的答案,但如果您只想复制和粘贴:

import numpy as np

def smape(A, F):
    tmp = 2 * np.abs(F - A) / (np.abs(A) + np.abs(F))
    len_ = np.count_nonzero(~np.isnan(tmp))
    if len_ == 0 and np.nansum(tmp) == 0: # Deals with a special case
        return 100
    return 100 / len_ * np.nansum(tmp)

A = np.array([2,3,4,5,6,7,8,0])
F = np.array([1,3,5,4,6,7,10,0])
print(smape(A, F))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2019-07-10
    • 1970-01-01
    • 2016-07-06
    • 2021-04-19
    • 2018-12-18
    相关资源
    最近更新 更多