训练集 验证集 测试集 比例怎么分

模型与算力

讲清训练集、验证集、测试集怎么按项目规模分比例,给可套用的划分步骤与常见踩坑对照。

做数据准备时最容易卡在划分这一步:全丢进去训练怕过拟合,留太少又怕验证结果不可信。这篇按数据量档位给划分思路,讲清验证集和测试集各自该留多少、什么时候要分层抽样、小数据量下怎么靠交叉验证救场,并给出可照着执行的划分顺序。

数据划分卡住的时候,一般不是不知道三类集合是干嘛的,而是不知道手上这批数据该按几比几切。切得太极端,验证集只有几十条,跑两次指标差一大截,根本分不清是模型变了还是运气变了;切得太保守,训练集又不够喂。所以比例不是拍出来的,是按数据量档位和绝对条数反推出来的。

这篇按规模讲比例怎么取,也给一套能照着走的划分顺序。先提醒一句:下面提到的区间只是经验起点,你项目里具体用哪个值,建议到站内的资料库页面核对同类任务的常见配置,再结合自己的绝对条数定。

先把三类数据集的分工说清

训练集
参与参数更新,模型从这里学规律
验证集
训练过程中用来做选择:调超参、选轮次、触发早停
测试集
只在最后用一次,用来估计上线后的真实水平

关键点在于「被反复看过就不干净了」。验证集你看了几十次、每次据此改一点东西,它就已经被间接拟合了,这时候再拿它当测试集报结果,通常偏乐观。测试集一旦参与调参,它就从测试退化成了第二个验证集,你手里就没有干净的那把尺子了。

  • 别把测试集丢进训练循环里逐轮评估,那是验证集的活
  • 数据清洗要在切分之后各自独立做,先全局标准化再切分,就是把测试样本的统计量泄漏进了训练
  • 同一个样本的增强版本、同一文档的不同段落,别一半进训练一半进测试
  • 验证集和测试集都要保留随机种子和切分脚本,否则下次实验没法对齐

按数据量档位定比例

比例的本质是让每个子集的绝对条数够用,所以先看量级再看百分比。数据越多,验证和测试的占比可以压得越小,因为同样占比对应的条数已经很多;数据越少,占比就得往上抬,宁可训练集少一点,也要保住评估的可信度。

数据量档位常见比例参考判断重点
十万条以上训练占绝大多数,验证与测试各留很小一档验证集绝对条数足够,占比可以小
一万到十万条训练八成上下,验证与测试各留一成左右看验证集有没有几百条以上,否则指标抖动大
千条级别训练六七成,验证与测试各留一成半上下优先保验证集数量
几百条以内不硬切,改用交叉验证随机切分的结果基本不可信

分比例之前先做一道算术题:把百分比换成条数。验证集少于两三百条时,同一个模型跑两次的差距很可能只是噪声,别据此判断方案好坏。具体到你的任务多少条算够,可以到站内的模型资料库页面看看同类任务标注的数据规模做参照。

  1. 定最低验证条数先写下这个任务验证集至少需要多少条才有统计意义,再拿它除以总数据量,倒推出比例下限
  2. 算三份绝对条数按候选比例算出训练、验证、测试各多少条,检查测试集是否也够支撑一次最终评估
  3. 留出余量训练集切完如果明显不够,宁可缩小测试集,也别把验证集压到几百条以下

划分顺序与分层要点

顺序错了,后面比例再讲究也白搭。基本流程是先去重和粗清洗,再切分,最后三个子集各自独立做标准化、分词、增强这类会用到全局统计或引入变形的操作。反过来做,信息就会从验证测试倒灌进训练。

  • 分类任务按类别分层抽样,保证稀有类别在每个子集里都有样本,不然验证集里可能一条都没有
  • 时间序列和推荐场景不能随机切,要按时间或用户维度切,随机切等于让模型看到未来信息
  • 多模态或分组数据按组切,同一用户、同一文档、同一视频的片段整体进同一个子集
  • 切完做一次分布体检:对比三个子集的标签分布、文本长度分布、来源分布,差太多说明切分有问题
# 分层切分前先看类别分布,切完再检查一遍
from collections import Counter
print(Counter(labels))
# 切分后分别统计 train / val / test 的类别计数,比对比例

分层抽样对稀有类别尤其重要。假设某个类别在全集里只有几十条,随机切很可能验证集里只剩个位数,这时候验证指标基本没有参考价值。分层能把它按比例摊到三个子集里,代价只是实现上多几行代码。

什么情况下这套比例不适用

上面那套思路默认你是有监督任务、样本之间比较独立、数据量不至于太少。这几种前提不成立的时候,比例数值本身要让位于切分方式,硬套公式反而会误导判断。

场景为什么比例不适用该怎么做
自监督或纯无监督预训练通常没有独立验证集的概念按预训练任务的评估方式设计,别照搬监督学习比例
固定测试集的榜面对比测试集由外部给定你只需再切出训练和验证两部分
强时序或强分组数据随机切分低估真实难度先按时间或用户切,比例只是次要参数
几百条以内的小数据单次划分的方差太大用留一法或 K 折交叉验证,注意评估开销

小数据场景还有个附加注意点:交叉验证的结果解读方式和大数据不一样。K 折的每一折都在同一批数据上轮换,折与折之间并不独立,别把折间均值和标准差的含义直接套成「模型上线表现」。

可执行划分清单

把下面的顺序走一遍,基本能覆盖划分环节的常见坑。每一步都留痕,后续换模型、换特征时沿用同一套切分,才能做横向对比。

  1. 定评估口径写清楚验证集和测试集分别回答什么问题,并约定测试集只允许用一次
  2. 按绝对条数反推比例先定验证集最少要多少条,倒推百分比,再检查训练集是否够用
  3. 执行切分并落盘输出训练、验证、测试三个文件,记录随机种子和切分脚本,保证可复现
  4. 做分布体检和泄漏检查对比三个子集的分布,排查重复样本和跨子集同源样本
  5. 写进实验记录把划分方案固定下来,后续实验沿用同一套切分做对比
下一步划分定下来之后,训练环境和中转服务的连通性也会影响实验节奏。想核对当时可用的中转站线路和速度表现,可以到站内目录和测速页面看当时的数字。

常见问题

验证集和测试集能不能用同一份数据?

不建议。验证集在训练中被反复使用来做选择,用久了会间接影响模型;测试集要留到完全定稿后用一次,才能估计真实泛化水平。数据特别少时可以先只用训练加交叉验证,把测试集留到最终验收再切出来。

数据量很少的时候,比例应该往哪边偏?

优先保证验证集有足够样本量支撑判断,训练占比可以适当降。总量在几百条以内时,比起硬切比例,更推荐 K 折交叉验证,每折轮流做验证,用平均结果降低单次划分带来的偶然性。

随机切分可以吗,还是必须分层?

类别不平衡、来源多样或有分组结构时必须分层或按组切;类别均衡且样本独立同分布时,固定种子的随机切分也能用。判断标准是看切完后三个子集的类别和来源分布是否接近,差异明显就要改成分层切分。

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