You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

时序数据拆分中train_test_split(shuffle=False)与TimeSeriesSplit的差异

核心差异与结果异常原因

两个拆分方法的本质区别

  • train_test_split(shuffle=False)是单次切分工具:会按照你指定的test_size比例,直接从数据集尾部切割出对应比例的数据作为验证集,剩余的头部数据全部作为训练集,仅生成1组训练/验证对。
  • TimeSeriesSplit是时序多折交叉验证工具:默认参数n_splits=5,会自动生成5组符合时序逻辑的训练/验证对,每组训练集均为对应验证集之前的所有历史数据,完全避免时序数据泄露问题,核心用途是多折验证模型的泛化能力,而非做单次切分。

你遇到结果差异的直接原因

  1. 拆分结果实际不一致
    你表述的“两种方法拆分结果一致”是误判:
    你的总样本量为7440+1488=8928条,使用TimeSeriesSplit默认参数时,最后一折的验证集长度固定为8928/(5+1)=1488条。而你使用train_test_split时设置的test_size=0.167是近似值,计算得到的验证集长度为8928*0.167≈1491条,两种方法得到的训练集、验证集长度都有差异,训练数据量不同自然会导致模型拟合效果不一样。
  2. 代码存在变量覆盖错误
    你的预测代码存在低级错误:
y_test = model.predict(X_test) # 此处把真实的测试集标签y_test覆盖为了预测值
print(rmsle(y_test, y_test)) # 此处计算的是预测值和自身的误差,完全不代表真实模型效果

你方法1输出的136明显是变量覆盖导致的错误结果,和模型实际泛化能力无关,需把预测值变量名修改为y_test_pred后重新计算指标。

正确使用建议

  • 如果仅需要单次切分验证集,直接用train_test_split(shuffle=False)即可,注意把test_size设置为精确值1/6即可和TimeSeriesSplit最后一折的拆分结果对齐。
  • 如果要使用TimeSeriesSplit做交叉验证,不要只取最后一折的数据训练,应该在每折内单独训练模型,取多折的平均评估指标判断模型效果,最终再用全量训练集训练模型推理测试集。

内容的提问来源于stack exchange,提问作者HJ.Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:15:07