核心要点

  • 不能随机划分:样本非独立,shuffle 会让训练集含未来、测试含过去,造成信息泄漏。

  • 前向链(扩展窗口):训练集逐步向后扩展,每折测试紧随其后的一段未来。

  • 滚动窗口:固定长度训练窗整体向后滑动,适合关注近期、序列较长场景。

  • 务必留 gap:训练与验证间留间隔,避免滞后/滑窗特征跨界泄漏。

标准回答

为什么不能随机划分

普通 K 折随机打乱样本,假设样本独立同分布。时间序列样本有时间依赖:随机划分会把未来的点放进训练集、过去的点放进测试集,相当于「用未来预测过去」,产生数据泄漏,线下指标虚高而无法反映真实的外推能力。

正确做法:按时间切分

  • 前向链 / 扩展窗口(forward chaining):第 1 折用 [1..n] 训练、[n+1..n+h] 验证;第 2 折训练集扩展到 [1..n+h]、再验证后一段,如此滚动多折。训练集始终早于验证集。
  • 滚动窗口(rolling):训练窗口长度固定、整体向后滑动,更强调近期数据、对概念漂移敏感。

实现要点

每折按时间排序、训练严格早于验证;若特征含 lag-k 或滑窗,应在训练与验证间留 gap 防跨界泄漏;多折取平均指标评估稳健性。sklearn 的 TimeSeriesSplit 即实现前向链。

常见误区

⚠️ 常见踩坑

用了 TimeSeriesSplit 却忘了特征工程归一化/编码在全量上拟合,或滑窗跨越训练验证边界——泄漏仍然存在。

追问

追问 1前向链和滚动窗口怎么选?

数据量有限、模式较稳定时用前向链(扩展窗口)充分利用历史;序列很长或存在概念漂移、更看重近期表现时用固定长度滚动窗口,避免远古数据稀释近期规律。两者都保证训练早于验证。

追问 2为什么训练和验证之间要留 gap?

如果预测要提前 h 步,或特征用了未来若干步才能算出的滑窗,紧贴边界会让验证集间接看到训练期信息或反之。留出与预测跨度/特征窗口相当的 gap,能模拟真实部署时的信息可用性。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。