我如何确定一个预测比另一个预测准确得多?(时间序列)

机器算法验证 时间序列 统计学意义 预测 迪堡马里亚诺测试
2022-03-13 08:33:07

可重现的例子

看看这个可重现的例子:

  • 我有一个要预测的时间序列。为了重现性,我只取AirPassanger.
  • 假设我尝试拟合 5 个模型:ETS、(自动)ARIMA、漂移 SNAIVE、NNETAR、SNAIVE。
  • 我保留了部分数据作为测试集,并在训练集上训练了所有模型。
  • 我计算了每个模型的测试集的准确性。

library(forecast)
#> Registered S3 method overwritten by 'quantmod':
#>   method            from
#>   as.zoo.data.frame zoo

# train and test
ts <- AirPassengers
trn <- window(ts, end = c(1958, 12))
tst <- window(ts, start = c(1959, 1), end = c(1960, 12))

# models
set.seed(1)
mdl_ets <- ets(trn, lambda = 0)
mdl_arm <- auto.arima(trn, lambda = 0)
mdl_lag <- forecast:::lagwalk(trn, lag = 12, drift = TRUE, lambda = 0, biasadj = TRUE)
mdl_nnt <- nnetar(trn, h = length(tst))
mdl_snv <- snaive(trn, h = length(tst))

# forecast
frc_ets <- forecast(mdl_ets, h = length(tst))
frc_arm <- forecast(mdl_arm, h = length(tst))
frc_lag <- forecast(mdl_lag, h = length(tst), lambda = mdl_lag$lambda)
frc_nnt <- forecast(mdl_nnt, h = length(tst))
frc_snv <- forecast(mdl_snv, h = length(tst))

# plot
plot(ts)
lines(frc_ets$mean, col = "red")
lines(frc_arm$mean, col = "blue")
lines(frc_lag$mean, col = "green")
lines(frc_nnt$mean, col = "violet")
lines(frc_snv$mean, col = "orange")


# accuracy on test set
rbind(
        ets = accuracy(frc_ets, tst)[2,],
        arm = accuracy(frc_arm, tst)[2,],
        lag = accuracy(frc_lag, tst)[2,],
        nnt = accuracy(frc_nnt, tst)[2,],
        snv = accuracy(frc_snv, tst)[2,]
)
#>            ME     RMSE      MAE       MPE      MAPE      MASE       ACF1 Theil's U
#> ets 17.315122 26.53712 21.41598  3.452246  4.468821 0.7494900 0.42253991 0.5044923
#> arm 39.447258 43.18367 39.44726  8.516316  8.516316 1.3805262 0.46359970 0.8430396
#> lag -5.831543 17.01594 13.27878 -1.241407  3.005621 0.4647144 0.02788362 0.3432294
#> nnt 22.854463 30.06140 24.64835  4.661514  5.166691 0.8626125 0.45103130 0.5832227
#> snv 71.250000 76.99459 71.25000 15.523355 15.523355 2.4935191 0.72846283 1.5197525

reprex 包于 2021-03-25 创建(v0.3.0)

问题

我可以从图表和准确度表中看出,漂移的 SNAIVE(我称之为lag)可能是最好的。

有没有办法可以确定它是最好的?

我试过的

我正在寻找一些有意义的测试。我找到了 Diebold-Mariano 测试(包forecast和包multDM)。但是,我认为该测试特定于经过交叉验证的一步提前预测,这不是我的情况。

更多信息

在我的具体问题中,我不是构建模型的人。我有原始数据,我只从外部来源收到与我的测试集相对应的预测。我没有模型的参数,也没有置信区间。

如果您需要我对“准确性”的定义,请假设我可能会查看 MAPE 或 RMSE,但这只是因为它们更容易与非技术人员交流。我知道 MAPE 的局限性。

有人能帮我吗?

另外,这是我在这里的第一个问题,所以请让我知道我是否正确遵循了所有通常的标准。


更新

根据@Stephan Kolassa 的回答,我想这是正确的代码。

library(tsutils)

abs_err <- abs(cbind(
  ets = as.numeric(frc_ets$mean),
  arm = as.numeric(frc_arm$mean),
  lag = as.numeric(frc_lag$mean),
  nnt = as.numeric(frc_nnt$mean),
  snv = as.numeric(frc_snv$mean)
) - as.numeric(tst))

nemenyi(abs_err, plottype="vmcb")
#> Friedman and Nemenyi Tests
#> The confidence level is 5%
#> Number of observations is 24 and number of methods is 5
#> Friedman test p-value: 0.0000 - Ha: Different
#> Critical distance: 1.2451

在此处输入图像描述

tsutils::nemenyi(abs_err, plottype="vline")

在此处输入图像描述

tsutils::nemenyi(abs_err, plottype="matrix")

在此处输入图像描述

基于此,我不能说这lagnntand准确得多ets然而,有足够的证据表明这一点,arm而且snv明显不太准确。(正确的?)

几点:

  • 我尝试输入不同类型的错误:绝对错误、平方错误、绝对百分比错误。没有区别。
  • TStools,建议的 R 包,仅作为 GitHub 版本提供。tsutils是对应的 CRAN 版本。
  • 还有另一个执行这些测试的包:PMCMR,但它不提供相同的直观可视化。
  • 弗里德曼测试也包含在stats包中
friedman.test(abs_err)
#> 
#>  Friedman rank sum test
#> 
#> data:  abs_err
#> Friedman chi-squared = 61.167, df = 4, p-value = 1.649e-12

PMCMR::posthoc.friedman.nemenyi.test(abs_err)
#> 
#>  Pairwise comparisons using Nemenyi multiple comparison test 
#>              with q approximation for unreplicated blocked data
#> 
#> data: abs_err
#> 
#>     ets     arm     lag     nnt    
#> arm 0.02875 -       -       -      
#> lag 0.85358 0.00082 -       -      
#> nnt 0.99998 0.03754 0.80900 -      
#> snv 8.8e-08 0.03754 1.4e-10 1.5e-07
#> 
#> P value adjustment method: none
2个回答

预测者(那些确实担心统计显着性的人,这仍然不是我们所有人;将Diebold 2015 年在裁判报告中对“为什么有人会关心这个主题感到困惑”的回忆与他们最初提交的数据进行比较)通常会愉快地总结多个步骤提前获得每个系列和方法在时间上的平均误差,然后使用 Diebold-Mariano 检验比较这些摘要,即使它原则上只打算比较单个时间步长。然而,为什么 DM 测试不是很有帮助的问题是它只比较两个预测,而且你有很多,所以你有一个多重比较问题。

在这种情况下,标准方法是最初由Koning 等人提出的“多次比较最佳”(MCB)测试。(2005 年)对 M3 预测竞争的重新分析。最近,它也被应用于 M5 预测比赛中的提交。它是基于排名的,因此它适用于任何准确度度量(以及适当的点预测,Kolassa,2020,SCNR)。一个相关的替代方法是 Friedman-Nemenyi 检验(Demsar,2006 年)。

MCB 和 Nememyi 测试都在TStoolsR 的包中实现。Hibon 等人在 2012 年 ISF 报告中给出了两者之间的经验比较

可以通过多种方式定义最佳。更准确的是我将其定义为从业者而不是研究人员的方式。我只是用 MAPE 将预测结果与实际结果进行比较。但即使是为了准确性,也有很多选择。

当然,这种方式没有统计显着性检验。由于结果是真实的,我认为这并不重要。不涉及样本和总体问题。