训练集、测试集、验证集的区别

模型与算力

一句话讲清训练集、验证集、测试集三者的分工:谁用来学、谁用来调、谁用来做最终验收,以及划分时最容易犯的错。

很多人第一次自己跑模型,把数据一股脑丢进去训,结果训练时看着挺好,换一批数据就拉胯,还找不到原因。问题往往不在模型,而在数据没分好家:哪份用来学参数、哪份用来调超参、哪份留到最后验收,各有各的职责,混用就等于提前把考卷答案抄了一遍。这篇按「先做什么、再做什么」的顺序把三个集合的分工讲清楚,给一套能照着执行的划分与检查步骤。

很多人第一次自己跑模型,把数据一股脑丢进去训,训练时看着挺好,换一批数据就拉胯,还找不到原因。问题往往不在模型,而在数据没分好家:哪份用来学参数、哪份用来调超参、哪份留到最后验收,各有各的职责,混用就等于提前把考卷答案抄了一遍。

下面按「先做什么、再做什么」的顺序,把三个集合的分工、划分顺序、泄漏排查和什么时候该重划讲清楚,中间给一套能照着执行的步骤和检查清单。看的时候不用记概念,重点记住每一步「这一步在替谁做决定」。

三个集合各管一件事,别让它们串岗

训练集负责让模型把参数学出来。模型在训练集上表现好,只能说明它「记住了这批样本」,不能说明它「换一批还会用」。所以训练集上的分数低不代表模型差,训练集上的分数高也不代表能上线,这两头都别过度解读。

验证集负责在训练过程中做选择:调超参、挑训练轮数、比对几套方案谁更好。它相当于你反复刷的那张模拟卷,允许你看很多次。测试集只在最后用一次,用来给出对外能说的成绩。一旦你根据测试集的结果回头改模型,它就已经变成验证集了,之后报出来的分要打折扣看。

训练集
模型直接学习参数的样本,看它只能判断有没有记住
验证集
训练期间反复参考、用来做选择的样本,允许多次查看
测试集
只在收尾阶段用一次、给出最终成绩的样本,看过并据此改模型就作废
判断口径
同一份数据被你看过几轮并据此改过模型,它就不能再当测试集

有个容易忽略的边界:如果数据量很小,硬留一份测试集会让训练数据更少、模型更弱,这时可以先用交叉验证把每折轮流当验证集,测试集留到真的有对外汇报需求时再单独切。不是所有项目一开始就要三份齐全,但一旦要拿数字做决策,测试集就不能省。

划分的动手顺序与比例思路

  1. 先切测试集,再切验证集把测试集整块切出来单独封存,剩下的数据再切验证集。反过来先切验证集,很容易因为反复调整比例把两边搅乱,最后说不清哪份是哪份。
  2. 打乱顺序但不拆分组同一条样本、同一个用户、同一段录音的多个片段,要整组进同一个集合。分组拆开就会出现「训练见过一半、测试考另一半」的假高分,验证时怎么调都调不上去。
  3. 按标签分布分层抽样分类任务要保证各集合里各类别占比接近,类别极不均衡时按类别分层抽。切完先打印各集合的标签分布对比一下,偏差明显就重切。
  4. 样本极少时改用交叉验证数据量小到留不出测试集时,用多折轮换,让每折都当过一次验证集,最后汇总评估。代价是训练次数变多、时间变长,算力紧张时可以把折数降下来。
  5. 比例别凭感觉定比例取决于数据量和任务,没有标准答案。切之前先到站内 /models/deploy 的测算口径和 /training 里的流程说明对照一遍,再动手定数。

顺序这件事上,切分脚本要比切分结果更值得存档。写下随机种子、切分顺序、去重规则,过几个月才能复现出同一份测试集,否则前后两次成绩根本没法比。

最常见的数据泄漏排查清单

数据泄漏不会报错,只会让你的分数好得不真实,上线后打回原形。下面几条按出现频率从高到低排,切完数据先对着过一遍。

排查项错误做法正确做法
预处理顺序先在全量数据上算均值、方差、缺失值填充规则,再切分在训练集上算统计量,再把同一套规则套到验证集和测试集
重复样本同一文档或图片的副本散落在不同集合切分前后各跑一次近似去重,把重复项归到同一集合
时间序列随机切分,用未来数据预测过去按时间先后切,并检查特征里有没有混入未来才知道的字段
预训练语料忽略基座模型训练语料里可能已包含测试样本评估时意识到这个前提,成绩不能全算作模型泛化能力

不适用的情况也要说清:探索阶段、只是验证流程能不能跑通时,可以先小规模粗分甚至暂时不分,重点是把链路跑通。但一旦要拿数字做决策、对外汇报或写进材料,就必须回到规范划分,否则数字没有参考价值。

什么时候该重划数据集,什么情况不用折腾

  • 需要重划:任务定义变了、数据来源换了、原来的测试集已经被人反复看过并据此调过模型
  • 不用重划:只是换了模型或换了训练框架,评估口径和测试集保持不动,结果才有可比性
  • 建议把划分结果和切分脚本一起存档,记录随机种子,不然过几个月自己都复现不出同一份测试集
  • 场景是持续上线、数据源源不断进来时,固定测试集最终会过时,可以留一份滚动测试集,但每次换之前要把旧成绩一起留档

还有一个前提值得留意:换测试集等于换了考卷,新旧成绩不能直接比。要比较两版模型,得在同一份测试集上跑;要比较两代测试集,就得把两套成绩都留着,说明各自的划分口径和样本来源。

最后回顾一句:训练集学、验证集调、测试集验收,三份数据各自只干一件事。划分顺序上先切测试集再切验证集,切完先查泄漏再看分数,任务或数据来源变了才需要重划。想核对自己手上任务的数据规模、标注口径和评估流程,可以顺着下面的入口看一遍站内的资料,再决定怎么切。

下一步先到 /training 看训练与评估的完整流程说明,再用 /models/deploy 里的测算口径核对你的数据规模和划分比例是否合适。

常见问题

测试集能不能用来调参?

不建议。测试集的意义就是「没见过」,你每根据它的结果改一次模型,它就往验证集退化一点,最后报出来的成绩含有你人工调优的成分。要调参就用验证集;如果数据实在不够,宁可做多折交叉验证,也不要反复拿测试集当反馈信号。

验证集和测试集到底差在哪,不都是没参与训练的数据吗?

差别在「你有没有拿它做过决策」。验证集是你训练过程中反复看、反复改的那份,允许过拟合它;测试集是封存到最后的验收卷,只用一次。同一份数据今天当测试集,只要你根据它的分数回头改了模型,明天它就只能算验证集。

数据集划分比例有没有推荐值?

常见做法是训练占大头、验证和测试各留一小部分,但具体数值跟数据量强相关:数据越多,验证和测试的绝对数量够用就行,比例可以更小。与其记一个固定比例,不如先确认验证集条数够不够支撑你比较方案,具体口径可到站内 /training 与 /models/deploy 对照。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。