调完模型发现验证集分数忽高忽低,或者测试集一跑就崩,多半是划分比例和数据量不匹配。这篇不背固定数字,而是给你一套按数据规模、任务类型、标注成本来定比例的判断标准,附划分顺序、常见错法和自查清单。想知道某个具体任务别人怎么分,可以对照站内已有文章看分工。
调完模型发现验证集分数忽高忽低,测试集一跑就崩,十有八九不是模型的问题,而是划分比例和数据量没对上。这篇不给你背固定数字,而是给一套按数据规模、任务类型、标注成本来定比例的判断标准。核心思路是:先看绝对条数,再看任务形态,最后才谈百分比。
还有一点得先说清楚,比例只是结果,划分顺序和分组规则才是因。顺序错了,比例再漂亮也白搭;想对照别人某个具体任务怎么分,可以顺着站内已有文章的分工往下找,别指望一篇覆盖所有场景。
比例不是拍脑袋,先看三个约束
定比例之前,先把这三个约束过一遍。它们任何一个不满足,你算出来的百分比都是虚的。尤其是小数据场景,百分比在绝对条数面前几乎没有意义。
- 数据总量
- 样本越少,验证集越不能按百分比砍,要把绝对条数放在第一位考虑,比如验证集至少要有几十条可用样本才有统计意义
- 任务类型
- 分类、检测、生成、时序预测对留出集的要求不同,时序类不能随机打乱,必须按时间切
- 评估目的
- 只是想看训练有没有崩,和想对外报一个可信指标,留出的量级完全不一样,后者需要更大的测试集
划分顺序比比例本身更容易出错
- 先去重按内容指纹或近似匹配把重复样本清掉,重复样本留在任何一个集合里都会让指标虚高。验证方式:跑一遍去重前后各集合的样本数,看是否还有明显同源条目。
- 再按主体分组同一用户、同一文档、同一视频、同一会话的样本必须整体进同一个集合,绝不能切开跨集合。验证方式:按主体 ID 聚合后检查三个集合的主体集合是否两两不相交。
- 最后才切分先留出测试集,再从剩下的里分训练和验证,别反过来从训练集里抠测试集。验证方式:记录切分脚本的输入输出,确保顺序可复用。
- 固定随机种子并记录种子写进配置和文档,否则每次重跑划分都在变,指标无法横向比较。验证方式:同一份数据跑两次,比较三个集合的样本列表是否一致。
顺序错了最典型的后果是数据泄漏,同一来源的样本被分到训练和测试两边,测试指标好看得离谱,上线就露馅。这类问题靠调比例救不回来。
比例是切完之后的统计结果,不是切之前的操作指令。
按数据量级给一档参考区间
下面这档区间是判断起点,不是硬性规定。落到你手上的任务,还得回到上一节的绝对条数去核对,尤其是小数据那一档。
| 数据量级 | 主要手段 | 判断重点 |
|---|---|---|
| 上万条以上 | 训练/验证/测试各留一个较小比例 | 保证每类样本在三个集合里都有覆盖 |
| 几百到几千条 | 以交叉验证为主 | 固定留出集只留够评估的最小量 |
| 百条以内 | 交叉验证或留一法 | 不要谈比例,结论要标注为不稳定 |
- 样本上万条以上:验证与测试各留一个较小的比例即可,重点不是比例大小,而是每类样本在三个集合里的覆盖是否均衡。
- 样本几百到几千条:主战场是交叉验证,固定留出集只留够评估的最小量,比例反而是次要问题。
- 样本百条以内:优先做交叉验证或留一法,任何单次划分的结论都标为不稳定,别拿它下判断。
- 标注成本高的任务:测试集一旦定下就冻结,不要因为想多要训练数据反复重切。
别只看总比例,要看每类够不够
总比例再合理,少数类没被覆盖,指标波动照样全是采样噪声。这一节讲的是切完之后怎么验每类的分布。
- 做分层抽样,让少数类在验证与测试里至少出现若干条,否则指标波动全是采样噪声。
- 类别极不均衡时,宁可牺牲总比例,也要保证稀有类被覆盖,哪怕单独补采。
- 生成类任务的验证集要单独构造,不能从训练语料里随机抽样,否则分数虚高。
- 时序预测类按时间顺序切,验证集和测试集都必须晚于训练集,不能随机打乱。
- 检测与分割类要保证同一张图或同一段视频只进一个集合,并检查标注一致性。
想知道别人某个具体任务在什么口径下算指标,可以到站内测评相关页面看它们的留出集定义,对照自己的划分是否可比。
上手自查清单与常见坑
划分完之后,按下面这张表逐项过一遍。每一项都能找到明确的不通过信号,别靠感觉判断。
| 检查项 | 怎么做 | 不通过信号 |
|---|---|---|
| 查泄漏 | 检查同一来源样本是否跨集合 | 验证集指标明显高于训练集后期水平 |
| 查预处理 | 均值、归一化参数只由训练集统计 | 验证集指标忽高忽低,重跑变化大 |
| 查复现 | 种子和分组规则写进文档 | 别人拿同一份数据分不出同一批样本 |
| 查口径 | 报告时写清是验证集还是测试集 | 同一数字在不同地方被当成两种集合的结论 |
- 写一份划分说明把数据总量、去重规则、分组键、随机种子、各集合条数记下来,作为后续复现的依据。
- 跑一次基线评估用固定划分跑一遍基线,记录验证集与测试集的指标差异,差异过大就回头查泄漏。
- 交叉验证补底小数据场景用交叉验证补充结论,和单次划分结果对比,看波动范围有多大。
- 上线前重切一次如果有新数据进来,按同样的分组规则追加,别重新随机切,避免指标断裂。
常见问题
是不是按固定比例分就万无一失?
不是。比例只是结果,真正决定成败的是去重、分组和分层抽样。同样一个比例,随机切分和按主体分组切分,评估出来的分数可能差很远。先保证不泄漏,再谈比例。
小数据集到底能不能留测试集?
数据量很小的时候,留出的测试集本身统计意义就不大。更稳的做法是交叉验证估一个区间,再单独留极少量做最终确认,并在报告里说明结论的置信度有限。
划分比例要跟着模型换代调整吗?
通常不用动划分,但要在同一套划分上重跑对比,否则差异分不清是模型变了还是数据变了。如果换了任务或改了标签口径,那就要重新划分并重新留测试集。