我在 Python 中创建了两个不同的 MAPE 公式:
error1 = abs((df['y_hat'] - df2['y_predicted']) / df['y_hat'])
mape1 = np.mean(error1)
mape_percentage1 = mape1 * 100
print("MAPE: {:.2f}%".format(mape_percentage1))
和
error2 = abs((df1.sum() - df2.sum()) / df1.sum())
mape2 = np.mean(error2)
mape_percentage2 = mape2 * 100
print("MAPE: {:.2f}%".format(mape_percentage2))
(是的,我知道 np.mean(error2) 对第二个公式没有任何作用,但为了相似起见我添加了它。)
作为参考,这是我正在尝试评估的模型的简化版本:
import pandas as pd
import numpy as np
from statsmodels.tsa.holtwinters import ExponentialSmoothing
df = pd.read_csv('data.csv', index_col=0, parse_dates=True)
data = df[:-7]
actuals = df[-7:]
model = ExponentialSmoothing(data['Sales'], trend='add', seasonality='add', seasonal_periods=7).fit()
fcast=model.forecast(steps=7)
我使用的是第二个公式,因为我不能使用第一个,因为 fcast 是作为一个系列返回的,所以当我尝试使用第一个时,我得到的是 NaN。然后当我意识到我可以使用 .to_frame() 将 fcast 系列转换为数据帧时,我再次尝试了第一个公式,结果得到了一个截然不同的 MAPE(第二个公式的 MAPE 是 .32,而第一个是15.12).
此外,我使用的数据有一个日期时间索引,然后有 1 列历史数据,并且预测以相同的方式返回。
理论上,公式不一样吗?
第一个公式是对每一行进行计算然后取平均值,而第二个公式是一次对整个数据帧进行计算。
例如,如果我有一个数据框,其中的实际值列为:
|索引(日期) |实际情况 |
| ---------- | ------|
| 2020-1-1 | 100 |
| 2020-1-2 | 100 |
| 2020-1-3 | 100 |
和预测值为的数据框:
|索引(日期) |实际情况 |
| ---------- | ------|
| 2020-1-1 | 98 |
| 2020-1-2 | 77 |
| 2020-1-3 | 86 |
然后使用这些公式计算MAPE:
公式一:
100 - 98 = 2
100 - 77 = 23
100 - 86 = 14
2/100 = .02
23/100 = .23
14/100 = .14
.02+.23+.14 = .4
.4/3 = .13
公式2:
100 + 100 + 100 = 300
98 + 77 + 86 = 261
300 - 261 = 39
39/300 = .13
它最终是相同的值。
另外,如果问题的格式很奇怪,我深表歉意。我根据他们的指南正确格式化了它,但出于某种原因,stackoverflow 不允许我发布它,尝试了一个多小时,这是他们接受的格式。