做模型时最容易随手写下的一句话就是「按 8:1:1 切一下」。可真到数据只有几百条、或者要反复调参数的时候,这个比例往往站不住:验证集翻来覆去用了几十轮,测试集迟早被间接污染。这篇不给你一个万能比例,而是把划分比例背后的几条依据讲明白——数据量、模型容量、调参自由度、评估置信度——再给一套可以照着走的确定比例的顺序。
做模型时最容易随手写下的一句话就是「按 8:1:1 切一下」。可真到数据只有几百条、或者要反复调参数的时候,这个比例往往站不住:验证集翻来覆去用了几十轮,测试集迟早被间接污染。这篇不给你一个万能比例,而是把划分比例背后的几条依据讲明白——数据量、模型容量、调参自由度、评估置信度。
下面的顺序是:先想清楚为什么必须切三份,再看常见比例从哪来、什么时候不能照搬,然后给一套可以照着走的确定比例的四步法,最后说两个比比例更容易翻车的点。每一步都尽量能落到一个具体动作上。
为什么必须切三份:比例背后的三个约束
三份数据各自被一个约束卡着大小,比例只是这三个约束互相妥协的结果,不是先有比例再有约束。训练集要足够大到能覆盖任务分布,否则模型学的是样本不是规律;这条约束随模型容量上升而变紧,小模型能吃下的数据量远比大模型少,大模型在小数据上更容易记住噪声。
- 训练集:下限由「任务分布有多复杂」决定,分类边界越弯、输入维度越高,需要的样本越多;上限不用太操心,给多了只是慢。
- 验证集:下限由「评估指标的方差」决定,分类任务比回归任务更敏感,类别不平衡时还要按最小类算条数,而不是按总量算。
- 测试集:下限由「你打算用几次」决定,它的作用是给一个无偏的最终数字,用第二次就不再无偏。
常见比例从哪来,什么时候不能照搬
「大比例训练、小比例验证」的写法来自统计学习的经验做法,前提是数据量大且模型不复杂。搬到小样本任务上,验证集可能只有十几条,指标抖动大到没法做决策,这时候纠结切几比几没有意义,先解决样本量问题。
| 场景 | 能不能随机切 | 替代做法 |
|---|---|---|
| 数据量少(几百条级) | 能,但切出来太小 | 交叉验证或留一法,把每份都当过验证集 |
| 类别不平衡 | 能,但要分层 | 按类别分层抽样,验证集按最小类反推 |
| 时间序列 | 不能 | 按时间点切,验证集和测试集都在训练集之后 |
| 分组数据(同一用户/文档多条) | 不能 | 按组切,同一组只进一侧,避免近重复泄漏 |
数据量中等(几千到几万条)时,可以先用一个宽松比例起步,再按指标波动幅度微调,而不是一步到位。判断标准是:把验证集指标重复算几次,如果波动大到能改变你选哪个模型,就说明验证集偏小。
确定比例的四步走法
- 算评估指标可接受的最小样本数先估各类别占比,按最小类反推验证集最少要多少条;分类任务一般希望最小类有几十条以上,具体阈值看你任务对误差的容忍度。
- 用总量减去最小值,再分训练和测试测试集可以直接取和验证集同量级,不必更大,它的作用是无偏,不是稳。剩下的全给训练集。
- 检查调参预算如果你计划试十几组超参,验证集太小会让选择结果偏向噪声;此时要么加大验证集,要么改用交叉验证,别硬扛。
- 把测试集封存,只留一次使用机会中途任何基于测试集的决定都会让它失效,包括看一眼分布、调一次阈值。要做这些就回到验证集。
做完这四步再去站内核对同类任务的常见做法,不要反过来先抄比例。站内不同任务的示例数据规模差别很大,到 /tools 这类工具目录里看当前常见的处理路径更靠谱,页面上的数字以当时显示为准。
比例之外更容易出错的两件事:泄漏与复用
数据泄漏比比例错更致命。同一用户、同一文档切出来的近重复样本必须整组放进同一侧,否则验证分数会明显偏高,你会以为模型学会了,其实只是见过了。这一条在推荐、风控、文本去重类任务里尤其常见。
- 检查近重复:切分前先做一轮去重或相似度聚类,按组分配而不是按行分配。
- 验证集复用要有上限:反复用它挑模型等于在它上面过拟合,超过一定轮次后应换出新的验证集或回到交叉验证。
- 测试集被看过结果就降级为验证集,另留一批新数据当测试集,并把这个动作记录下来,避免自欺。
- 把切分脚本固化下来,不要每次手动切,手工切最容易在换数据时悄悄泄漏。
比例是可以调的参数,泄漏是会骗人的错误;先把后者堵死,再谈前者。下一步想验证自己的切分流程是否健康,可以到站内的工具目录对照一遍检测流程,而不是只看最终分数;比例本身没有标准答案,但切分错误有共同的破绽。→
常见问题
数据只有几百条,还按比例切吗?
不建议直接切。几百条时验证集往往只剩几十条,指标抖动会盖过模型差异。改用交叉验证,或者先把数据按关键分组做留出法,确保每组都在训练和验证里出现。真要切,也以「每类至少几十条」为底线反推比例。
验证集和测试集能不能用同一份?
不能长期共用。验证集是给你调参用的,会被反复看;测试集是给最终结论用的,只能用一次。共用会让最终分数带着调参的痕迹,看起来很好,上线后打回原形。折中做法是先用验证集调完,再单独留一批从未参与过的数据做终评。
比例定了以后还能改吗?
可以改,但要说明为什么改,并且改完重新跑一遍对照。常见触发条件是:验证指标波动过大、调参轮次远超预期、或者发现数据泄漏需要重新分组。改的时候优先动验证集大小,测试集尽量保持封存不动。