核心要点
不能随机划分:样本非独立,shuffle 会让训练集含未来、测试含过去,造成信息泄漏。
前向链(扩展窗口):训练集逐步向后扩展,每折测试紧随其后的一段未来。
滚动窗口:固定长度训练窗整体向后滑动,适合关注近期、序列较长场景。
务必留 gap:训练与验证间留间隔,避免滞后/滑窗特征跨界泄漏。
标准回答
为什么不能随机划分
普通 K 折随机打乱样本,假设样本独立同分布。时间序列样本有时间依赖:随机划分会把未来的点放进训练集、过去的点放进测试集,相当于「用未来预测过去」,产生数据泄漏,线下指标虚高而无法反映真实的外推能力。
正确做法:按时间切分
- 前向链 / 扩展窗口(forward chaining):第 1 折用 [1..n] 训练、[n+1..n+h] 验证;第 2 折训练集扩展到 [1..n+h]、再验证后一段,如此滚动多折。训练集始终早于验证集。
- 滚动窗口(rolling):训练窗口长度固定、整体向后滑动,更强调近期数据、对概念漂移敏感。
实现要点
每折按时间排序、训练严格早于验证;若特征含 lag-k 或滑窗,应在训练与验证间留 gap 防跨界泄漏;多折取平均指标评估稳健性。sklearn 的 TimeSeriesSplit 即实现前向链。
追问
追问 1:前向链和滚动窗口怎么选?
数据量有限、模式较稳定时用前向链(扩展窗口)充分利用历史;序列很长或存在概念漂移、更看重近期表现时用固定长度滚动窗口,避免远古数据稀释近期规律。两者都保证训练早于验证。
追问 2:为什么训练和验证之间要留 gap?
如果预测要提前 h 步,或特征用了未来若干步才能算出的滑窗,紧贴边界会让验证集间接看到训练期信息或反之。留出与预测跨度/特征窗口相当的 gap,能模拟真实部署时的信息可用性。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。