核心要点

  • 明确三者分工:训练集拟合参数,验证集选模型/调超参/早停,测试集只做最终评估。

  • 说清为何要验证集:用测试集调参会泄露信息、高估泛化,必须有独立中间集。

  • 测试集全程「冻结」,只在确定方案后用一次,不能据其反复改模型。

  • 数据少时用 K 折交叉验证替代固定验证集,分布不均时分层抽样、时序数据按时间切分。

标准回答

三者分工

  • 训练集:用于拟合模型参数;
  • 验证集:用于在多个候选模型/超参之间做选择、早停、特征筛选——即一切「调」的决策都看验证集表现;
  • 测试集:模拟未来未见数据,只在方案完全确定后评估一次,给出无偏的泛化估计。

典型比例如 6:2:2 或 8:1:1,数据量越大测试比例可越小。

为什么需要验证集

如果直接用测试集来挑超参,相当于让模型「偷看」了测试集——你会反复选在测试集上碰巧最好的配置,导致信息泄露、测试指标虚高,无法反映真实泛化。验证集把「调参」与「最终评估」隔离开:调参在验证集上做,测试集保持干净。

数据不够怎么办

样本少时用 K 折交叉验证:把训练数据分 K 份轮流当验证集,平均结果更稳、利用率更高。类别不均衡用分层抽样保持各集比例一致;时间序列必须按时间顺序划分,避免用未来预测过去。

常见误区

⚠️ 常见踩坑

别用测试集调参或反复试——一旦据测试结果改模型,它就退化成验证集,泛化估计失真。也别在划分前做全局标准化/特征选择,否则信息从测试集泄露进训练。

追问

追问 1什么时候用交叉验证而不是固定验证集?

数据量小、单次划分方差大时用 K 折交叉验证:轮流用每一折做验证、其余训练,平均得到更稳健的估计,也充分利用数据。数据极大时固定划分即可,省算力

追问 2数据预处理(如标准化)应在哪一步做?

必须只在训练集上拟合(算均值方差、选特征),再用同样参数变换验证/测试集;交叉验证里要把预处理放进 Pipeline 随每折重新拟合。否则统计量含了验证/测试信息,造成数据泄露。

追问 3时间序列数据如何划分?

不能随机打乱,必须按时间切:用过去训练、未来验证/测试,可用滚动/扩窗的时序交叉验证(TimeSeriesSplit)。这样才能避免「用未来信息预测过去」的泄露,贴近真实上线场景。

延伸学习

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