模型跑出来在训练数据上很漂亮、换个数据就崩,八成是划分这一步没做干净。这篇不聊概念定义,直接给划分顺序、比例取舍的判断依据、以及数据泄漏的排查清单。适用于自己准备数据集做微调或训练的场景;如果你只是调 API 或做 RAG,划分逻辑不一样,不适用本文。
模型在训练数据上表现很好、换一批数据就掉链子,八成是划分这一步没做干净。这篇不聊训练集验证集测试集的定义,直接讲划分顺序、比例取舍的判断依据,以及数据泄漏的排查清单。
适用范围先说清楚:自己准备数据集做微调或从头训练的,按本文走。如果你只是调别人家的 API、或者搭 RAG 检索流程,数据要不要划分、怎么划分逻辑不一样,不适用本文。判断标准很简单——你有没有在更新模型参数,有就适用。
先想清楚三份数据各自要回答什么问题
- 训练集
- 回答「模型能不能学」,只用来更新参数,训练过程中不要拿它下任何结论
- 验证集
- 回答「这一版调参好不好」,早停、选超参、比版本都在它上面做
- 测试集
- 回答「上线后大概什么水平」,只在最后用一次,用第二次它就开始失真
这三份的职责不能混。最常见的错误是把验证集当测试集反复用:调了几十轮之后,验证集的数字已经带上了你的选择偏好,它不再代表新数据。这个时候报告里写的指标要打个折扣看,或者干脆重新划一份从未用过的测试集。
划分的执行顺序:先切测试集,再切验证集
- 第一步:整组切出测试集先从全量数据里留出测试集,剩下的才是训练+验证。别反过来先切训练集,那样比例会被后期调整打乱。
- 第二步:从剩余数据切验证集按类别或时间分层抽样,保证验证集里的类别分布和整体接近。切完统计一下各类别条数,明显偏少的要重新抽。
- 第三步:落盘成清单把三份数据的文件路径或样本 ID 写进固定文件,写清随机种子和分层字段。不要每次训练现切,否则不同实验之间不可比。
- 时间序列类数据必须按时间切,随机切等于拿未来预测过去,线下数字会虚高
- 同一来源的样本(同一用户、同一文档、同一段视频抽的帧)要整组归到同一侧,不能拆开
- 有类别标签的任务按类别分层抽样,别让某个类别在小样本里整类缺席
- 切完之后核对三份数据的交集必须为空,这是最后一道保险
顺序做错的代价往往要等到上线才暴露。先切测试集的好处是它从始至终没参与任何选择,哪怕后面训练调参折腾很多轮,它还是干净的。
比例怎么定:看数据量,不看习惯
| 数据量情况 | 划分倾向 | 注意点 |
|---|---|---|
| 很大 | 验证和测试够用就行,训练数据多留 | 验证集别小到指标抖动看不出差异 |
| 中等 | 三份都要保证有统计意义 | 按类别分别看条数,不看总量 |
| 很小 | 优先保验证集和测试集下限 | 宁可用交叉验证,也别硬切 |
| 类别极不均衡 | 按类别设最低条数 | 少数类在测试集只剩几条时结论不可信 |
具体切多少、按什么口径算,去站内 /training 页面核对当前项目的建议与测算方式,别照抄别人的数字。别人数据量和你的类别分布不一样,套用比例没意义。
- 任务评估极其廉价时(比如规则可判),可以放宽测试集规模,但仍不能省掉
- 上线后要持续监控的场景,可以留一部分数据专门做线上回归,不要一次性用光
- 如果标注成本很高,先把划分脚本跑通再扩大标注量,避免标完发现划分方式要推翻
划分完必做的数据泄漏排查清单
| 排查项 | 怎么查 | 发现后怎么办 |
|---|---|---|
| 重复样本 | 训练集和测试集之间做近重复检测 | 重复的整组删掉或归到同一侧 |
| 预处理参数 | 检查归一化、分词表、特征筛选的参数从哪来 | 只能拿训练集算,再套到另外两份 |
| 标注来源 | 同一批标注员、同一次爬取、同一模板生成 | 划分时打散,别整批进同一侧 |
| 未来信息 | 特征里混进了结果发生后才产生的字段 | 从特征里剔除,或改按时间切 |
这份清单建议在第一次划分后就跑一遍,之后每次改数据来源都重跑。泄漏是最隐蔽的一类问题,模型线下数字虚高、上线崩掉,很多都能追到这里。
划分出来之后怎么用才不算白分
- 训练阶段用验证集做早停,并记录每次评估用的是哪一版划分。不要回头把验证集当测试集汇报。
- 测试阶段测试集跑完就封存。后续改模型重新跑测试集,要在报告里说明这是第几次使用。
- 复现阶段把划分脚本固化成可复现的一步,写清随机种子和分层字段,换人接手不用重切一遍。
还有一点容易被忽略:划分不是一次性动作。数据补标、清洗规则变更之后,原来的划分可能已经失效,要重新判断是否重切,并保留旧版本方便对比。
下一步想看你手上这套数据按当前口径该切多少、以及划分脚本的参考写法,可以去站内训练与数据集页面核对当时的建议。→常见问题
训练集、验证集、测试集必须三分吗?两份行不行?
小规模实验可以只切训练和验证,靠交叉验证替代固定验证集。但只要你要对外报告一个「没见过的数据上大概什么水平」的数字,就需要一份从不参与调参的数据,否则这个数字没有意义。
数据量很小,切完测试集就没多少了怎么办?
优先用交叉验证,把「验证」这一步做成多折轮换,避免固定切一份导致结论噪音太大。测试集可以留得很少但要保留,并且只在最后用一次。比例取舍的具体口径去站内 /training 页面看当时的说明。
怎么判断我是不是过拟合到验证集了?
看两个信号:一是验证集指标涨、测试集指标不涨甚至掉;二是你把验证集上试过的方案数量记下来,试得越多、报出来的最优值越乐观。判断类内容有例外,如果验证集样本量很大且每次只做少量对比,这个问题不严重。