核心要点
明确三者分工:训练集拟合参数,验证集选模型/调超参/早停,测试集只做最终评估。
说清为何要验证集:用测试集调参会泄露信息、高估泛化,必须有独立中间集。
测试集全程「冻结」,只在确定方案后用一次,不能据其反复改模型。
数据少时用 K 折交叉验证替代固定验证集,分布不均时分层抽样、时序数据按时间切分。
标准回答
三者分工
- 训练集:用于拟合模型参数;
- 验证集:用于在多个候选模型/超参之间做选择、早停、特征筛选——即一切「调」的决策都看验证集表现;
- 测试集:模拟未来未见数据,只在方案完全确定后评估一次,给出无偏的泛化估计。
典型比例如 6:2:2 或 8:1:1,数据量越大测试比例可越小。
为什么需要验证集
如果直接用测试集来挑超参,相当于让模型「偷看」了测试集——你会反复选在测试集上碰巧最好的配置,导致信息泄露、测试指标虚高,无法反映真实泛化。验证集把「调参」与「最终评估」隔离开:调参在验证集上做,测试集保持干净。
数据不够怎么办
样本少时用 K 折交叉验证:把训练数据分 K 份轮流当验证集,平均结果更稳、利用率更高。类别不均衡用分层抽样保持各集比例一致;时间序列必须按时间顺序划分,避免用未来预测过去。
常见误区
⚠️ 常见踩坑
别用测试集调参或反复试——一旦据测试结果改模型,它就退化成验证集,泛化估计失真。也别在划分前做全局标准化/特征选择,否则信息从测试集泄露进训练。
追问
追问 1:什么时候用交叉验证而不是固定验证集?
数据量小、单次划分方差大时用 K 折交叉验证:轮流用每一折做验证、其余训练,平均得到更稳健的估计,也充分利用数据。数据极大时固定划分即可,省算力。
追问 2:数据预处理(如标准化)应在哪一步做?
必须只在训练集上拟合(算均值方差、选特征),再用同样参数变换验证/测试集;交叉验证里要把预处理放进 Pipeline 随每折重新拟合。否则统计量含了验证/测试信息,造成数据泄露。
追问 3:时间序列数据如何划分?
不能随机打乱,必须按时间切:用过去训练、未来验证/测试,可用滚动/扩窗的时序交叉验证(TimeSeriesSplit)。这样才能避免「用未来信息预测过去」的泄露,贴近真实上线场景。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。