确定总体时间序列模型改进百分比
Determining Overall Time Series Model Percent Improvement
我对数千个时间序列的旧模型和新模型 运行 都有真实值和预测。我的目标是计算新模型相对于旧模型的整体改进。下面是我的数据的示例:
DATE TRUE OLD_PRED NEW_PRED
TIME_SERIES
0 21-10-01 10 5 9
0 21-10-02 0 1 0
1 21-10-01 500 600 550
1 21-10-02 501 600 550
我的第一个方法是使用 MAPE:
- 我很快意识到当 TRUE 值为 0 时 MAPE 失败,所以我简单地删除了这些行并计算了每个时间序列中两个模型的 MAPE。
OLD_MAPE NEW_MAPE
TIME_SERIES
0 50.0 10.0
1 19.9 9.9
- 然后为了获得每个时间序列的百分比改进,我将取两个值(旧 - 新)之间的差异
PCT_IMPROVEMENT
TIME_SERIES
0 40
1 10
- 最后,我会取所有时间序列的平均值以获得整体改进
(40 + 10)/2 = 25%
现在我正在考虑使用 MAE:
- 和MAPE一样,我会先计算两个模型的MAE
OLD_MAE NEW_MAE
TIME_SERIES
0 3.0 0.5
1 99.5 49.5
- 然后我会使用以下公式计算出每个时间序列的改进百分比:(new - old)/old x 100 x -1。 (乘以 -1,因为损失分数越低越好,并且会带来积极的百分比改善)
PCT_IMPROVEMENT
TIME_SERIES
0 83.33
1 50.25
- 现在,由于我们使用的是与比例无关的百分比,所以我可以对所有时间序列取平均值,最终得到一个数字,这将是我的整体百分比改进。
(83.33 + 50.25)/2 = 66.79%
当然,我仍然需要从我的计算中删除一些时间序列,以避免在我的实际数据中除以 0,但使用 MAE 方法的时间序列要少得多(3% 对使用 MAPE 的近 30%。)
我想知道这种方法是否合理,或者是否有更好的方法来提高整体百分比?我的另一个担忧是总体改进百分比会根据我使用 MAPE、MAE、MSE 还是 RMSE 而变化,这让我想知道哪个指标最正确?
计算MAPE时,您说:
Then to get the percentage improvement for each time series, I would take the difference between the 2 values (old - new)
但你实际上是在描述如何计算百分比差异,而不是如何计算百分比差异。计算百分比差异的方法应该与计算 MAE 的方法相同。下面是一个示例,说明如何针对您提供的示例数据集之一执行此操作,表明无论您使用 MAE 还是 MAPE,百分比差异实际上是相同的。
import numpy as np
# setup your second timeseries
y_true = np.array([500, 501])
y_hat_old = np.array([600, 600])
y_hat_new = np.array([550, 550])
# calculate mape ------
# rounding to correct floating point precision issue
mape_old = np.round(np.mean(np.abs((y_true - y_hat_old) / y_true)), 2)
print(mape_old)
# 0.2
mape_new = np.round(np.mean(np.abs((y_true - y_hat_new) / y_true)), 2)
print(mape_new)
# 0.1
mape_percent_improvement = (mape_old - mape_new) / mape_old
print(mape_percent_improvement)
# 0.5
# calculate mae -----
# rounding to correct floating point precision issue
mae_old = np.mean(np.abs(y_true - y_hat_old))
print(mae_old)
# 99.5
mae_new = np.mean(np.abs(y_true - y_hat_new))
print(mae_new)
# 49.5
# again, rounding to correct floating point precision issue
mae_percent_improvement = np.round((mae_old - mae_new) / mae_old, 2)
print(mae_percent_improvement)
# 0.5
print(mape_percent_improvement == mae_percent_improvement)
# True
我对数千个时间序列的旧模型和新模型 运行 都有真实值和预测。我的目标是计算新模型相对于旧模型的整体改进。下面是我的数据的示例:
DATE TRUE OLD_PRED NEW_PRED
TIME_SERIES
0 21-10-01 10 5 9
0 21-10-02 0 1 0
1 21-10-01 500 600 550
1 21-10-02 501 600 550
我的第一个方法是使用 MAPE:
- 我很快意识到当 TRUE 值为 0 时 MAPE 失败,所以我简单地删除了这些行并计算了每个时间序列中两个模型的 MAPE。
OLD_MAPE NEW_MAPE TIME_SERIES 0 50.0 10.0 1 19.9 9.9
- 然后为了获得每个时间序列的百分比改进,我将取两个值(旧 - 新)之间的差异
PCT_IMPROVEMENT TIME_SERIES 0 40 1 10
- 最后,我会取所有时间序列的平均值以获得整体改进
(40 + 10)/2 = 25%
现在我正在考虑使用 MAE:
- 和MAPE一样,我会先计算两个模型的MAE
OLD_MAE NEW_MAE TIME_SERIES 0 3.0 0.5 1 99.5 49.5
- 然后我会使用以下公式计算出每个时间序列的改进百分比:(new - old)/old x 100 x -1。 (乘以 -1,因为损失分数越低越好,并且会带来积极的百分比改善)
PCT_IMPROVEMENT TIME_SERIES 0 83.33 1 50.25
- 现在,由于我们使用的是与比例无关的百分比,所以我可以对所有时间序列取平均值,最终得到一个数字,这将是我的整体百分比改进。
(83.33 + 50.25)/2 = 66.79%
当然,我仍然需要从我的计算中删除一些时间序列,以避免在我的实际数据中除以 0,但使用 MAE 方法的时间序列要少得多(3% 对使用 MAPE 的近 30%。)
我想知道这种方法是否合理,或者是否有更好的方法来提高整体百分比?我的另一个担忧是总体改进百分比会根据我使用 MAPE、MAE、MSE 还是 RMSE 而变化,这让我想知道哪个指标最正确?
计算MAPE时,您说:
Then to get the percentage improvement for each time series, I would take the difference between the 2 values (old - new)
但你实际上是在描述如何计算百分比差异,而不是如何计算百分比差异。计算百分比差异的方法应该与计算 MAE 的方法相同。下面是一个示例,说明如何针对您提供的示例数据集之一执行此操作,表明无论您使用 MAE 还是 MAPE,百分比差异实际上是相同的。
import numpy as np
# setup your second timeseries
y_true = np.array([500, 501])
y_hat_old = np.array([600, 600])
y_hat_new = np.array([550, 550])
# calculate mape ------
# rounding to correct floating point precision issue
mape_old = np.round(np.mean(np.abs((y_true - y_hat_old) / y_true)), 2)
print(mape_old)
# 0.2
mape_new = np.round(np.mean(np.abs((y_true - y_hat_new) / y_true)), 2)
print(mape_new)
# 0.1
mape_percent_improvement = (mape_old - mape_new) / mape_old
print(mape_percent_improvement)
# 0.5
# calculate mae -----
# rounding to correct floating point precision issue
mae_old = np.mean(np.abs(y_true - y_hat_old))
print(mae_old)
# 99.5
mae_new = np.mean(np.abs(y_true - y_hat_new))
print(mae_new)
# 49.5
# again, rounding to correct floating point precision issue
mae_percent_improvement = np.round((mae_old - mae_new) / mae_old, 2)
print(mae_percent_improvement)
# 0.5
print(mape_percent_improvement == mae_percent_improvement)
# True