数据集、泛化和过拟合
模型在训练集上表现好,并不等于上线可用。这一章沿着真实项目的顺序展开:先保证数据和标签可信,再正确拆分数据集,然后理解泛化与复杂度的关系,最后用正则化、早停和损失曲线把过拟合控制在可观察、可处理的范围内。
- 区分直接标签与代理标签,并说明人工生成数据的风险。
- 解释采样、过滤 PII 等转换为什么要在拆分之前定义。
- 说清训练、验证、测试集的分工,以及测试集为什么会被“磨损”。
- 处理类别不平衡数据:下采样、类别加权,并保持评估集真实分布。
- 用复杂度—损失曲线解释欠拟合与过拟合。
- 选择正则化率 λ、理解早停,并从四种问题损失曲线定位原因。
标签:直接标签、代理标签与人工生成的数据
一行数据是一个示例,列是候选特征或标签。模型能力的上限通常先被标签质量限制,而不是被算法名称限制。
1.1 直接标签与代理标签
直接标签就是模型真正要预测的结果,例如“用户是否拥有自行车”。它最贴合业务目标,但常常拿不到:没有现成字段、获取滞后、或涉及隐私。代理标签是相关但不完全相同的替代,例如“近期购买过骑行装备”。
代理标签并非禁止使用,但要承认它是近似:使用之前问三句——它和真实目标相关吗?偏差方向是什么?验证时如何确认没有把业务问题悄悄换掉?例如“买过骑行装备”的人更可能是运动爱好者,模型可能学会识别“运动人群”而不是“会骑车出行的人”。
1.2 人工生成的数据与标签质量
标签常来自人工标注或旧模型打分(详见「处理类别数据」模块第 5 节)。人工标注不是真相的代名词:不同人对“评论是否有毒”可能给出相反答案。抽样复核、多人标注与一致性检查能发现标准漂移;机器打分则要警惕旧模型偏差被固化。
| 风险 | 例子 | 应做什么 |
|---|---|---|
| 缺失 | 年龄未录入 | 删除或插补,并保留“是否缺失”指示特征 |
| 重复 | 同一日志上传两次 | 去重后再拆分数据,否则泄漏 |
| 错误值 | 温度多输一个 0 | 范围校验与抽样复核 |
| 错误标签 | 橡树被标为枫树 | 复标、一致性检查、修订标注规范 |
数据特征与转换数据
拿到原始数据后,先检查它的特征(这里指数据本身的性质:体量、分布、是否含隐私字段),再决定训练前要做哪些转换。
2.1 先看数据长什么样
要问的问题包括:数据量多大,单机能否处理?目标类别占比多少?有没有随时间变化的分布(季节性、改版影响)?哪些列包含个人身份信息?这些答案决定后面每一步:要不要采样、要不要分层、按什么切分。
2.2 采样:数据量过大时保留代表性子集
数百 GB 日志不必全部用于一次实验。随机采样可以大幅缩小数据,但要检查代表性:罕见却重要的类别(欺诈、故障)在采样后是否还剩足够样本。必要时用分层采样,保证各关键类别的比例不被随机性抹掉。
2.3 过滤个人身份信息(PII)
姓名、电话、身份证号等字段通常与预测目标无关,却带来隐私与合规风险。训练前应脱敏或整列移除。注意间接标识:精确到秒的时间戳加上地理位置,也可能重新识别出个人。
采样比例、随机种子、PII 过滤清单都应记录在案。否则下次重建数据集时无法复现同一份训练数据,模型效果的变化就说不清来自代码还是来自数据。
拆分原始数据集:训练、验证、测试
同一份数据不能既用来学习又用来打分。拆分的目的,是让“评估”尽量模拟模型面对真正新数据时的表现。
训练集学习参数
梯度下降直接在这里看特征和标签,学习权重和偏置。
验证集选择方案
反复比较特征、模型、学习率和正则强度;日常迭代看它。
测试集最后验收
方案定稿后才看一次,用于估计真实泛化能力。
3.1 比例只是起点,切分方式才是关键
70/15/15 之类的常见比例只是起点,没有适用于所有数据集的固定百分比。更重要的是切分方式:时间序列按时间切,用过去训练、用未来验证,不能让未来信息进入过去;同一用户、同一订单链条、同一设备的样本应整体进同一份数据,否则模型会“见过”验证样本的近邻。
3.2 泄漏:拆分最常见的失败方式
重复样本没去掉就拆分,同一事件同时出现在训练和验证集;或者先在全量数据上算归一化参数、再拆分——这些都让验证分数虚高。规则是:所有转换参数(均值、标准差、分箱边界、词汇表、插补规则)只在训练集上拟合,验证集、测试集和线上只应用。
样本太少时,固定的验证集和测试集不够稳定,可使用交叉验证:把数据轮流分份,每次用其中一份做验证、其余训练,最后取平均。测试集仍然只在最后使用一次。
测试集的其他问题与类别不平衡的数据集
拆分正确之后,还有两类问题会让评估骗人:测试集被反复使用而“磨损”,以及类别不平衡让指标失去意义。
4.1 测试集会被磨损
每次根据测试结果改特征或超参数,实际上都在把测试集的信息喂给开发过程。几十轮迭代之后,测试分数依然好看,但它已经不再是“没见过的新数据”——这就是测试集磨损。日常迭代放在验证集,测试集留到最后;如果测试集已经用了太多轮,应换一份新数据重新验收。
4.2 类别不平衡:准确率先失效
欺诈只占 1% 时,“全部预测正常”也有 99% 准确率,却没有业务价值。评估必须先换指标:精确率、召回率、PR 曲线和阈值成本(详见「分类」模块)。
4.3 训练不平衡数据的两步法
把 990:10 降到接近的比例(如 100:10),让梯度更新不再被多数类淹没。注意这会丢掉部分多数类信息。
给欺诈样本更高的损失权重(如 ×10),让“错一笔欺诈”的代价与“错多笔正常”相当。权重比例需要实验调整。
下采样与加权只能在训练集内进行;验证集和测试集必须保持线上真实比例,否则指标系统性失真。
下采样和加权改变的是模型看到的训练分布,不改变现实世界的类别比例。上线时输出的概率会整体偏高,如果业务需要真实概率(而不仅是排序),还要做概率校正。
泛化与模型复杂性
泛化指模型在没见过、但和目标场景相近的新样本上仍能工作;过拟合指模型学到了训练集的噪声、偶然规律或重复样本。这一对概念是全部评估工作的核心。
5.1 什么是模型复杂性?
复杂度不只是“参数多少”。它包括:模型容量(层数、每层节点数)、特征数量与精细程度(交叉特征、高阶多项式)、训练时长(迭代越多,越有机会记住细节),以及反面力量——正则化强度。所有这些共同决定模型“能记住多复杂的模式”。
5.2 损失与复杂度的 U 形关系
训练和验证都差
模型太简单、特征不足,或训练尚未收敛。
加正则化只会更糟两者都好且差距小
学到可复用的规律。
仍要关注线上分布漂移训练好,验证差
模型记住了训练集细节和噪声。
需要数据、约束或简化过拟合常来自:模型过于复杂、训练时间过长、特征过多而数据太少、标签噪声、或训练与验证分布不同。最重要的信号不是训练分数多高,而是训练与验证之间的差距。
数据变多,噪声模式更难被反复记住,偶然规律更难冒充真规律。在预算允许时,收集更多有代表性的数据通常比精巧地调模型更可靠——但它不能修复标签错误或分布偏移。
L2 正则化与正则化率
正则化是在训练目标里显式惩罚复杂度。L2 正则化是最常用的形式:让大权重付出代价,降低模型追逐偶然噪声的倾向。
6.1 L2 在做什么?
每次参数更新时,L2 项都把权重往 0 的方向拉一点。它不会像 L1 那样主动把某些权重精确变成 0,而是整体“收缩”权重:只有对降低数据损失真正有用的权重才能长得大,靠巧合服务个别样本的权重会被压回去。权重整体变小,模型对输入的敏感度更平滑,泛化通常更好。
6.2 正则化率 λ:过小、合适、过大
| λ 设置 | 权重表现 | 典型后果 |
|---|---|---|
| λ ≈ 0 | 自由生长,可以非常大 | 记住训练噪声 → 过拟合 |
| λ 合适 | 保留信号权重,压制巧合权重 | 验证损失最低 |
| λ 过大 | 全部被压向 0 | 模型近乎“躺平” → 欠拟合 |
6.3 选择 λ 的实操要点
λ 是超参数,用验证集选择:在候选值(如 0、0.001、0.01、0.1、1)上分别训练,取验证损失最低者。注意λ 与学习率相互影响:调大 λ 后,权重收缩速度变快,原来的学习率可能不再合适,两者常需要一起微调。另外,L2 通常只惩罚权重而不惩罚偏置——偏置不放大任何输入,不构成复杂度风险。
如果训练集和验证集分布不同、标签有系统性错误、或存在泄漏,λ 调到天荒地老也没用。先确认数据与切分干净,再谈正则化。
早停:基于复杂度的另一种正则化
训练时长也是复杂度。早停在验证损失不再改善时停止训练(或回滚到最佳轮次的参数),阻止模型继续记忆训练集。
7.1 是什么、为什么有效
训练前期,模型学的是普遍规律,训练和验证损失一起下降;到某个点之后,继续训练开始拟合细节和噪声,训练损失仍在降,验证损失却掉头上升。早停就是把训练停在“验证损失最低点”附近,等价于限制模型的有效容量。
7.2 什么时候用、怎么设
早停几乎总值得作为兜底策略,尤其是训练成本高、不确定该训多久的时候。常见做法是设置耐心值(patience):验证损失连续 N 轮没有改善才停止,避免被单轮波动误触发。注意“停止”应保存的是验证损失最低那一轮的参数,而不是最后一轮。
两者作用路径不同:L2 压缩权重大小,早停压缩训练时长,可以叠加。实践上常先用早停确定合理训练时长,再用验证集微调 λ;若两者都调不动验证损失,回到数据和特征层面找原因。
解读损失曲线
损失曲线是训练过程的“心电图”。横轴是训练步数或轮次,纵轴是损失;同时画出训练与验证两条线,形态本身就是诊断书。
8.1 健康曲线长什么样
理想形态:两条曲线都先陡降后平缓,最终贴近且差距小。训练损失略低于验证损失是正常的;差距持续拉大才需要警惕。
8.2 四种问题曲线与对应动作
| 你看到的曲线 | 常见解释 | 优先动作 |
|---|---|---|
| 损失持续振荡、不平稳 | 学习率过高,或批量太小导致梯度噪声大 | 降低学习率、增大批量 |
| 曲线出现急剧跳跃 | 某批数据异常、标注错误混入、管道故障 | 定位跳跃发生的步数,检查那批数据 |
| 训练降、验证升(分岔) | 典型过拟合,或验证集泄漏被修复后暴露 | 早停、加 L2、加数据、减小容量 |
| 两条曲线都卡住不动 | 学习率过低、梯度消失、特征没有信息量 | 提高学习率、检查缩放与特征质量 |
| 训练损失高但仍在降 | 尚未收敛或模型能力不足 | 继续训练、改特征或适度增大容量 |
8.3 测试损失与训练损失不一致
如果测试损失明显差于训练损失,先怀疑三件事:测试集与训练集分布不同(时间、渠道、人群变了)、拆分存在泄漏后被修复、或测试集太小导致波动。逐一排除后,才把它当作模型本身的泛化问题处理。
先确认数据与切分没有泄漏,再看训练/验证曲线形态区分欠拟合和过拟合,然后才针对症状选择更多数据、改特征、调容量、L2 正则化或早停。跳过前两步直接调参,多数时候是在治标。
本模块术语速查
- 示例
- 一行数据;由特征和标签组成。
- 直接标签
- 模型真正要预测的目标结果。
- 代理标签
- 相关但不等价的替代目标,使用前必须评估偏差。
- PII
- 个人身份信息,训练前通常脱敏或移除。
- 泛化
- 模型在新数据上的有效表现。
- 训练集
- 用于学习模型参数的数据。
- 验证集
- 用于反复选择方案和超参数的数据。
- 测试集
- 定稿后用于最终评估的数据;反复使用会“磨损”。
- 类别不平衡
- 各类样本比例悬殊;先换评估指标,再考虑下采样与加权。
- 过拟合
- 训练表现优异、面对新数据却变差。
- 模型复杂性
- 容量、特征、训练时长与正则化强度的综合。
- L2 正则化
- 在损失中加 λ×Σw²,把权重整体收缩以改善泛化。
- 正则化率 λ
- L2 惩罚强度,用验证集选择,与学习率相互影响。
- 早停
- 验证损失不再改善时停止训练并保留最佳轮次参数。