将数据集分为训练集、验证集和测试集

模型与算力

讲清把数据集划成训练、验证、测试三份的判断标准和操作顺序,给可落地的划分步骤与常见坑排查。

模型跑出来在训练数据上很漂亮、换个数据就崩,八成是划分这一步没做干净。这篇不聊概念定义,直接给划分顺序、比例取舍的判断依据、以及数据泄漏的排查清单。适用于自己准备数据集做微调或训练的场景;如果你只是调 API 或做 RAG,划分逻辑不一样,不适用本文。

模型在训练数据上表现很好、换一批数据就掉链子,八成是划分这一步没做干净。这篇不聊训练集验证集测试集的定义,直接讲划分顺序、比例取舍的判断依据,以及数据泄漏的排查清单。

适用范围先说清楚:自己准备数据集做微调或从头训练的,按本文走。如果你只是调别人家的 API、或者搭 RAG 检索流程,数据要不要划分、怎么划分逻辑不一样,不适用本文。判断标准很简单——你有没有在更新模型参数,有就适用。

先想清楚三份数据各自要回答什么问题

训练集
回答「模型能不能学」,只用来更新参数,训练过程中不要拿它下任何结论
验证集
回答「这一版调参好不好」,早停、选超参、比版本都在它上面做
测试集
回答「上线后大概什么水平」,只在最后用一次,用第二次它就开始失真

这三份的职责不能混。最常见的错误是把验证集当测试集反复用:调了几十轮之后,验证集的数字已经带上了你的选择偏好,它不再代表新数据。这个时候报告里写的指标要打个折扣看,或者干脆重新划一份从未用过的测试集。

划分的执行顺序:先切测试集,再切验证集

  1. 第一步:整组切出测试集先从全量数据里留出测试集,剩下的才是训练+验证。别反过来先切训练集,那样比例会被后期调整打乱。
  2. 第二步:从剩余数据切验证集按类别或时间分层抽样,保证验证集里的类别分布和整体接近。切完统计一下各类别条数,明显偏少的要重新抽。
  3. 第三步:落盘成清单把三份数据的文件路径或样本 ID 写进固定文件,写清随机种子和分层字段。不要每次训练现切,否则不同实验之间不可比。
  • 时间序列类数据必须按时间切,随机切等于拿未来预测过去,线下数字会虚高
  • 同一来源的样本(同一用户、同一文档、同一段视频抽的帧)要整组归到同一侧,不能拆开
  • 有类别标签的任务按类别分层抽样,别让某个类别在小样本里整类缺席
  • 切完之后核对三份数据的交集必须为空,这是最后一道保险

顺序做错的代价往往要等到上线才暴露。先切测试集的好处是它从始至终没参与任何选择,哪怕后面训练调参折腾很多轮,它还是干净的。

比例怎么定:看数据量,不看习惯

数据量情况划分倾向注意点
很大验证和测试够用就行,训练数据多留验证集别小到指标抖动看不出差异
中等三份都要保证有统计意义按类别分别看条数,不看总量
很小优先保验证集和测试集下限宁可用交叉验证,也别硬切
类别极不均衡按类别设最低条数少数类在测试集只剩几条时结论不可信

具体切多少、按什么口径算,去站内 /training 页面核对当前项目的建议与测算方式,别照抄别人的数字。别人数据量和你的类别分布不一样,套用比例没意义。

  • 任务评估极其廉价时(比如规则可判),可以放宽测试集规模,但仍不能省掉
  • 上线后要持续监控的场景,可以留一部分数据专门做线上回归,不要一次性用光
  • 如果标注成本很高,先把划分脚本跑通再扩大标注量,避免标完发现划分方式要推翻

划分完必做的数据泄漏排查清单

排查项怎么查发现后怎么办
重复样本训练集和测试集之间做近重复检测重复的整组删掉或归到同一侧
预处理参数检查归一化、分词表、特征筛选的参数从哪来只能拿训练集算,再套到另外两份
标注来源同一批标注员、同一次爬取、同一模板生成划分时打散,别整批进同一侧
未来信息特征里混进了结果发生后才产生的字段从特征里剔除,或改按时间切

这份清单建议在第一次划分后就跑一遍,之后每次改数据来源都重跑。泄漏是最隐蔽的一类问题,模型线下数字虚高、上线崩掉,很多都能追到这里。

划分出来之后怎么用才不算白分

  1. 训练阶段用验证集做早停,并记录每次评估用的是哪一版划分。不要回头把验证集当测试集汇报。
  2. 测试阶段测试集跑完就封存。后续改模型重新跑测试集,要在报告里说明这是第几次使用。
  3. 复现阶段把划分脚本固化成可复现的一步,写清随机种子和分层字段,换人接手不用重切一遍。

还有一点容易被忽略:划分不是一次性动作。数据补标、清洗规则变更之后,原来的划分可能已经失效,要重新判断是否重切,并保留旧版本方便对比。

下一步想看你手上这套数据按当前口径该切多少、以及划分脚本的参考写法,可以去站内训练与数据集页面核对当时的建议。

常见问题

训练集、验证集、测试集必须三分吗?两份行不行?

小规模实验可以只切训练和验证,靠交叉验证替代固定验证集。但只要你要对外报告一个「没见过的数据上大概什么水平」的数字,就需要一份从不参与调参的数据,否则这个数字没有意义。

数据量很小,切完测试集就没多少了怎么办?

优先用交叉验证,把「验证」这一步做成多折轮换,避免固定切一份导致结论噪音太大。测试集可以留得很少但要保留,并且只在最后用一次。比例取舍的具体口径去站内 /training 页面看当时的说明。

怎么判断我是不是过拟合到验证集了?

看两个信号:一是验证集指标涨、测试集指标不涨甚至掉;二是你把验证集上试过的方案数量记下来,试得越多、报出来的最优值越乐观。判断类内容有例外,如果验证集样本量很大且每次只做少量对比,这个问题不严重。

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