很多人在做微调或跑自己的模型时,数据一股脑全拿去训练,结果上线就翻车;也有人切了三个集,但不知道验证集到底该拿来干什么。这篇不讲公式,只讲三个集子各自负责哪一环、怎么切、什么时候可以少切一个,最后给一份自查顺序。
做微调或者自己跑模型的时候,最容易踩的坑有两种:一种是把数据一股脑全丢进训练,离线指标看着挺好,一上线就露馅;另一种是老老实实切了三个集,却说不清验证集到底该拿来干嘛,最后三个集混着用,谁都不干净。这篇不讲公式,只讲三件事:三个集各自负责哪一环、怎么切、切完先查什么。
先记住一条主线:训练集管「学」,验证集管「选」,测试集管「报」。三者不是按比例随便分的三份数据,而是三种不同用途、不同使用纪律的数据。纪律一旦破掉,分数就没有参考意义。
三个集子各自管什么,一句话分清楚
| 数据集 | 核心作用 | 使用纪律 |
|---|---|---|
| 训练集 | 唯一用来调整模型参数的数据来源 | 可以反复用,模型见过它,所以它上面的表现永远偏乐观 |
| 验证集 | 训练过程中做选择:挑轮数、挑超参、决定何时停 | 可以反复看,但每次看完要清楚自己是在做决策 |
| 测试集 | 只在最后用一次,估计上线后的真实水平 | 一旦拿它调过东西,它就已经不是测试集了 |
- 训练集:模型真正拿来调参数的唯一来源,它见过这些数据,所以表现偏乐观是正常的
- 验证集:训练过程中用来做选择的数据,比如挑轮数、挑超参、决定什么时候停
- 测试集:只在最后用一次,用来估计「上线后会怎样」,反复用它调东西就失效
- 判断标准:如果你调过一个参数之后又去看某个集的表现,那它就从测试集降级成验证集了
怎么切、切多少,按你的数据量来定
比例不是硬指标,真正决定切法的是数据量和数据结构。数据量小的场景,验证集和测试集可以合并成一套,靠交叉验证补足,但要在报告里写清口径;数据量大的场景,三个集分开,关键是测试集要足够大,小样本上的差异说明不了问题。分类任务还要注意每个类别在三个集里都出现,否则某类在测试集缺失,指标直接失真。具体比例数值不用背,到 基础概念词典(/ai-dict/category/basics) 对照术语定义即可。
- 先看数据量样本很少时,别硬切三份,考虑验证集与测试集合并加交叉验证;样本充足时,三份分开,重点保证测试集够大。
- 再看数据结构时间序列、用户行为类数据不能随机打乱,要按时间或按用户切,同一用户不能同时出现在训练和测试里。
- 最后看类别分布分类任务逐类检查,确认每个类别在三个集里都有样本,缺哪类就调整切分策略。
切完先做一遍自查,再开跑
切分动作做完不等于切对了。开跑之前花十几分钟走一遍下面的检查,能省掉后面大量的返工和误判。这套自查不挑任务类型,文本、图像、结构化数据都能用。
- 查重叠:训练集和测试集有没有完全相同的样本或近似重复,泄露会让测试成绩虚高
- 查分布:三个集的标签分布、文本长度分布是否大致一致,偏得太厉害说明切分方式有问题
- 查流程:确认评估脚本没有被训练过程看到过,也确认没有用测试集反复调参
- 跑基线:先用一个简单基线在验证集上跑通,确认流程没写错再上大模型
自查里最容易被忽略的是「重叠」和「流程」这两项。前者是数据层面的泄露,后者是代码层面的泄露,两种都会让测试分数好看得不像真的。真到了要对外报数的时候,别忘了把评测口径一起写清楚,可以参考 测评榜单库(/benchmarks/registry) 里对评测方式的标注方式。价格、跑分这类会随时间变的数字,一律到 价格追踪(/price-watch) 核对当时的数字,别抄旧文。
出现这几个信号,说明三个集被用错了
| 现象 | 优先怀疑 | 先做什么 |
|---|---|---|
| 训练、验证都好,测试突然掉一大截 | 数据泄露或分布不一致 | 先查重叠和分布,别急着加数据 |
| 测试分数被反复拿来调参 | 测试集已降级为验证集 | 停止用测试集做决策,重新留一份 |
| 验证集从不参与决策 | 验证集形同虚设 | 明确它要用来选什么,否则等于白切 |
| 只有一份数据却要报独立成绩 | 口径不成立 | 如实说明用的是交叉验证,不要包装成独立测试集 |
什么情况下上面的判断不适用?如果任务本身就是在线学习、数据持续流入,训练和验证的边界会随时间移动,这时候要按时间窗口滚动切分,而不是一次切死。另外,如果数据本身极其稀缺,任何切分都会让每份数据少得可怜,这时优先考虑交叉验证和外部数据,而不是硬凑三个集。
三个集的价值不在「切开了」,而在「各管各的、互不越界」。下一步把你的数据切分脚本和评估脚本拿出来,对着上面的自查清单逐条过一遍,再决定要不要重切。想看不同评测口径和工具怎么标注的,去工具目录和测评榜单库对一遍。→
常见问题
验证集和测试集能不能用同一份数据?
在数据量很小、又必须给出可信结论时,可以用交叉验证把两者合并,但要在结论里写清这一点。只要数据量够,还是分开更稳:一旦你用同一份数据反复挑参数,它就不再是没见过的数据,报出来的成绩会偏乐观。
训练集表现差、验证集也不错,是什么情况?
这种情况少见,先排查两件事:一是验证集是不是混进了训练数据,二是评估脚本的口径是不是和训练时不一致。如果两边都确认干净,那通常是模型还没到过拟合阶段,继续训练或换更大的模型都可能还有空间。具体的过拟合判断可以对照站内的模型训练相关页面。
三个集的比例有没有标准答案?
没有。比例取决于数据总量和任务难度,量小的时候多留验证、量大的时候重点保测试集。真正要盯的是三个集的分布是否一致、有没有重叠,而不是某个固定数字。想横向对比别人的做法,到 测评榜单库(/benchmarks/registry) 看各家评测是怎么声明数据切分口径的。