调参建模的时候,划分比例往往是最先卡住的一步:数据只有几百条,切出验证和测试后训练集就不够用了;数据有几十万条,按老习惯切 20% 又浪费。这篇按数据量分档给常见取值,说明每档为什么这么切、什么条件下不适用,再给一套能直接照做的切分动作。
调参建模最先卡住的往往不是模型选型,而是切分:数据只有几百条,切出验证和测试后训练集就不够用;数据几十万条,按习惯切掉一大块又觉得浪费。其实三集比例没有标准答案,只有按数据量档位给的常见区间,再结合你的任务特点微调。
这篇按数据量分档说清楚每档为什么这么切、什么条件下不适用,最后给一套能直接照做的动作。比例只是起点,判断切得对不对,最终要看验证集上的波动幅度,而不是死守某个百分数。
先把三集的职责分清楚,比例才有意义
- 训练集
- 用来更新模型参数,模型见过的数据
- 验证集
- 用来选超参、看早停、比不同方案,可以反复看
- 测试集
- 只在最后评估一次,之前不要拿来调任何东西
职责混用是效果虚高的主要来源。只要用测试集调过一次超参,它就已经变成第二个验证集,最后报出来的分数不再可信。反过来,如果你根本不选超参、也不看早停曲线,验证集可以先省掉,只留训练和测试两集,等真要调参再补回来。
按数据量分档:常见比例与各自适用条件
| 数据量档位 | 常见切法 | 这一档要盯的坑 |
|---|---|---|
| 几百到几千条 | 训练占比压倒性,验证和测试各留一小块,或直接用交叉验证代替固定切分 | 切完训练集太小,模型欠拟合,指标抖动大 |
| 几万条 | 训练为主,验证和测试各留一个固定份额 | 再压训练占比收益已经不明显,不如把测试集留够 |
| 几十万条以上 | 验证和测试只要够统计稳定即可,多留的部分放回训练 | 测试集过大只是浪费,不会让结论更可信 |
小数据集的常见误区是硬套一个比例,结果训练集被切得没法训。这类情况更适合做交叉验证:每折轮流当验证,最后留一份独立测试集。数据量到底在哪个档位、样本量怎么估算,到 /training 看训练相关的对照内容更稳妥。
- 时序数据按时间点切,不能用随机切分,否则未来信息会漏进训练。
- 分组数据保证同一组、同一用户、同一次采集的样本不跨集。
- 类别极不均衡时,每个类别在训练、验证、测试里都要有,必要时用分层切分。
- 如果某个类别样本太少,先在切分规则上处理,别指望靠调参补救。
切之前先定的几条硬规则
- 固定随机种子把种子写进切分脚本,重跑时结果一致;换种子会换出一组完全不同的切分,旧结论没法对比。
- 切分脚本落盘把划分结果存成文件或表,而不是每次训练时临时切;这样模型迭代时大家用的是同一套数据。
- 核对分布切完逐集看标签比例和关键字段分布,偏差明显就重切或改成分层切分。
- 封存测试集测试集单独存放,训练管线里不出现它的路径,避免无意中被读到。
这几条比比例数字更重要。很多「模型不work」的问题,根因是同一用户或同一批采集的数据同时出现在训练和验证里,验证分数自然虚高。切分规则对了,比例在一个区间里都不会有大问题。
什么时候要重新划,什么时候别动
- 新加入一批数据,或标注口径变了,就重新切一次,并保留旧切分做对照。
- 只是反复调参、换模型结构,不要反复重切测试集;每重切一次,测试集就离验证集更近一步。
- 训练集好、验证集差,先怀疑切分和分布,再怀疑模型,可到 /benchmarks 看测评口径理解差距来源。
- 指标在验证集上抖动很大,先加大数据量或改进切法,而不是继续调参。
不适用的情况也说清楚:如果你做的是一次性探索、不需要对外报告结果,可以省掉部分流程;但如果结论要给别人复现,切分规则和固定种子必须交代清楚。上线后的模型还要按新数据分布做监控,旧切分不能一直沿用。
下一步把切分脚本固定下来,再去核对各家模型的训练与测评口径,对比时才知道差距来自数据还是模型。→常见问题
数据只有几百条,还要留验证集和测试集吗?
可以留,但要小:验证和测试各留一小块用于兜底,主要靠交叉验证来估效果。更稳妥的是先保证每集里各个类别都有样本,必要时用分层切分。样本量太小的时候,任何固定比例的结果波动都很大,结论要保守看。
验证集和测试集能不能用同一份?
不要。一旦用测试集去调过超参、选过模型,它就已经参与了决策,报出来的效果会偏乐观。实在数据紧张,可以先不设测试集,只留训练加验证,等模型定型后另找一批从未参与过的数据做最终评估。
随机切分和分层切分怎么选?
类别分布本身比较均匀时,随机切分够用;类别不均衡、或者只有少数几个类样本很少时,用分层切分保证每集里各类占比接近整体。如果数据来自不同时间段或不同来源,还要额外按时间或来源切,不能只靠分层。