使用 k 折交叉验证进行时间序列模型选择

机器算法验证 时间序列 造型 交叉验证
2022-02-02 14:58:38

问题: 我想确定一件事,使用时间序列的k-fold交叉验证是简单的,还是在使用之前需要特别注意?

背景: 我正在建模一个 6 年的时间序列(使用半马尔可夫链),每 5 分钟有一个数据样本。为了比较几个模型,我使用 6 折交叉验证,将 6 年的数据分开,所以我的训练集(用于计算参数)的长度为 5 年,测试集的长度为 1年。我没有考虑时间顺序,所以我的不同设置是:

  • 折叠 1:训练 [1 2 3 4 5],测试 [6]
  • 折叠 2:训练 [1 2 3 4 6],测试 [5]
  • 折叠 3:训练 [1 2 3 5 6],测试 [4]
  • 折叠 4:训练 [1 2 4 5 6],测试 [3]
  • 折叠 5:训练 [1 3 4 5 6],测试 [2]
  • fold 6:训练 [2 3 4 5 6],测试 [1]。

我假设每年都是相互独立的。我该如何验证呢?是否有任何参考资料显示 k 折交叉验证与时间序列的适用性。

4个回答

时间序列(或其他本质上有序的数据)可能会给交叉验证带来问题。如果某些模式在第 3 年出现并持续 4-6 年,那么您的模型可以接受它,即使它不是第 1 年和第 2 年的一部分。

有时对时间序列更有原则的方法是前向链接,您的过程将是这样的:

  • 折叠 1:训练 [1],测试 [2]
  • 折叠 2:训练 [1 2],测试 [3]
  • 折叠 3:训练 [1 2 3],测试 [4]
  • 折叠 4:训练 [1 2 3 4],测试 [5]
  • 折叠 5:训练 [1 2 3 4 5],测试 [6]

这样可以更准确地模拟您将在预测时看到的情况,您将在其中对过去的数据进行建模并根据前瞻性数据进行预测。它还将让您了解建模对数据大小的依赖性。

我用于交叉验证我的时间序列模型的方法是滚动交叉验证。从用于训练目的的一小部分数据开始,预测后面的数据点,然后检查预测数据点的准确性。然后将相同的预测数据点作为下一个训练数据集的一部分包含在内,并预测后续数据点。

为了让事情变得直观,这里有一个相同的图像:

在此处输入图像描述

等效的 R 代码将是:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)

进行时间序列交叉验证的“规范”方法(至少@Rob Hyndman 所述)是“滚动”数据集。

IE:

  • 折叠 1:训练 [1],测试 [2]
  • 折叠 2:训练 [1 2],测试 [3]
  • 折叠 3:训练 [1 2 3],测试 [4]
  • 折叠 4:训练 [1 2 3 4],测试 [5]
  • 折叠 5:训练 [1 2 3 4 5],测试 [6]

基本上,您的训练集不应包含测试集之后出现的信息。

在大多数情况下,使用“未来”数据块进行时间序列交叉验证没有任何问题。在大多数情况下,我指的是静态数据模型,这是我们通常使用的模型。例如,当你适合ARIMA(p,d,q), 和d>0一个系列,你拿d序列的差异,并将静态数据的模型拟合到残差。

要使交叉验证用作模型选择工具,您需要训练数据和测试数据之间的近似独立性。时间序列数据的问题是相邻的数据点往往高度依赖,所以标准的交叉验证会失败。对此的补救措施是在测试样本的两侧,在测试样本和训练样本之间留下一个间隙您还需要在测试样本之前留出间隙的原因是,当您在时间上向前或向后移动时,相关性是对称的(想想相关性)。

这种方法称为hv交叉验证(离开v出,删除h测试样品两侧的观察结果),并在本文中进行了描述。在您的示例中,这将如下所示:

  • 折叠 1:训练 [1 2 3 4 5h],测试 [6]
  • 折叠 2:训练 [1 2 3 4h h6],测试 [5]
  • 折叠 3:训练 [1 2 3h h5 6],测试 [4]
  • 折叠 4:训练 [1 2h h4 5 6],测试 [3]
  • 折叠 5:训练 [1h h3 4 5 6],测试 [2]
  • 6折:训练[h2 3 4 5 6],测试[1]

其中 h 表示在该侧删除了训练样本的 h 个观察值。