使用回归对时间序列数据进行交叉验证

机器算法验证 机器学习 时间序列 预测 交叉验证 滞后
2022-03-12 12:38:31

我熟悉“常规”交叉验证,但现在我想在使用带有简单线性回归函数的交叉验证时进行时间序列预测。我写了一个简单的例子,以帮助澄清我的两个问题:一个关于训练/测试拆分的问题,一个关于当目标是预测不同的 n 时如何训练/测试模型的问题,预测步骤为 n,在进步。

(1)数据

假设我有时间点 1、...、10 的数据,如下所示:

timeseries = [0.5,0.3,10,4,5,6,1,0.4,0.1,0.9]

(2)将数据转换成对监督学习有用的格式

据我了解,我们可以使用“滞后”,即数据的变化来创建适合监督学习的数据集:

input = [NaN,0.5,0.3,10,4,5,6,1,0.4,0.1]
output/response = [0.5,0.3,10,4,5,6,1,0.4,0.1,0.9]

在这里,我只是将时间序列移动了一个以创建输出向量。据我了解,我现在可以使用输入作为线性回归模型的输入,并使用输出作为响应(NaN 可以近似为我们用随机值替换)。

(3) 问题一:交叉验证(“回测”)

假设我现在想做 2-splits,我是否必须改变火车和测试集?

即类似的东西:

动车组:

自变量:[NaN,0.5,0.3,10,4,5]

输出/响应变量:[0.5,0.3,10,4,5,6]

测试集:

自变量:[1,0.4,0.1]

输出/响应变量:[0.4,0.1,0.9]

(ii) 问题 2:提前预测不同的滞后

很明显,我已将因变量转移到自变量 1。假设现在我想训练一个可以提前预测 5 个时间步长的模型——我可以保持这个滞后一个,但仍然使用该模型来预测 n+1 ,...,n+5,... 还是我将自变量到因变量的转换更改为 5?究竟有什么区别?

1个回答

对于第一个问题,正如 Richard Hardy 指出的那样,有一篇关于该主题的优秀博客文章。还有这篇文章这篇文章,我发现它们非常有帮助。

对于第二个问题,您需要考虑多步时间序列预测的两种基本方法:递归预测和直接预测:

  • 在递归预测(也称为迭代预测)中,您只训练模型进行一步预测。训练完成后,您递归地应用最终模型来预测提前 1 步、提前 2 步等……直到达到所需的步预测范围。为此,您将每个连续步骤的预测反馈到模型中以生成下一步。这种方法被 ARIMA 和指数平滑算法等传统预测算法使用,也可用于基于机器学习的预测(参见这篇文章的例子,这篇文章的一些讨论)。n
  • 直接预测是当您为每个步骤训练一个单独的模型时(因此您尝试“直接”预测前面的步,而不是递归地达到步。有关直接预测等的讨论,请参阅Ben Taied等人复杂的组合方法。nthn

请注意,Hyndman 关于时间序列交叉验证的博客文章涵盖了领先一步和直接预测。


澄清递归预测(基于评论):

  1. 首先你训练你的模型。
  2. 一旦训练完成,你用来计算(这是你提前 1 步的预测),[Y1,Y2,....Yt]Y^t+1
  3. 然后你使用来计算,然后来计算,依此类推...直到你到达[Y2,...,Yt,Y^t+1]Y^t+2[Y3,...,Yt,Y^t+1,Y^t+2]Y^t+3Y^t+n

(这里是实际值,是预测值。)YY^