时间序列交叉验证的最终模型

机器算法验证 时间序列 预测 交叉验证
2022-03-16 00:36:22

我以前有过用于模型调整的“正常”K 折交叉验证的经验,我对时间序列模型中的应用有点困惑。

据我了解,对于时间序列模型,交叉验证的推论是Hyndman描述的“前滚起源”过程。这对我来说很有意义,下面的代码演示了在海德曼的博客tsCV中使用 R 中的函数,以一次性显示错误与 CV 与整个数据集的区别。

library(fpp)
e <- tsCV(dj, rwf, drift=TRUE, h=1)
sqrt(mean(e^2, na.rm=TRUE))
## [1] 22.68249
sqrt(mean(residuals(rwf(dj, drift=TRUE))^2, na.rm=TRUE))
## [1] 22.49681

现在,在上面的那个链接中,它提到在每个新的预测原点重新估计漂移参数。在“正常”简历中,我将有一个参数网格,我将针对每个折叠进行评估,这样我就可以获得一个平均值来确定要使用的最佳参数。然后,我将使用这些“最佳”参数来拟合完整的训练集,并将其用作我的最终模型来评估我之前提供的测试集。请注意,这是嵌套的交叉验证,所以我在任何时候都没有在我的测试集上进行训练。

这显然不是“前滚原点”过程的情况,其中参数针对每个折叠进行了优化(至少对于 R 方法,如batstbatsauto.arima等)。我是否错误地从模型参数调整的角度考虑这种方法,或者我将如何选择时间序列模型参数来为最终使用的模型设置?或者参数调整不考虑时间序列模型的问题,优化似乎是模型拟合的一部分,CV 的结果只是说明每个模型的整体性能如何?最后用大部分数据构建的最终模型是我要使用的模型吗?

我意识到这可以用一个更简单的问题来改写。在交叉验证(“前滚原点”)之后,我是否只使用最后一个构建的模型(最大的超集作为最终拟合模型?或者有什么建议?

2个回答

您可以将前滚原点与 k 折交叉验证(又名回测与交叉验证)结合起来。预先确定折叠一次,并在每个滚动时间迭代 k 个折叠,在 k-1 上训练并在 k 上测试。所有保留的测试折叠的并集为您提供了当时整个数据集的完整覆盖,并且训练折叠在当时覆盖了数据集 k-1 次,您可以以任何合适的方式聚合(例如,平均)。然后像通常那样分别对训练和测试进行评分,以获得当时单独的训练/测试分数。

在优化参数时,首先创建一个单独的holdout set,然后只对剩余的数据进行刚才描述的交叉验证。对于每个要优化的参数,您需要决定该参数是独立于时间(因此您可以在所有滚动时间上执行优化)还是依赖于时间(因此每次都单独优化参数)。如果是后者,您可以将参数表示为时间的函数(可能是线性的),然后在所有时间优化该函数的时间无关系数。

如果您优化了测试数据的参数,您将部分地将数据拟合到测试数据而不是训练数据。您想知道哪种方法比保留数据最好,而不是,例如,应该在 Holt Winters 模型中设置什么伽玛值。