数据 · 判断模型能否面对新数据

数据集、泛化和过拟合

模型在训练集上表现好,并不等于上线可用。这一章沿着真实项目的顺序展开:先保证数据和标签可信,再正确拆分数据集,然后理解泛化与复杂度的关系,最后用正则化、早停和损失曲线把过拟合控制在可观察、可处理的范围内。

1 小时 26 分钟纯学习时间8 个连续小节无测试与互动练习
原始数据标签、质量、分布
→
三份数据训练 / 验证 / 测试
→
复杂度泛化与过拟合
→
控制正则化、早停、读曲线
学完后,你能够
  • 区分直接标签与代理标签,并说明人工生成数据的风险。
  • 解释采样、过滤 PII 等转换为什么要在拆分之前定义。
  • 说清训练、验证、测试集的分工,以及测试集为什么会被“磨损”。
  • 处理类别不平衡数据:下采样、类别加权,并保持评估集真实分布。
  • 用复杂度—损失曲线解释欠拟合与过拟合。
  • 选择正则化率 λ、理解早停,并从四种问题损失曲线定位原因。
01
预计 10 分钟

标签:直接标签、代理标签与人工生成的数据

一行数据是一个示例,列是候选特征或标签。模型能力的上限通常先被标签质量限制,而不是被算法名称限制。

1.1 直接标签与代理标签

直接标签就是模型真正要预测的结果,例如“用户是否拥有自行车”。它最贴合业务目标,但常常拿不到:没有现成字段、获取滞后、或涉及隐私。代理标签是相关但不完全相同的替代,例如“近期购买过骑行装备”。

业务问题分别对应直接标签和代理标签
图 1:代理标签容易获得,但模型学到的其实是另一个问题。

代理标签并非禁止使用,但要承认它是近似:使用之前问三句——它和真实目标相关吗?偏差方向是什么?验证时如何确认没有把业务问题悄悄换掉?例如“买过骑行装备”的人更可能是运动爱好者,模型可能学会识别“运动人群”而不是“会骑车出行的人”。

1.2 人工生成的数据与标签质量

标签常来自人工标注或旧模型打分(详见「处理类别数据」模块第 5 节)。人工标注不是真相的代名词:不同人对“评论是否有毒”可能给出相反答案。抽样复核、多人标注与一致性检查能发现标准漂移;机器打分则要警惕旧模型偏差被固化。

风险例子应做什么
缺失年龄未录入删除或插补,并保留“是否缺失”指示特征
重复同一日志上传两次去重后再拆分数据,否则泄漏
错误值温度多输一个 0范围校验与抽样复核
错误标签橡树被标为枫树复标、一致性检查、修订标注规范
02
预计 10 分钟

数据特征与转换数据

拿到原始数据后,先检查它的特征(这里指数据本身的性质:体量、分布、是否含隐私字段),再决定训练前要做哪些转换。

2.1 先看数据长什么样

要问的问题包括:数据量多大,单机能否处理?目标类别占比多少?有没有随时间变化的分布(季节性、改版影响)?哪些列包含个人身份信息?这些答案决定后面每一步:要不要采样、要不要分层、按什么切分。

2.2 采样:数据量过大时保留代表性子集

数百 GB 日志不必全部用于一次实验。随机采样可以大幅缩小数据,但要检查代表性:罕见却重要的类别(欺诈、故障)在采样后是否还剩足够样本。必要时用分层采样,保证各关键类别的比例不被随机性抹掉。

2.3 过滤个人身份信息(PII)

姓名、电话、身份证号等字段通常与预测目标无关,却带来隐私与合规风险。训练前应脱敏或整列移除。注意间接标识:精确到秒的时间戳加上地理位置,也可能重新识别出个人。

原始日志经过采样和过滤个人身份信息成为可训练数据集
图 2:采样与过滤都应在拆分数据集之前定义清楚,并且规则可复现。
转换规则要版本化

采样比例、随机种子、PII 过滤清单都应记录在案。否则下次重建数据集时无法复现同一份训练数据,模型效果的变化就说不清来自代码还是来自数据。

03
预计 12 分钟

拆分原始数据集:训练、验证、测试

同一份数据不能既用来学习又用来打分。拆分的目的,是让“评估”尽量模拟模型面对真正新数据时的表现。

训练集

学习参数

梯度下降直接在这里看特征和标签,学习权重和偏置。

验证集

选择方案

反复比较特征、模型、学习率和正则强度;日常迭代看它。

测试集

最后验收

方案定稿后才看一次,用于估计真实泛化能力。

训练集用于学习,验证集用于选择方案,测试集用于最终验收
图 3:三份数据职责不同;反复看测试集会让最终评估失真。

3.1 比例只是起点,切分方式才是关键

70/15/15 之类的常见比例只是起点,没有适用于所有数据集的固定百分比。更重要的是切分方式:时间序列按时间切,用过去训练、用未来验证,不能让未来信息进入过去;同一用户、同一订单链条、同一设备的样本应整体进同一份数据,否则模型会“见过”验证样本的近邻。

3.2 泄漏:拆分最常见的失败方式

重复样本没去掉就拆分,同一事件同时出现在训练和验证集;或者先在全量数据上算归一化参数、再拆分——这些都让验证分数虚高。规则是:所有转换参数(均值、标准差、分箱边界、词汇表、插补规则)只在训练集上拟合,验证集、测试集和线上只应用。

小数据集怎么办?

样本太少时,固定的验证集和测试集不够稳定,可使用交叉验证:把数据轮流分份,每次用其中一份做验证、其余训练,最后取平均。测试集仍然只在最后使用一次。

04
预计 12 分钟

测试集的其他问题与类别不平衡的数据集

拆分正确之后,还有两类问题会让评估骗人:测试集被反复使用而“磨损”,以及类别不平衡让指标失去意义。

4.1 测试集会被磨损

每次根据测试结果改特征或超参数,实际上都在把测试集的信息喂给开发过程。几十轮迭代之后,测试分数依然好看,但它已经不再是“没见过的新数据”——这就是测试集磨损。日常迭代放在验证集,测试集留到最后;如果测试集已经用了太多轮,应换一份新数据重新验收。

4.2 类别不平衡:准确率先失效

欺诈只占 1% 时,“全部预测正常”也有 99% 准确率,却没有业务价值。评估必须先换指标:精确率、召回率、PR 曲线和阈值成本(详见「分类」模块)。

4.3 训练不平衡数据的两步法

对多数类下采样并提高少数类权重
图 4:先下采样多数类让少数类被看见,再加权让它在损失中有分量。
  • 01
    对多数类下采样

    把 990:10 降到接近的比例(如 100:10),让梯度更新不再被多数类淹没。注意这会丢掉部分多数类信息。

  • 02
    增加少数类权重

    给欺诈样本更高的损失权重(如 ×10),让“错一笔欺诈”的代价与“错多笔正常”相当。权重比例需要实验调整。

  • 03
    评估集保持真实分布

    下采样与加权只能在训练集内进行;验证集和测试集必须保持线上真实比例,否则指标系统性失真。

  • 不要指望“平衡”解决一切

    下采样和加权改变的是模型看到的训练分布,不改变现实世界的类别比例。上线时输出的概率会整体偏高,如果业务需要真实概率(而不仅是排序),还要做概率校正。

    05
    预计 12 分钟

    泛化与模型复杂性

    泛化指模型在没见过、但和目标场景相近的新样本上仍能工作;过拟合指模型学到了训练集的噪声、偶然规律或重复样本。这一对概念是全部评估工作的核心。

    5.1 什么是模型复杂性?

    复杂度不只是“参数多少”。它包括:模型容量(层数、每层节点数)、特征数量与精细程度(交叉特征、高阶多项式)、训练时长(迭代越多,越有机会记住细节),以及反面力量——正则化强度。所有这些共同决定模型“能记住多复杂的模式”。

    5.2 损失与复杂度的 U 形关系

    训练损失随复杂度下降而验证损失先降后升
    图 5:训练损失几乎总随复杂度下降;验证损失在最佳复杂度处最低,之后回升。
    欠拟合

    训练和验证都差

    模型太简单、特征不足,或训练尚未收敛。

    加正则化只会更糟
    合适

    两者都好且差距小

    学到可复用的规律。

    仍要关注线上分布漂移
    过拟合

    训练好,验证差

    模型记住了训练集细节和噪声。

    需要数据、约束或简化

    过拟合常来自:模型过于复杂、训练时间过长、特征过多而数据太少、标签噪声、或训练与验证分布不同。最重要的信号不是训练分数多高,而是训练与验证之间的差距。

    为什么“更多数据”常常是首选?

    数据变多,噪声模式更难被反复记住,偶然规律更难冒充真规律。在预算允许时,收集更多有代表性的数据通常比精巧地调模型更可靠——但它不能修复标签错误或分布偏移。

    06
    预计 12 分钟

    L2 正则化与正则化率

    正则化是在训练目标里显式惩罚复杂度。L2 正则化是最常用的形式:让大权重付出代价,降低模型追逐偶然噪声的倾向。

    总损失 = 数据损失 + λ × Σwᵢ²

    6.1 L2 在做什么?

    每次参数更新时,L2 项都把权重往 0 的方向拉一点。它不会像 L1 那样主动把某些权重精确变成 0,而是整体“收缩”权重:只有对降低数据损失真正有用的权重才能长得大,靠巧合服务个别样本的权重会被压回去。权重整体变小,模型对输入的敏感度更平滑,泛化通常更好。

    6.2 正则化率 λ:过小、合适、过大

    lambda 过小合适过大时权重大小的对比
    图 6:λ 太小约束不足,太大把真实信号也压掉;合适值由验证集决定。
    λ 设置权重表现典型后果
    λ ≈ 0自由生长,可以非常大记住训练噪声 → 过拟合
    λ 合适保留信号权重,压制巧合权重验证损失最低
    λ 过大全部被压向 0模型近乎“躺平” → 欠拟合

    6.3 选择 λ 的实操要点

    λ 是超参数,用验证集选择:在候选值(如 0、0.001、0.01、0.1、1)上分别训练,取验证损失最低者。注意λ 与学习率相互影响:调大 λ 后,权重收缩速度变快,原来的学习率可能不再合适,两者常需要一起微调。另外,L2 通常只惩罚权重而不惩罚偏置——偏置不放大任何输入,不构成复杂度风险。

    正则化不能修复数据问题

    如果训练集和验证集分布不同、标签有系统性错误、或存在泄漏,λ 调到天荒地老也没用。先确认数据与切分干净,再谈正则化。

    07
    预计 6 分钟

    早停:基于复杂度的另一种正则化

    训练时长也是复杂度。早停在验证损失不再改善时停止训练(或回滚到最佳轮次的参数),阻止模型继续记忆训练集。

    7.1 是什么、为什么有效

    训练前期,模型学的是普遍规律,训练和验证损失一起下降;到某个点之后,继续训练开始拟合细节和噪声,训练损失仍在降,验证损失却掉头上升。早停就是把训练停在“验证损失最低点”附近,等价于限制模型的有效容量。

    7.2 什么时候用、怎么设

    早停几乎总值得作为兜底策略,尤其是训练成本高、不确定该训多久的时候。常见做法是设置耐心值(patience):验证损失连续 N 轮没有改善才停止,避免被单轮波动误触发。注意“停止”应保存的是验证损失最低那一轮的参数,而不是最后一轮。

    早停 vs L2:一起用还是二选一?

    两者作用路径不同:L2 压缩权重大小,早停压缩训练时长,可以叠加。实践上常先用早停确定合理训练时长,再用验证集微调 λ;若两者都调不动验证损失,回到数据和特征层面找原因。

    08
    预计 12 分钟

    解读损失曲线

    损失曲线是训练过程的“心电图”。横轴是训练步数或轮次,纵轴是损失;同时画出训练与验证两条线,形态本身就是诊断书。

    8.1 健康曲线长什么样

    欠拟合、合适和过拟合时训练损失与验证损失曲线的区别
    图 7:健康训练的损失先快速下降再趋平;训练与验证曲线差距小且稳定。

    理想形态:两条曲线都先陡降后平缓,最终贴近且差距小。训练损失略低于验证损失是正常的;差距持续拉大才需要警惕。

    8.2 四种问题曲线与对应动作

    振荡、急剧跳跃、训练验证分岔和卡住不动四种问题损失曲线
    图 8:每种异常形态都指向一组具体嫌疑,按图排查比盲目调参快得多。
    你看到的曲线常见解释优先动作
    损失持续振荡、不平稳学习率过高,或批量太小导致梯度噪声大降低学习率、增大批量
    曲线出现急剧跳跃某批数据异常、标注错误混入、管道故障定位跳跃发生的步数,检查那批数据
    训练降、验证升(分岔)典型过拟合,或验证集泄漏被修复后暴露早停、加 L2、加数据、减小容量
    两条曲线都卡住不动学习率过低、梯度消失、特征没有信息量提高学习率、检查缩放与特征质量
    训练损失高但仍在降尚未收敛或模型能力不足继续训练、改特征或适度增大容量

    8.3 测试损失与训练损失不一致

    如果测试损失明显差于训练损失,先怀疑三件事:测试集与训练集分布不同(时间、渠道、人群变了)、拆分存在泄漏后被修复、或测试集太小导致波动。逐一排除后,才把它当作模型本身的泛化问题处理。

    实际排查顺序

    先确认数据与切分没有泄漏,再看训练/验证曲线形态区分欠拟合和过拟合,然后才针对症状选择更多数据、改特征、调容量、L2 正则化或早停。跳过前两步直接调参,多数时候是在治标。

    本模块术语速查

    示例
    一行数据;由特征和标签组成。
    直接标签
    模型真正要预测的目标结果。
    代理标签
    相关但不等价的替代目标,使用前必须评估偏差。
    PII
    个人身份信息,训练前通常脱敏或移除。
    泛化
    模型在新数据上的有效表现。
    训练集
    用于学习模型参数的数据。
    验证集
    用于反复选择方案和超参数的数据。
    测试集
    定稿后用于最终评估的数据;反复使用会“磨损”。
    类别不平衡
    各类样本比例悬殊;先换评估指标,再考虑下采样与加权。
    过拟合
    训练表现优异、面对新数据却变差。
    模型复杂性
    容量、特征、训练时长与正则化强度的综合。
    L2 正则化
    在损失中加 λ×Σw²,把权重整体收缩以改善泛化。
    正则化率 λ
    L2 惩罚强度,用验证集选择,与学习率相互影响。
    早停
    验证损失不再改善时停止训练并保留最佳轮次参数。
    参考资料与素材说明

    内容依据 Google ML Crash Course 的数据集、泛化和过拟合、标签、数据特征、转换数据、拆分原始数据集、类别不平衡的数据集、模型复杂性、L2 正则化和解读损失曲线小节的知识结构重新组织并扩写,正文与配图均为本项目原创。