📢 转载信息
原文链接:https://machinelearningmastery.com/5-ways-to-use-cross-validation-to-improve-time-series-models/
原文作者:Jason Brownlee
时间序列模型评估通常依赖于交叉验证。然而,传统的时间序列数据具有固有依赖性,使得标准方法(如K折交叉验证)不适用。
如果你想改进时间序列模型的性能,你需要在验证过程中考虑时间依赖性,这需要使用专门的交叉验证策略。
本文介绍了五种用于改进时间序列模型性能的交叉验证方法。
首先,我们将回顾为什么标准交叉验证不适用于时间序列数据。
然后,我们将介绍五种改进时间序列模型评估的方法:
- 时间序列拆分(Time Series Split)
- 滚动原点再拟合(Rolling Origin Re-fit)
- 带滞后或移动窗口的交叉验证(Cross-Validation with Lag or Sliding Windows)
- 分组K折验证(Group K-Fold Validation)
- 基于时间序列分组的K折验证(Time Series Group K-Fold Validation)
最后,我们将总结这些方法并提供关于何时使用每种方法的指导。
在我们深入了解这些方法之前,让我们先看看为什么标准交叉验证不适用于时间序列数据。

为什么标准交叉验证不适用于时间序列数据
时间序列数据是按时间顺序排列的观测值序列。这种时间依赖性是时间序列预测的核心特征,也是标准交叉验证方法(如K折交叉验证)不适用于时间序列预测模型的原因。
在使用K折交叉验证时,数据集被随机分成K个折叠,其中K-1个用于训练,1个用于测试。这种随机划分会破坏数据的时间顺序。
当时间序列数据被随机打乱时,训练数据可能包含测试数据中的未来信息,导致数据泄露(data leakage)。模型可能会在测试集上表现得非常好,但在应用于真实世界的未来数据时性能会急剧下降。
要正确评估时间序列模型,你需要使用一种交叉验证策略,该策略在训练和测试数据之间保持时间顺序。
让我们来看看专门为时间序列设计的第一种交叉验证方法。
1. 时间序列拆分(Time Series Split)
时间序列拆分是一种基本的交叉验证方法,它简单地将数据集按时间顺序分成训练集和验证集。
具体来说,这通常涉及将数据集分成一个初始训练集和一个后续的验证集。例如,你可以使用前80%的数据进行训练,后20%的数据进行验证。
这种方法的优点是它非常简单且易于理解。它确保了验证集中的所有数据都严格发生在训练集之后,从而防止了数据泄露。
然而,它也有局限性。它只产生一个训练/验证对。如果你想更稳健地评估模型性能,你可能需要更多的评估点。
为了解决这个问题,我们可以使用循环方法,如滚动原点再拟合。
2. 滚动原点再拟合(Rolling Origin Re-fit)
滚动原点再拟合(有时也称为“向前交叉验证”或“时间序列顺序交叉验证”)是时间序列模型评估中最常用和最推荐的方法之一。
这种方法的工作原理是:
- 选择一个初始训练集和后续的验证集。
- 在训练集上拟合模型。
- 在验证集上评估模型。
- “滚动”:将验证集中的下一个时间步添加到训练集中,并将其从验证集中移除,创建一个新的训练/验证对。
- 重复此过程,直到所有数据都用于验证。
例如,如果你有一个包含100个时间步的数据集,并且你决定使用10个时间步的训练集来预测接下来的1个时间步,这个过程将如下所示:
- 迭代1:使用时间步 1-10 训练,预测时间步 11。
- 迭代2:使用时间步 1-11 训练,预测时间步 12。
- ...
- 迭代90:使用时间步 1-100 训练,预测时间步 101。
这种方法的好处是它生成了多个模型评估点,提供了对模型性能更稳健的估计。它模拟了在实际部署中模型不断接收新数据的场景。
这种方法也可以与固定大小的训练集结合使用,这在滚动原点再拟合的更严格版本中很常见,有时被称为“滑动窗口”或“回溯测试”。
3. 带滞后或移动窗口的交叉验证(Cross-Validation with Lag or Sliding Windows)
滚动原点再拟合的变体是使用具有固定大小的训练和验证窗口。这在机器学习库(如Scikit-learn的TimeSeriesSplit)中很常见。
它的工作原理是:
- 选择一个固定的训练窗口大小(例如,使用最后12个月的数据)。
- 选择一个固定的验证窗口大小(例如,预测接下来的1个月)。
- 在数据上滑动这些窗口,每次移动一个时间步或一个窗口大小的增量。
考虑一个有100个时间步的数据集。如果训练窗口大小为12,验证窗口大小为1:
- 迭代1:使用时间步 1-12 训练,预测时间步 13。
- 迭代2:使用时间步 2-13 训练,预测时间步 14。
- ...
这种方法的关键在于训练集和验证集之间没有重叠(如果我们将验证窗口大小设为1)。这与滚动原点再拟合的连续扩展训练集方法不同。这里,模型在每次迭代中都是从头开始重新训练,使用的是一个固定大小的历史窗口。
这种方法非常适合评估模型对近期历史数据的敏感性,可以帮助你确定你的模型对数据波动有多大的适应性。
4. 分组K折验证(Group K-Fold Validation)
分组K折验证是当你的数据点天然地分组时使用的技术。在时间序列背景下,这通常意味着你的数据包含来自多个独立时间序列或时间序列组的观测值。
例如,你可能有来自多个传感器或多个不同地点的每日温度记录。每个传感器/地点都是一个独立的组,但所有这些记录共同构成一个大的数据集。
使用分组K折验证的目的是确保在交叉验证的任何迭代中,来自同一组的所有观测值都位于同一个集合中——要么全在训练集中,要么全在验证集中。它永远不会将同一组的观测值拆分到训练集和验证集中。
这对于时间序列很重要,因为如果一个组的数据点在训练和测试集中都有出现,模型可能会学习到该特定组的独特模式,从而夸大了其泛化能力。
分组K折验证保证了对每个组的独立评估。
5. 基于时间序列分组的K折验证(Time Series Group K-Fold Validation)
这是一种结合了时间序列顺序和分组概念的更复杂方法。如果你有多个时间序列(例如,来自不同城市的销售数据),并且你想评估模型跨越时间点的泛化能力,你可以使用此方法。
这里的“组”是每个独立的时间序列(例如,城市A,城市B,城市C)。交叉验证的拆分是基于这些组进行的,而不是基于单独的时间点。
例如,你有三个时间序列:A(100个点),B(100个点),C(100个点)。如果你使用3折分组交叉验证:
- 折叠1:组 A 训练,组 B 和 C 验证。
- 折叠2:组 B 训练,组 A 和 C 验证。
- 折叠3:组 C 训练,组 A 和 B 验证。
关键点在于,每个时间序列(组)作为一个整体被保留用于测试。 这种方法评估的是模型学习到的跨序列模式的泛化能力,而不是在单个序列内部的预测能力。
何时使用每种交叉验证方法
选择正确的交叉验证方法取决于你的具体预测目标和数据的结构。
下表总结了何时考虑使用每种方法:

总结
当你处理时间序列数据时,避免使用标准K折交叉验证至关重要,因为它会导致数据泄露,从而导致对模型性能的乐观估计。
要稳健地评估时间序列模型,请选择专门为此设计的交叉验证策略:
- 滚动原点再拟合:适用于评估模型在连续新数据流上的性能。
- 带滞后的窗口:适用于评估模型对固定历史窗口的敏感度。
- 分组K折:适用于评估模型在不同独立时间序列上的泛化能力。
选择正确的方法将确保你的模型评估是准确的,并且你的模型在投入生产后能够提供可靠的预测。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区