时序数据拆分中train_test_split(shuffle=False)与TimeSeriesSplit的差异
核心差异与结果异常原因
两个拆分方法的本质区别
train_test_split(shuffle=False)是单次切分工具:会按照你指定的test_size比例,直接从数据集尾部切割出对应比例的数据作为验证集,剩余的头部数据全部作为训练集,仅生成1组训练/验证对。TimeSeriesSplit是时序多折交叉验证工具:默认参数n_splits=5,会自动生成5组符合时序逻辑的训练/验证对,每组训练集均为对应验证集之前的所有历史数据,完全避免时序数据泄露问题,核心用途是多折验证模型的泛化能力,而非做单次切分。
你遇到结果差异的直接原因
- 拆分结果实际不一致
你表述的“两种方法拆分结果一致”是误判:
你的总样本量为7440+1488=8928条,使用TimeSeriesSplit默认参数时,最后一折的验证集长度固定为8928/(5+1)=1488条。而你使用train_test_split时设置的test_size=0.167是近似值,计算得到的验证集长度为8928*0.167≈1491条,两种方法得到的训练集、验证集长度都有差异,训练数据量不同自然会导致模型拟合效果不一样。 - 代码存在变量覆盖错误
你的预测代码存在低级错误:
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
相关产品推荐
相关产品推荐

