自己拿数据微调或训练模型时,最常见的翻车不是模型不行,而是数据切错了:测试集混进了训练样本,或者反复拿测试集调参,最后线下指标很好看、上线就崩。这篇不讲原理推导,只给一套能照着做的切分流程、比例对照和自查清单,帮你把三类数据集的边界划清楚。
自己拿数据微调或训练模型时,最常见的翻车不是模型不行,而是数据切错了。测试集混进了训练样本,或者反复拿测试集调参,最后线下指标很好看、上线就崩。这篇不讲原理推导,只给一套能照着做的切分流程、比例对照和自查清单。
先把一句话记住:你根据哪个指标改了做法,那个指标所在的数据集就已经被污染,不能再当作最终成绩。下面按「各自负责什么、先切哪一刀、坑在哪、怎么落地」的顺序往下走。
三类数据集各自负责什么
- 训练集
- 模型真正用来学参数的数据,样本越多、覆盖面越广,学到的规律通常越稳
- 验证集
- 不参与参数更新,只用来做选择:挑超参、挑早停轮次、挑特征或提示词版本,是可以反复看的练习题答案
- 测试集
- 只在最后用一次,用来估计上线后的真实表现;一旦拿它调过参数,它就退化成了验证集
判断口径很简单:如果你根据某个指标的反馈改了做法,那个指标所在的数据集就已经被污染。很多人嘴上说「测试集只在最后看」,实际操作里是「每跑一版都顺手看一眼测试集」,看一眼改一版,跑了几十轮之后这个测试集和训练集已经没有区别,报出来的成绩自然虚高。
- 验证集可以反复看、反复比,看多少轮都不算作弊
- 测试集的使用次数一次为限,看过就得封存
- 如果发现测试集已经被用来决策,那它现在的身份是第二份验证集,最终成绩需要新的未见过数据
- 任何预处理步骤的统计量(均值、方差、词表、分箱边界)都只能来自训练集
切分顺序与比例:先切哪一刀
固定顺序是先留测试集、再切验证集。先切出一块完全不碰的测试集封存起来,再从剩下的数据里分验证集。这个顺序不能反,否则预处理流程很容易把测试集的信息带进训练,切分的意义就没了。
比例按数据量分档来定:数据量越小,验证与测试的占比要留得越足,因为小样本下指标波动大,留太少会选出偶然表现好的方案;数据量很大时,验证与测试可以适当压缩占比。具体怎么分档去 站内训练与微调页面(/training) 核对当时的说明和口径,别照搬别人的固定数字。
| 数据情况 | 切分要点 | 不适合的做法 |
|---|---|---|
| 样本总量偏少 | 验证与测试占比留足,优先保评估稳定性 | 为了多训练一点而把验证测试压到极小 |
| 样本量充足 | 验证与测试可适当压缩,训练集占比提高 | 仍按小数据的老比例切,浪费算力 |
| 类别不平衡 | 分层切分,保证三类集合里各类占比接近 | 纯随机切分,导致某类在验证集里缺席 |
| 时间序列 | 按时间先后切,训练在前、验证居中、测试最后 | 随机打乱,让模型看到未来信息 |
| 同人多条记录 | 按人/文档整体切分,不要按行切 | 按行随机切,同一人的样本散落在两边 |
还有一条容易被忽略:切分必须在任何预处理之前完成。归一化、去重、填充、分词这些步骤,统计量先从训练集算出来,再套用到验证集和测试集。顺序错了,后面再怎么补救都是补窟窿。
最容易踩的四个泄漏坑
下面四个坑按「出现频率从高到低」排,排查时按这个顺序过一遍,能拦住大部分问题。它们共同的特征是:切分看起来做了,但信息其实已经跨集合流动了。
- 同源样本跨集合:同一份文档切出的多个片段、同一次会话的多条记录、同一个人的多条样本,被分到训练和测试两边,等于开卷考试
- 近重复与模板文本:只按字符串精确去重不够,近似重复要用相似度或向量比对再清一遍,否则测试集里全是训练集的近亲
- 用全局统计做预处理:在全量数据上算均值方差、词表、编码器再切分,训练集就带上了测试集的信息
- 反复用测试集迭代:先看测试集结果、再回去改模型,改了几轮之后测试集已经失效,此时要重新留一份从未看过的数据
近重复最隐蔽。同一份报告的不同版本、同一商品的多个描述模板、同一问题不同措辞,字符串比对往往判定为「不同」,模型却一眼就认出是同一个。数据量不大时,建议人工抽查一批测试样本,感觉一下它们是不是「太眼熟」。
一套可照做的流程与自查清单
下面这套流程按顺序执行,每一步都有可验证的动作。切分粒度选错是泄漏的主因,所以第一步先想清楚切的是什么单位——一条记录、一个用户,还是一整份文档。
- 定评估目标与样本粒度先确定最终要估计什么表现,再决定切分单位是整条记录还是整个用户/文档。粒度选错,后面所有去重都是白做。
- 先去重、再切分、后预处理把精确重复和近似重复清掉,然后才切分;切分完成后再做预处理,且所有统计量只从训练集出发。
- 训练集训练、验证集选型训练集跑训练,验证集用来挑超参、挑早停轮次、挑特征版本,逐轮记录验证表现,选验证最好的一版。
- 测试集只跑一次并封存把最终方案在测试集上跑一次并记录结果,之后不再根据这个数字做任何调整;需要继续调,就重新切一份新的测试集。
- 留下可复现记录固定随机种子,把切分脚本、去重规则、预处理参数一起存档,保证别人能复现出同样的三个集合。
自查清单可以压缩成四个问题:三个集合有没有交集;预处理统计量来自哪一份数据;测试集被看过几次;切分能不能复现。这四个问题都能干净回答,切分就算合格。
如果你不确定自己的指标算不算「已经被看过」,可以对着 站内评测与基准页面(/benchmarks) 的公开评测口径,看看正规评测是怎么隔离数据、怎么防止泄漏的,再回头对照自己的流程。
数据太少时怎么办:交叉验证与不适用场景
样本量不足以切出稳定的验证集时,用 K 折交叉验证:把可用于训练的部分轮流当验证,取多轮平均,能降低单次切分的运气成分。代价是训练次数变多,算力不高时要权衡。
| 场景 | 推荐切法 | 原因 |
|---|---|---|
| 样本量偏小 | K 折交叉验证,取多轮平均 | 单次切分波动大,平均值更稳 |
| 类别不平衡 | 分层 K 折 | 保证每折里各类占比接近总体 |
| 时间序列 | 按时间滚动的切分 | 避免用未来信息预测过去 |
| 纯提示词工程 | 固定用例集 + 回归对比 | 不改模型参数,不需要训练集 |
| 总量极少的样本 | 先补数据,别急着调比例 | 任何划分出来的指标都不可信 |
什么情况下这套切分流程不适用?做纯提示词工程、不改模型参数时,其实不需要训练集,需要的是固定用例集加回归对比,可以看站内关于提示词版本回归的做法。什么情况下别硬切?总量只有几十条样本时,任何划分的指标都不可信,此时更该做的是补数据,而不是反复调比例。
切分不是把数据分成三堆,而是把「能看的信息」和「不能看的信息」分开管理。下一步把自己的切分脚本和去重规则过一遍,重点确认测试集有没有被封存;需要参考公开评测的防泄漏口径和数据划分说明,可以到站内对应页面核对当时的做法与数字。→
常见问题
验证集和测试集到底有什么区别?
验证集是给你调参用的,可以反复看、反复比;测试集是给最终成绩用的,正常情况下只看一次。如果你根据测试集的分数回头改了模型或参数,它实质上就变成了验证集,需要重新划一份没碰过的数据当测试集。
三个集合按什么比例分比较稳?
没有通用数字,取决于总样本量:样本越少,验证和测试的占比越要留足,否则指标波动大得没法判断。具体到你的数据规模该分多少,建议先按总量分档试切一次,看指标波动是否可接受,再决定最终比例。
为什么线下评测很好,上线就掉得很厉害?
常见原因是数据泄漏或分布不一致:同一来源的样本被分到了训练和测试两边、预处理用了全量统计,或者线上真实输入的分布跟你的数据集差很远。排查顺序是先查集合是否有交集和近重复,再对比线上输入与训练数据的分布差异。