模型训练中训练集、测试集、验证集的含义

模型与算力

讲清训练集、验证集、测试集三者的定义、分工和常见混淆点,给入门者一套能直接照着分的判断标准与排查顺序。

刚上手训模型的人,最容易卡在两件事上:一是不知道手上这堆数据该怎么拆成三份,二是训完发现训练集上表现很好、换一批数据就崩,却说不清是哪一步出了问题。这篇把三类数据集各自的活、边界和常见误用讲一遍,再给一套分数据、看差距、定位问题的动作清单,让你下次拆数据集时心里有数。

刚上手训模型的人,最容易卡在两件事上:一是不知道手上这堆数据该怎么拆成三份,二是训完发现训练集上表现很好、换一批数据就崩,却说不清是哪一步出了问题。前者是流程问题,后者是诊断问题,两个都不难,只是没人把边界讲清楚。

这篇不聊模型结构,只聊数据怎么分、每份数据能干什么、出了差距按什么顺序查。看完你应该能直接动手:先把规则定下来,再切数据,再拿一份对照表去定位问题。至于各家模型的价格、能力差异这些,属于另一个维度的事,去站内资料库页面核对当时的数字就行,不要和数据集切分混在一起想。

三类数据集各自干什么活

训练集是模型真正用来调参数的那部分数据,模型只会从它里面学规律。验证集不参与调参,只在训练过程中反复用来判断「现在这一版好不好、要不要早停、超参往哪调」。测试集全程封存,只在最后评估一次,用来给出一个对外能说的成绩。三者的区别不在大小,而在角色。

训练集
模型直接学习的那批样本,参数更新只看它
验证集
训练过程中用来做选择的那批样本,早停、选超参、比版本都看它
测试集
封存到最后只评估一次,用来给出一个不被自己污染的成绩

关键判断标准是「有没有参与决策」。只要你的某个选择——学习率、训练轮数、模型结构、早停点——是看着某份数据的表现做出来的,那份数据就已经变成验证集了,不再是独立的测试集。很多人嘴上说有测试集,实际上已经拿它调了十几次参,这时候它给出的数字只是自我安慰。

三者也不是按比例硬性排的。数据量很少的场景,可以先把训练和验证分开,测试集等到有明确交付节点时再固定下来;数据量大到切得出独立同分布的几份时,三份齐全更稳妥。什么情况下不适用这套:如果你做的是纯探索性实验,本来就不打算对外报成绩,那测试集可以暂时不切。

数据集模型能看到吗能不能用来做选择典型用途
训练集能,反复看能,参数就是靠它学拟合规律
验证集能,但不学参数能,早停和调参看它选择版本
测试集封存不看不能,看一次就废最终评估

动手分数据:先定规则再切

很多人切数据是随手 random 一下,切完就训,出了差距再回头找原因,结果发现是切分本身就有问题。正确的顺序是先定规则,再切,切完立刻把切分方式和结果记录下来,让后面每一次实验都能对得上。

  1. 先做去重和近重复检查同一条内容的不同改写、同一用户的多条记录,这类样本被随机打散后很容易一份进训练一份进测试。先按文本相似度或用户 ID 做分组去重,把同一来源的样本绑在一起,再整体分到某一侧。
  2. 按数据类型选切法分类任务按类别分层抽样,别整体随机切;时间序列、日志、传感器这类有先后关系的数据按时间切,用早的训、晚的测。随机切时序数据会把未来信息泄漏进训练,测试成绩会明显虚高。
  3. 切完记录切分信息三份的文件名、样本数、生成脚本和随机种子都记下来,同一批实验必须用同一套切分,否则前后对比的数字没有意义。
  4. 守住测试集别反复拿测试集调参。如果你因为测试集表现不好改了一版又测一次,测试集实际上已经被当验证集用了,这时要重新划一份新的测试集,否则成绩是自欺欺人。
  • 切分前先看数据来源是否单一,来源不同就别指望随机切能切出同分布
  • 类别极不平衡时,先分层再切,别让某一类在测试集里一个都没有
  • 样本总量很少时,可以用交叉验证代替固定验证集,但测试集仍要单独留一份
  • 每次改动切分规则都要重跑基线,否则新旧结果不可比

训练集好、测试集差,按这个顺序排查

这个现象有一个笼统的名字叫泛化差,但它背后至少对应两种完全不同的原因,混在一起查会越查越乱。第一步要做的不是加正则,而是分清到底是哪种。

表现大概率原因先查什么
训练集好,验证集也差过拟合或数据量不足训练轮数、模型容量、训练样本量
训练集和验证集都好,只有测试集差切分泄漏或数据分布不一致跨集重复样本、两边采集时间与标注口径
验证集忽高忽低,测试集稳定偏低验证集太小或切分不均衡验证集样本量、类别分布
训练集本身就差欠拟合或数据质量有问题标签质量、特征是否有效

排查顺序建议是:先查有没有重复样本跨集出现,再查三份数据的来源、采集时间、标注口径是否一致,然后看训练轮数是不是太多,最后才考虑加数据、加正则、减模型容量。这个顺序是从成本低、影响大的原因往成本高、影响小的原因排,能省不少时间。

  • 查泄漏:把训练集和测试集做一次近重复匹配,命中率高说明切分有问题
  • 查口径:三份数据的标注规则、采集渠道、时间范围是否一致,不一致就先对齐再谈模型
  • 查轮数:训练集和验证集一起变差、训练集却持续变好,通常就是训过头了
  • 查容量:样本量很小但模型很大,优先换小模型或加正则,而不是继续调学习率

如果验证集分数忽高忽低但测试集稳定偏低,通常是验证集太小或者切分不均衡,优先扩验证集样本量,而不是直接换模型。这个判断只适用于常规监督学习;做迁移学习、微调或者用别人预训练好的权重时,训练集表现不等于模型能力,得看验证集和真实业务样本上的表现。

测试集的价值不在数字本身,而在于它没被你反复调过。
下一步分完数据之后,如果你还要挑调用哪家模型的接口来做推理或微调,可以到站内资料库对比各家当前的能力与价格,去这里核对当时的数字。

常见问题

训练集和测试集的「测试数据」到底差在哪?

差在有没有参与决策。模型参数只由训练集调整;验证集用来在训练中做选择,比如什么时候停、哪个超参更好;测试集只在最后评估一次,之前不能看。只要你是看着某份数据的表现做决定的,那份数据就已经是验证集,不再是测试集。

模型在训练集效果好、测试集效果差,这叫什么?

通常叫过拟合,也就是模型把训练样本的细节甚至噪声记住了,换一批没见过就撑不住。但别急着下结论,先排除切分泄漏和两边数据分布不一致,这两种情况的现象很像。确认是过拟合后,常见动作是加数据、加正则、减轮数或降模型容量,具体走哪些要看验证集曲线。

数据量很少,还需要单独留测试集吗?

数据量小的时候不必强留三份,容易把每份都切得太薄。可以先只分训练和验证,靠交叉验证拿到更稳的估值,测试集等到有明确交付节点时再固定一份。要留意的是,一旦某份数据被你反复用来挑方案,它就不该再叫测试集。

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