刚上手跑模型的人常卡在同一处:手头只有一份数据,却被告知要切成三份,切完又不知道该拿哪份调参、哪份看效果,一不小心就把测试集用成了调参工具。这篇把三类数据集的分工、切分顺序和自查动作讲一遍,帮你分清哪份数据能看、哪份只能最后开一次。
刚上手跑模型的人常卡在同一处:手头只有一份数据,却被告知要切成三份,切完又不知道该拿哪份调参、哪份看效果,一不小心就把测试集用成了调参工具。这篇把三类数据集的分工、切分顺序和自查动作讲一遍,帮你分清哪份数据能看、哪份只能最后开一次。
先把结论摆前面:这三份数据不是随便分家,而是角色不同。训练集是让模型学本事的地方,验证集是你在旁边看的记分牌,测试集是最后交卷才拆封的考卷。角色一旦串了,你看到的分数就不是模型的真实水平,而是它提前看过答案后的表演。
三份数据各自在干什么
训练集负责让模型学参数,是唯一会被反复喂进去、直接改变权重的数据。模型每看一批数据就调整一次自己的内部数字,看的次数越多,对这批数据就越熟。所以训练集上的表现好,只能说明它记住了,不能说明它学会了。
验证集不参与权重更新,只在每轮训练之后量一次效果,用来挑超参、挑停止时机。你调学习率、调层数、决定第几轮停,靠的都是它。测试集平时不许碰,只在方案定死之后跑一次,作为对外的最终交代。三者分工可以用一个对照表记住。
| 数据集 | 是否参与训练 | 主要用途 | 什么时候用 |
|---|---|---|---|
| 训练集 | 是,反复更新权重 | 让模型学参数 | 每一轮训练都喂进去 |
| 验证集 | 否,只看不改 | 挑超参、定停止时机 | 每轮或每隔几轮量一次 |
| 测试集 | 否,只看不改 | 最终效果交代 | 方案定稿后只跑一次 |
合在一起会出什么问题
同一份数据既学又测,模型等于提前看过答案,分数会虚高,上线就掉。这不是模型聪明,是你把考题提前泄给它了。更隐蔽的问题是,你只看训练集损失,曲线一路降,看起来顺利,但泛化可能已经变差,而你手上没有任何信号判断该在哪一轮停。
可以换个比喻:训练集是训练场,验证集是教练手里的记分牌,测试集是正式比赛。你在训练场练、看记分牌调整动作,这些都合理;但如果你把正式比赛的题目拿回训练场反复练,那这场比赛的成绩就没有参考价值了。三份数据的角色混用,判断就会失真。
- 数据泄漏:模型在训练阶段见过测试样本,评估结果不可信
- 无法选停止点:没有验证集,你不知道哪一轮开始过拟合
- 调参无依据:只能凭感觉改超参,改完不知道是变好还是变坏
- 对外结论不硬:最终报出的数字无法代表模型在新数据上的表现
切分顺序与常见做法
先切出测试集并封存,再从剩下的切验证集,最后才是训练集。顺序反了很容易泄漏,比如先切训练集再从剩下的分验证和测试,稍微不小心就会有样本重叠。常见比例是训练占大头、验证和测试各占一小块,具体数值按你的数据量取,不要照抄别人的比例。
- 第一步:封存测试集从全量数据里先划出一份测试集,单独存放到另一个目录或另一个文件,代码里不引用它,直到方案定稿。
- 第二步:从剩余数据切验证集在剩下的数据里再划一份验证集,用于每轮评估和超参调整。注意这一步不要动测试集。
- 第三步:剩下的就是训练集最后留下的部分喂给模型训练。检查三份之间没有重复样本,没有同一用户或同一文档跨份出现。
- 第四步:按时间或类别处理如果有时间维度,按时间前后切而不是随机打散,否则等于用未来预测过去;类别极不平衡时用分层抽样,保证每份里各类目比例接近。
关于比例,没有放之四海皆准的数字。数据量大的时候,验证和测试各留一小块就够;数据量小的时候,可以配合交叉验证反复利用有限样本。具体怎么取,可以到 参考同类工具和资料的说明,再结合自己的数据量决定,不要盲目照搬。
切完自查这四件事
切分不是切完就完事,还要做一次自查,否则前功尽弃。下面四件事按顺序过一遍,能挡掉大部分低级错误。
- 三份数据之间没有重复样本、没有同一用户或同一文档跨份出现,尤其要检查去重和分组
- 标签定义、清洗规则在三份上完全一致,不要只洗训练集,验证集脏了照样误导你
- 验证集只用来看,别再拿它训练;测试集只开一次,开完就定稿,不要反复跑
- 记录每次实验用了哪份数据、改了什么,避免反复试到过拟合验证集
最后一点常被忽略:如果你反复用验证集试不同方案,试的次数多了,验证集也会被间接拟合,你选的方案可能只是在这份验证集上运气好。什么情况下不适用这套做法?如果数据集本身极小、样本之间高度相关,严格的三分法可能让每份都不够用,这时更应该考虑交叉验证或按组切分,而不是硬切。
想对照不同工具和平台在数据处理上的常见做法,可以到 看工具目录里的相关条目,再结合自己项目的情况做判断。
下一步把切分流程写成一段可复用的脚本,下次直接调用,避免每次手工切分留下隐患。想看看别人怎么组织数据准备流程,可以到 的指南中心翻一翻。→常见问题
只有几百条数据,也必须切三份吗?
数据太少时切三份会让每份都不够用,可以先只切训练和验证,把测试集留到方案定了再补;或者用交叉验证让每一份都轮流当验证集。原则是保持测试数据的独立性,形式可以灵活,但别用同一批数据既调参又报结果。
验证集准确率一直涨,测试集却很差,说明什么?
说明你在验证集上试了太多遍,方案已经贴合验证集了。先把验证集的使用次数减下来,只保留关键决策;再把测试集重新分层抽一份新的,用它做一次最终判断。反复用测试集调参,测试集就变成了第二个验证集。
验证集和测试集能不能用同一批数据?
短期图省事可以,但代价是你会失去一个客观分数。验证集被反复看之后就不再中立,你没法判断最终效果到底是真涨了还是碰巧。哪怕只留几十条从不参与调参的样本,也比完全没有强。