我以前有过用于模型调整的“正常”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 方法,如bats
、tbats
、auto.arima
等)。我是否错误地从模型参数调整的角度考虑这种方法,或者我将如何选择时间序列模型参数来为最终使用的模型设置?或者参数调整不考虑时间序列模型的问题,优化似乎是模型拟合的一部分,CV 的结果只是说明每个模型的整体性能如何?最后用大部分数据构建的最终模型是我要使用的模型吗?
我意识到这可以用一个更简单的问题来改写。在交叉验证(“前滚原点”)之后,我是否只使用最后一个构建的模型(最大的超集作为最终拟合模型?或者有什么建议?