拿到一批数据准备训练模型时,很多人卡在「到底怎么切」这一步:是先切再洗还是先洗再切、要不要留验证集、随机种子设不设、类别不均衡怎么分。这篇不讲概念定义,只给可照着做的切分步骤和五种常见场景的处理方式,并说明哪些情况下 2:8 这个比例本身就不该硬套。
拿到一批数据准备训练模型时,很多人卡在「到底怎么切」这一步。是先切再洗,还是先洗再切?要不要再留一份验证集?随机种子设不设?类别不均衡又该怎么分?这篇不讲概念定义,只给能照着做的切分动作,顺带说清哪些场景下 2:8 这个比例本身就不该硬套。
另外提醒一句:切分比例、样本量这些数字会随数据集变化,站内资料库里的模型与数据处理说明只是参考,具体到你自己这份数据,还是要按下面的步骤实测一遍再定。
2:8 这个比例到底在分什么
先明确:2:8 是测试集占两成、训练集占八成,前提是你只切一刀。如果你还打算留一份验证集用于调参和选模型,那八成那一份要再切一次,别把验证集混进测试集里。三份数据的职责不一样,混着用等于自己骗自己。
- 比例不是铁律:数据量越大,测试集占比可以越小;几千条以内的小数据集按 2:8 甚至 3:7 更稳,否则测试集样本太少,指标抖动大,一次评估说明不了问题
- 切之前先想清楚测试集要干什么:只看最终一次效果,就别拿它反复调参;要反复看效果、比不同模型,就该单独留验证集,测试集只在收尾时碰一次
- 把比例写成实验记录的一部分,而不是记在脑子里。换比例、换种子都要有对照,不然后面说不清效果变化到底来自哪一步
照着做的切分步骤
下面的顺序不要颠倒,尤其是「先切再洗」这条,很多人栽在这里。切分动作本身不复杂,难的是不把信息从测试集漏进训练集。
- 第一步:定口径把每条样本的唯一标识、标签、时间字段列出来,确认切分后同一条数据不会同时出现在两边。有同源记录的先记下分组字段。
- 第二步:先切再洗先按比例切分,再只在训练集上做去重、筛异常、算统计类特征。任何用到全局均值、全局分布的清洗都算泄漏,别在切之前做。
- 第三步:固定随机设定随机种子并写下来,同一份数据每次切出来的结果必须一致。种子不固定,前后两次实验就不可比,调参等于盲调。
- 第四步:留痕把切分脚本、种子、比例、各类样本数写进项目说明或训练记录,方便日后回看和复现,也方便别人接手。
| 检查项 | 合格标准 | 不合格的表现 |
|---|---|---|
| 唯一 ID | 两侧无重复 ID | 同一条数据跨集出现 |
| 类别占比 | 两侧比例接近 | 某类只在一侧出现 |
| 统计特征 | 只用训练集统计量 | 用了全量均值或方差 |
| 可复现性 | 同种子同结果 | 每次切分结果都不同 |
类别不均衡和同源数据怎么处理
标签不均衡时,随机切很容易让测试集里某个类别一条都没有,这个类别等于没测。这时候用分层抽样,让两边的类别占比大致对齐。别指望随机就能分匀,数据越偏越分不匀。
还有一种更隐蔽的问题:同一来源的多条记录。同一用户的多条行为、同一批次采集的样本、同一篇文档切出来的段落,这些要按组切分,整组进训练或整组进测试。按行打散会让相似样本同时出现在两边,测试分数虚高。
- 分层抽样:按标签字段分层,让两类数据里的类别占比接近
- 分组切分:按用户、批次、文档等分组字段整组划分,不按行打散
- 组合用法:先按组聚合,再对组做分层,最后把组映射回样本
- 切完验证:跑一遍占比和重复 ID 检查,确认没分歪
这几种情况别硬套 2:8
2:8 默认数据是独立同分布的,且样本量够大。但现实里有两类数据不满足这个前提,硬套比例只会得到好看但没用的数字。
| 场景 | 为什么不适用 | 替代做法 |
|---|---|---|
| 时间序列 | 随机切等于用未来预测过去 | 按时间先后切,训练用早期、测试用后期 |
| 小样本 / 高成本标注 | 数据太少,一刀切浪费 | 交叉验证,多轮轮换,代价是训练次数变多 |
| 在线业务 | 上线后分布会漂移 | 测试集数字只作离线参考,上线后持续回看 |
时间序列要特别注意:不能随机打散,要按时间轴切。训练集用早期数据,测试集用后期数据,模拟真实的预测场景。如果数据里还有周期性和趋势,切分点也要避开周期边界,免得测试集正好落在一个特殊时段。
在线业务还有一点:切分只能验证离线效果,上线后的数据分布会漂移。测试集上的数字不能当成线上表现的承诺,需要持续用真实流量回看。想了解不同模型和接口的实际表现,可以到站内的资料库和评测页面核对当时的记录,别只看一次离线结果。
切分前后的自查清单
切完别急着训练,先跑一遍检查。下面这几条按顺序过一遍,能拦掉大部分低级错误。
- 先查比例:两侧样本数是否符合设定,类别占比差异多大,有没有重复 ID 跨集出现
- 再跑基线:用极简模型或规则在测试集上看一眼,效果好得离谱时优先怀疑泄漏,而不是模型强
- 固定记录:把比例、种子、分层字段、分组字段这四项写进实验记录,下次换比例才有对照
- 数据更新后重新切分:别拿旧测试集测新数据,分布变了,旧结论就不成立
最后留一句:切分是实验设计的一部分,不是一次性动作。数据变了、模型变了、业务场景变了,切法都可能要跟着调整。
下一步想对照不同模型和数据集处理方式的实际效果,可以到站内评测与资料库页面核对当时的记录,再结合自己数据的实测结果做判断。→常见问题
有验证集的话,2:8 该怎么切?
常见做法是先切出两成做测试集,剩下的八成再对半分或按 1:9 分为训练和验证,具体看数据量。数据量小的时候验证集可以更薄,但要保证足够评估稳定性。核心原则是测试集只在最后用一次,调参过程只碰验证集,否则测试集就失去了独立评估的意义。
随机切分每次结果都不一样怎么办?
固定随机种子。多数切分函数都支持传入种子参数,种子相同、数据顺序相同,切出来的结果就一致。同时要固定数据读取顺序,比如先按 ID 排序再切分,否则同一份数据换个读取顺序种子也会失效。把种子写进实验记录,是为了让前后的对比有可比性。
按 2:8 切完测试集指标很差,是不是切错了?
先排查泄漏和分布,再看模型本身。检查有没有同源样本跨集、有没有在切分前做过全局标准化、类别占比是否严重偏移。如果测试集和训练集分布差很多,那更可能是切分方式的问题。若排查完都正常,说明模型泛化确实不够,再考虑加数据或换方法,而不是回头改比例。