刚上手机器学习的人,多半会在一个小项目上卡住:数据拿到手了,模型也搭好了,但到底切几份、每份留多少,心里没底。切少了怕评估不准,切多了怕训练不够,网上还流传着各种互相矛盾的比例说法。这篇不讲模型原理,只把三类数据集的分工讲清楚,再给一套能照着做的划分顺序和判断标准,顺带说清哪些情况下常规比例并不适用。
刚上手机器学习的人,多半会在一个小项目上卡住:数据拿到手了,模型也搭好了,但到底切几份、每份留多少,心里没底。切少了怕评估不准,切多了怕训练不够,网上还流传着各种互相矛盾的比例说法。
这篇不讲模型原理,只把三类数据集的分工讲清楚,再给一套能照着做的划分顺序和判断标准,顺带说清哪些情况下常规比例并不适用。你可以把它当成一份操作清单,边看边动手改自己的切分脚本。
三份数据各干什么活
三份数据最核心的差别不是大小,而是「谁有权影响模型」。训练集的数据会影响模型参数,验证集的数据会影响你做的选择,测试集的数据谁也不许影响,只在最后看一眼。只要这三条边界守住了,比例怎么定都不容易出大错。
- 训练集
- 用来调参数,模型在这份数据上反复看、反复改权重,所以它表现好是应该的
- 验证集
- 不参与调权重,只用来做选择:挑超参、挑轮次、挑模型版本,相当于内部彩排
- 测试集
- 只在最后用一次,是交卷前的最终打分,一旦反复拿它调,它就被污染成第二个验证集了
比例怎么定:先看数据总量再谈百分比
很多人一上来就问「比例是多少」,其实这个问题问反了。正确的顺序是先看数据总量,再看任务类型,最后才谈比例。数据越多,验证集和测试集越应该按「固定条数」而不是「固定百分比」来留。
| 数据规模 | 切分思路 | 注意事项 |
|---|---|---|
| 很大 | 验证集、测试集各留一个固定大小的切片,剩下的全给训练 | 固定条数比固定百分比更省数据,也更方便跨版本对比 |
| 中等 | 训练占大头,验证和测试对半分剩下的部分 | 这个口径在多数入门项目里够用,别过度纠结 |
| 很小 | 考虑用交叉验证替代固定切分 | 代价是训练时间成倍增加,且流程更复杂 |
- 数据量很大时,验证集和测试集各留一个固定大小的切片就够了,不必按百分比切
- 数据量中等时,常见做法是训练占大头、验证和测试对半分剩下的部分
- 数据量很小时,每一份都要省着用,可以考虑交叉验证来替代固定切分
- 具体到你的任务该切多少,先用站内的部署测算页把数据规模和算力对上,再决定切法
拿不准的时候,可以到 /tools/speed-test 这类站内工具做个粗测,先确认你的数据规模和训练预算是否匹配,再回头定切分方案,比拍脑袋定比例靠谱。
照着做的划分顺序与防漏清单
切分这件事最怕的是顺序错了。正确做法是先处理数据层面的问题,再动切分,最后才固定随机性。下面这套顺序可以直接抄进你的脚本。
- 先分层分类任务按类别比例分层抽样,避免某一类只落在测试集里;检查方法是切完后打印每类在三份数据里的占比
- 先去重同一来源、同一用户、同一时间段的样本要整体分到同一侧,别让近重复样本跨集出现;可以用哈希或相似度做近重复检测
- 再定种子设定随机种子并写进配置里,保证别人能复现你这次的切分;改种子前先记录基线结果
- 留切分脚本把切分逻辑写成独立脚本,换数据时重跑,不要手工挪样本;数据带时间属性时按时间切,不要随机打乱
如果你在多个模型或 API 之间做选择,切分方式要尽量保持一致,否则模型之间的对比就没意义了。站内 /rankings 上的对比口径可以拿来参考,但最终要用你自己的验证集说话。
新手最常踩的几个坑
下面这几条几乎每个入门项目都会撞上一两条。它们不涉及复杂理论,但会直接让你报出来的效果虚高,或者让结论完全站不住脚。
- 拿测试集反复调参,最后报出来的效果是虚高的,属于最常见的自欺
- 切分前做了全局归一化或填充,统计量里混进了测试集信息,这叫数据泄漏
- 验证集和测试集分布不一致,一个偏简单一个偏难,导致验证阶段的结论到测试阶段全部推翻
- 类别极不平衡时还按统一比例硬切,小类样本可能一份都不剩
排查顺序建议是:先查泄漏,再查分布,最后查比例。泄漏问题最隐蔽也最致命,通常表现为验证效果好得反常。发现异常好,先怀疑泄漏,而不是先庆祝。
想核对具体任务上的常见做法和数据规模建议,可以到 /guides 翻一翻对应主题的手册页,那里会给出针对不同数据类型的切分建议,数字随任务变化,别照抄别处的比例。
验证集是给你做决定的,测试集是给别人验收的。你动测试集一次,它就不再是测试集了。
下一步
下一次拿到新数据时,先别急着跑模型。花十分钟把切分脚本写好:分层、去重、固定种子、留档。这一步做扎实,后面所有对比才有意义。
下一步站内指南与定价页里有按任务类型整理的数据划分建议和工具入口,先看一眼再动手,能少踩很多坑。→常见问题
训练集、验证集和测试集比例到底有没有标准答案?
没有放之四海皆准的数字。比例取决于数据总量、任务难度和你要做多少次实验。数据越多,验证和测试越可以只留固定大小;数据越少,越需要靠交叉验证来榨干每一条样本。别背数字,先明确每份数据要回答什么问题。
只有训练集和测试集两个,没有验证集行不行?
小项目、不做任何调参的情况下勉强可以,但你一旦根据测试结果回头改模型或改超参,测试集就失真了。此时更稳妥的做法是从训练集里再切一小块当验证集,用它做选择,把测试集留到最后只用一次。
验证集和测试集的差别是不是只是用几次的问题?
不完全是。用几次是表象,本质是它们服务的决策不同:验证集服务于你在多个方案之间做选择,测试集服务于你对外给出一个不带选择偏差的效果估计。只要测试集参与过任何一次决策,这个估计就不再干净。