很多人第一次上手做模型,数据一锅端进去训练,结果线上表现一塌糊涂,回头才发现自己一直在拿考过的题估分。这篇不讲数学,只讲三类数据集的分工:谁用来学、谁用来挑、谁最后只能看一次。给一套能直接照着做的划分步骤,以及什么时候该重新分、什么时候不用分。
很多人第一次上手做模型,最喜欢干的一件事就是把手里所有数据一股脑塞进去训练,看着训练损失一路往下掉,心里美滋滋。等模型上线跑了两天,效果惨不忍睹,回头翻流程才发现:自己从头到尾都在拿考过的题估分。这不是模型笨,是评估方法从一开始就错了。
这篇不讲公式,只讲三份数据各自站什么岗:哪份用来学、哪份用来挑、哪份最后只能看一次。看完你至少能做到两件事——按一套能落地的顺序把数据切明白,以及在指标不对劲时知道该先查哪。
三份数据,三个身份:学、挑、判
把训练过程想成学生备考,三份数据就是三种角色,不能串岗。串了岗,分数就没意义了,因为你在用同一套题又练又考。
- 训练集
- 练习册。模型从它身上反复调参数,题做得越多越熟,但熟的是这些题本身,不是背后的规律
- 验证集
- 模拟考。用来选超参数、选训练轮数、选模型版本,允许反复看,所以看多了也会被『污染』
- 测试集
- 高考。只在最后用一次,一旦拿它调过任何东西,它就不再是测试集,只能降级当验证集
- 训练集好、验证集差,先怀疑过拟合,再查数据泄露和分布不一致
- 验证集反复调、越调越好,要警惕你在给验证集『背答案』
- 测试集只用一次,用完就换一批,别既当裁判又当教练
- 三份数据都好看但线上不行,问题通常不在划分比例,而在线上分布和离线数据根本不是一回事
用备考打个比方,顺带把常见划分做法说清
学生刷题是训练,模拟考是验证,期末考是测试。模拟考考砸了就改复习方法,改完再模考,这个反复改的过程叫调参;期末考成绩出来只用来填志愿,不能因为不满意就回去改答题卡——改了,这次成绩就作废了。
| 场景 | 划分做法 | 为什么这么做 |
|---|---|---|
| 数据量小(几百上千条) | 用交叉验证,轮流留出一份当验证 | 单独切一块验证集会导致训练数据太少,结果不稳 |
| 数据量中等 | 训练占大头,验证和测试各留一小块 | 三份都能覆盖,且测试集够做一次可信评估 |
| 类别不平衡 | 按类别分层抽样 | 否则某一类可能全被抽进测试集,指标完全失真 |
| 时间序列 / 行为日志 | 按时间先后切,不能随机打乱 | 随机切会让未来数据泄漏进训练,离线指标虚高 |
| 多来源数据 | 按渠道或来源切,不要随机切 | 能提前暴露跨来源的泛化问题,更接近上线真实情况 |
- 先确定评估目标想清楚你要回答的是『这个模型行不行』还是『这批模型里选哪个』,前者需要测试集,后者需要验证集,别混用。
- 按场景选切法对照上面的表选随机切、分层切、按时间切还是按来源切,先切再训练,不要训练完再想。
- 留出测试集并锁住切完立刻把测试集单独存放,标注清楚,团队内约定只在最终确认时调用一次。
- 复查泄露检查训练集和验证集之间有没有重复样本、同一用户跨集合、同一段时间跨集合,这些都会让指标虚高。
出问题时的排查顺序
指标异常时不要上来就调模型,先按下面这个顺序排一遍,大多数『模型不行』的案子最后都落回数据划分上。
- 训练集好、验证集差:先查过拟合信号,再查同一批样本是否同时出现在两份数据里,最后看两边分布是否一致
- 训练集本身就差:这不是划分问题,先查标签错误、学习率设置、数据量是否太少,别在划分比例上反复折腾
- 验证集好、测试集差:大概率是在验证集上挑了太久,或者测试集本身太小、抽样偏差大,考虑重新采一批测试样本
- 三类数据都好看但线上不行:多半是线上分布和离线数据不是一回事,缺的是新采集的真实样本,再调划分比例也没用
顺带说一句,想知道当前主流模型在公开评测上的表现、以及各家官方 API 的模型清单和计费口径,可以到 站内模型与价格资料库页面 对照,但要记住:站内展示的数字是当时的快照,你自己的测试集结果才是做决策的依据。
什么情况下不用纠结划分
不是所有工作都需要切三份数据,硬切反而浪费时间。下面几种情况,先分清自己站在哪一边再动手。
| 你的场景 | 要不要划分 | 真正该做的事 |
|---|---|---|
| 直接调 API 或下载现成权重做推理 | 不用 | 把精力花在提示词、输入清洗和输出校验上 |
| 做 RAG 或提示词工程 | 换对象分 | 把问题集拆成『开发调试集』和『最终评测集』,思路一样,只是对象从样本变成问题 |
| 数据只有几十条 | 先别纠结比例 | 补数据优先,划分只是让评估看起来规范 |
| 做微调 | 必须留 | 验证集要和训练集同分布,否则指标没法用来做取舍 |
| 纯离线做数据探索 | 可以先不分 | 探索阶段目标是看懂数据,不是评估模型 |
如果团队里有人在用中转或第三方推理服务,评估口径还要多一层:服务本身稳不稳、响应速度波动大不大,都会影响你看到的『模型效果』。这类信誉和速度信息,到 站内中转站检测与速度测试页面 核对当时的数字,别用记忆里的旧结论。
把测试集当成一次性用品,你才敢相信它给出的结论。下一步如果你正卡在『验证集指标好看但上线就崩』,先按上面排查顺序走一遍;顺手到站内模型与价格资料库页面确认你用的模型版本和计费口径是否一致,避免评估结论和实际成本对不上。→
常见问题
验证集和测试集能不能用同一份?
临时图省事可以,但代价是最后那个数字不可信——你每次拿它调参,它就往验证集的方向偏一点。真要对外说效果,就得留一份从没参与过任何决策的数据。数据实在不够时,宁可承认结论是初步的,也别把调过的集子当测试集报数。
划分比例有没有标准答案?
没有,取决于数据总量和任务难度。数据多的时候测试集占比可以很小,绝对条数够用就行;数据少的时候更该考虑交叉验证而不是死抠比例。与其背比例,不如保证每份数据的绝对数量能支撑起结论,具体参考值可以到模型训练页面按任务类型比对。
怎么判断是不是数据泄露?
最快的办法是看指标是不是好得反常——比如准确率高得离谱、模型在真实场景却一塌糊涂。然后逐项排查:同一用户或同一设备的多条记录是否被随机打散到了训练和测试两边、标签是否被间接编进了特征、预处理(归一化、编码)是否在切分前就对全量数据做过。