确定总体时间序列模型改进百分比

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:

  1. 我很快意识到当 TRUE 值为 0 时 MAPE 失败,所以我简单地删除了这些行并计算了每个时间序列中两个模型的 MAPE。
                 OLD_MAPE  NEW_MAPE
    TIME_SERIES                  
    0                50.0      10.0
    1                19.9       9.9
    
  2. 然后为了获得每个时间序列的百分比改进,我将取两个值(旧 - 新)之间的差异
                 PCT_IMPROVEMENT
    TIME_SERIES                  
    0                         40
    1                         10
    
  3. 最后,我会取所有时间序列的平均值以获得整体改进
    (40 + 10)/2 = 25%
    

现在我正在考虑使用 MAE:

  1. 和MAPE一样,我会先计算两个模型的MAE
                 OLD_MAE  NEW_MAE
    TIME_SERIES                  
    0                3.0      0.5
    1               99.5     49.5
    
  2. 然后我会使用以下公式计算出每个时间序列的改进百分比:(new - old)/old x 100 x -1。 (乘以 -1,因为损失分数越低越好,并且会带来积极的百分比改善)
                 PCT_IMPROVEMENT
    TIME_SERIES                     
    0                      83.33
    1                      50.25
    
  3. 现在,由于我们使用的是与比例无关的百分比,所以我可以对所有时间序列取平均值,最终得到一个数字,这将是我的整体百分比改进。
    (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