训练集、验证集和测试集的数据分析

模型与算力

讲清训练集、验证集、测试集三份数据各自回答什么问题,以及该看哪些指标、怎么排查异常差距。

模型跑完一轮,日志里三份数据的指标摆在那儿,到底该信哪一个、哪个数掉了算问题,很多人是凭感觉。这篇按「每份数据在回答什么问题」把指标拆开,给你一套从看数到下结论的顺序,以及差距过大时先查什么的排查清单。

模型跑完一轮,日志里三份数据的指标摆在那儿,到底该信哪一个、哪个数掉了算问题,很多人是凭感觉。这篇文章按「每份数据在回答什么问题」把指标拆开,给你一套从看数到下结论的顺序,以及差距过大时先查什么的排查清单。

先说一句前提:三份数据的价值不在绝对数值高低,而在它们之间的差距和趋势。同一份模型,三份数据的关系比任意一个单独的分数都更值得盯。下面按四节展开,每节都对应一个能直接动手做的事。

先搞清楚三份数据各自在回答什么问题

训练集回答的是「模型能不能学会」,这里掉得慢,就往欠拟合方向想:模型容量不够、特征太弱、训练轮次不足。但训练集指标掉得太快也不一定是好事,可能只是模型把训练样本记下来了,并不代表真的学到了规律。

验证集回答的是「这一轮超参选得对不对」。早停、调学习率、选轮次,都是基于它做的决策。只要你用它做过一次选择,这个数字就已经带上了乐观偏差,不能当作最终结论。

训练集
衡量拟合能力,看模型能不能把已经见过的样本学进去
验证集
衡量泛化能力,用来选超参、做早停,看多了会被自己用脏
测试集
衡量交付效果,只能看一次或极少次,反复看就等于把它变成第二份验证集
  • 训练集指标掉得慢,先查欠拟合:模型容量、特征数量、训练轮次
  • 训练集指标好得离谱,先查记忆和泄漏,别急着高兴
  • 验证集长期不动甚至回升,先停下,别接着烧算力
  • 测试集只在模型和超参都冻住之后再看,看完就写进结论

看指标的顺序:先看趋势,再看绝对值,最后看三者关系

很多人习惯先看绝对值,其实顺序反过来更省事。趋势回答「还要不要继续」,绝对值回答「够不够交付」,三者关系回答「问题出在哪一层」。按这个顺序看,能少走很多弯路。

观察对象先看什么常见误判
训练集曲线是否还在下降训练集分数高就等于模型好
验证集是否长期停滞或回升验证集最好那轮就是能交付的轮
测试集与验证集的差距测试集略高于验证集就以为没问题
三者关系训练与验证的裂口只盯一个指标,忽略裂口方向

绝对值怎么看要分任务。分类任务别只盯准确率,类别不平衡时召回和精确率更有信息量;生成类任务如果只用一个相似度分数,很容易掩盖长文本或边界样本的退化。具体该盯哪几个指标,可以到站内模型资料库页面核对对应任务的口径。

  1. 给每个指标设下限不是设一个「最好成绩」,而是设一个不能越过的线,越线就自动停,避免人肉盯日志
  2. 记录每一轮的三个数把训练、验证、测试三份指标连同轮次一起落表,光看终端滚动日志容易漏掉拐点
  3. 判断裂口方向训练好验证差,往过拟合和正则方向想;训练本身就差,往欠拟合和数据标注想;验证好测试差,往划分方式想
  4. 确认后才动参先写清这次要验证的假设,再改一个变量,改完只对照对应的那个数

三者差距过大时的排查顺序

差距大不一定是模型的问题,很多时候是数据划分本身出了岔子。排查顺序建议从数据往模型走,反过来会白改一堆参数,还找不到原因。

  1. 先查数据泄漏同一实体、同一用户、同一会话的样本是否被切到了两份集合里;时间序列任务不要随机打乱,要按时间切
  2. 再查划分比例与样本量小数据集上单个样本就能让指标跳一大截,先确认每份集合的样本条数是不是够,比例是不是合理
  3. 然后查分布把三份集合的标签分布、文本长度、来源字段拉出来横向对比,看是不是某一类样本被切到了一边
  4. 最后才怀疑模型模型规模、正则、学习率这些放在数据问题排除之后再看

分布核对这一步最容易偷懒,但收益最大。做法不复杂:每份集合按标签和来源各出一张计数表,横向并排看差异。更系统的检查思路和检查项,可以照着站内质量检测页面的做法走一遍,那里把常见的分布与泄漏检查列得比较全。

数据会变旧:什么时候该重划、什么时候只用重测

测试集不是一次性消耗品,也不是永久有效。判断要不要重划,看的是数据和口径有没有动,而不是看时间过了多久。

发生了什么变化测试集怎么办原因
只调了超参,数据和标注未动可沿用原结论测试集代表的分布没变
换了数据来源或清洗规则必须重新划分布变了,旧结论不可比
改了标注口径必须重新划标签定义变了,指标含义也变了
线上表现与测试集对不上先做时间外验证先分清是分布漂移还是模型退化
  • 固定留出一份长期不动的留出集,专门用来判绝对值
  • 另外留一份滚动更新的影子集,专门看趋势,两边不要混用
  • 每次重划都写清划分规则、随机种子和时间切点,否则两次结果没法比
  • 线上与测试集对不上时,先补一次新采样验证,再决定是重训还是重划

还有一点常被忽略:测试集的样本量决定了结论的稳定度。样本少的时候,一次新采样就能让指标晃一大截,这时候与其纠结零点几的变化,不如先扩样本。各任务常见的数据规模区间和指标口径,可以到站内模型资料库页面核对当时的说明。

下一步把上面这套顺序套到你手头那次实验结果上:先确认三份数据同源,再给指标设下限,然后按数据泄漏、划分比例、分布、模型的顺序排查一遍。需要对照参考时,去质量检测页面看检查项,去模型资料库页面看指标口径。

常见问题

验证集和测试集到底能不能合并成一份?

样本量大、调参空间小时可以省掉验证集,用交叉验证代替;但只要你还在反复试超参、比不同版本,就必须留一份从没参与过决策的测试集,否则你拿到的数字只是调参记录,不是效果预估。

训练集和验证集差距多少算正常?

没法给通用数字,它跟任务难度、数据量和正则强度都有关。判断方法是看趋势:把训练轮次拉长,两条曲线是收敛靠近还是一直张口。一直张口且测试集也差,才需要处理;如果测试集跟验证集接近,说明差距属于可接受范围。

测试集效果好,上线却不行,第一步查什么?

先查线上输入和测试集是不是同一分布,比如来源渠道、时间范围、语言或格式差异;再查评测口径是否一致,同一条预测在两边的打分规则是否相同。这两项排除后,再去看模型版本、量化或推理参数有没有和评测时不一样。

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