刚上手做模型的人常卡在一件事:数据切完了,却说不清每一份到底该拿去干什么。把验证集当成测试集反复调参,最后报出来的效果跟真实上线差一大截;或者干脆不切,全量喂给模型,训练损失好看,一到新数据就崩。这篇按「各份数据在一次训练里分别被谁用、用来看什么」这条线讲清职责边界,给出可照着做的划分与自查步骤,不涉及具体比例数字和跑分。
刚上手做模型的人常卡在一件事:数据切完了,却说不清每一份该拿去干什么。把验证集当成测试集反复调参,最后报出来的效果和真实上线差一大截;或者干脆不切,全量喂给模型,训练损失一路走低,一到新数据就崩。这篇按「各份数据在一次训练里分别被谁用、用来看什么」这条线讲清职责边界。
下面给的是可照着做的划分与自查步骤,不涉及具体比例数字和跑分。真正要记住的是边界:谁被模型直接学过,谁被拿来做过选择,谁一直没动过。边界一乱,后面所有数字都失去参考价值。
三份数据各管一段:先把职责对号入座
先别急着调参,先把三份数据的角色写在纸上,贴到训练脚本旁边。角色清楚了,你才知道某个操作该拿哪一份去验证,以及这个操作会不会污染后面的评估。
- 训练集
- 模型直接看答案、改参数的那一份,它决定模型学到什么
- 验证集
- 训练过程中用来做选择的那一份,选超参、选轮次、选早停点都靠它
- 测试集
- 最后一次开箱验货,只在定稿后用一次,用完不能回头改模型
为什么要分家:不复用同一份数据的理由
很多人以为切数据只是为了流程好看,其实核心只有一句:同一份数据被模型记住之后,再拿它评分等于自己出题自己答。分数高不代表泛化好,只代表背得熟。分开之后,每一份各自承担一个无法互相替代的职责。
| 数据份 | 训练时能不能看 | 能不能拿来调参 | 能不能用来报最终效果 |
|---|---|---|---|
| 训练集 | 能,直接学 | 能,但只反映拟合 | 不能 |
| 验证集 | 间接参与选择 | 能,这是它的本职 | 不能,只能当参考 |
| 测试集 | 不能看 | 不能 | 能,且只报一次 |
- 验证集的作用是替你做决策,所以被反复看没关系,但看多了也会被间接过拟合;
- 测试集的价值全在「没被影响过」,一旦拿它调过参,报出来的数字就只能算好看的估计值;
- 判断标准:如果一份数据你已经在上面做过任何选择,它就不再是测试集,只能降级当验证集用;
- 数据量很小时可以不单独划测试集,改用交叉验证,但报结果时必须说明用的是哪种切法。
划分动作清单:从切分到固定下来
划分不是随手一行代码的事。下面这套顺序按落地场景排,照着做能避掉大部分「切完就后悔」的情况。
- 先固定随机种子在切分脚本里写死随机种子再切,保证别人复现时拿到同一批划分;换种子前后对一下样本数,确认没变。
- 判断要不要分层类别不均衡或数据量小的场景用分层抽样,让每份里各类占比接近;数据量大且类别均衡时可以省掉这步。
- 决定按不按时间切按时间收集的数据别随机切,按时间先后切更接近上线场景;随机切会把未来信息漏进训练,效果虚高。
- 做一次分布对照三份的特征均值、类别占比差太多,说明切歪了,重切;对照结果记下来,后面出问题好回溯。
- 把划分落盘划分结果存成清单文件,别每次跑脚本都重新随机;模型、特征、切分三者要能对上同一版数据。
看结果:三份数据上的表现分别在告诉你什么
指标本身不说明问题,三份之间的差距才说明问题。下面这张对照表可以当排查顺序用:先看差距落在哪两栏之间,再决定动哪里。
| 训练集表现 | 验证集表现 | 最可能的原因 | 先动手的地方 | |
|---|---|---|---|---|
| 好 | 差 | 过拟合 | 数据量、正则、训练轮次 | |
| 差 | 差 | 模型太弱或特征没信息 | 换方法,不是继续调轮次 | |
| 好 | 好 | 但测试集差 | 在验证集上挑太多次,或分布不一致 | 检查切分与选择次数 |
| 都不稳 | 都不稳 | 数据太小或噪声大 | 交叉验证 + 检查标注质量 |
- 训练集好、验证集差:典型过拟合,先看数据量和正则、轮次;
- 训练集和验证集都差:模型太弱或特征没信息,换方法而不是继续调轮次;
- 验证集好、测试集差:多半是你在验证集上挑太多次,或两份数据分布不一致;
- 什么情况下不适用:数据量极小的任务,切割本身会带来很大抖动,这时交叉验证比单次切分更可信。
想横向看不同模型和接口在这类评估上的实测表现,可以直接翻站内整理好的对照资料,别只看单次脚本跑出来的数字。评估流程本身也值得对照行业做法,避免自己闭门造车。
下一步把你现在的切分脚本和评估流程对着站内的模型与工具资料过一遍,看看评估口径是否和主流做法一致。→常见问题
验证集和测试集到底差在哪,能不能只留一个?
差别在使用次数和目的。验证集在训练过程中被反复使用,用来选配置;测试集只在最后用一次,用来估计最终效果。只留一个的话,你等于拿唯一的标准答案反复调参,最后报出来的效果会偏乐观,上线后掉点很难解释。
三份数据的比例应该怎么定?
没有通用数字,取决于数据总量和任务难度:数据少的时候验证和测试都要留够,否则评估结果抖动大;数据多的时候可以少留一点,评估依然稳定。站内 /training 与 /tools 页面有划分与换算相关的对照内容,按你手头的数据量去对一遍再定,别照抄别人的比例。
训练完发现测试集效果不好,能不能回头再调?
可以调,但调完那份数据就不能再叫测试集了,它已经变成了验证集。正确做法是重新留一份从没参与过决策的数据当新的测试集,或者用交叉验证的方式整体评估。反复用同一份数据调参再报它的分数,数字会越来越不可信。