机器学习建模:从线性模型到泛化诊断

在已有线性回归基础上,继续讲逻辑回归、sigmoid、决策边界、特征选择、L1 正则化、欠拟合、过拟合和训练数据分布。

机器学习建模:从线性模型到泛化诊断

上一篇 机器学习基础 已经从 y=wx+by=wx+b 出发,讲了线性回归、损失函数和梯度下降。这篇文章继续沿着这条路走。

我们先从一个简单问题开始:

如果模型不再预测房价、分数这类连续值,而是预测“是/否”,线性模型还能用吗?

这个问题会自然引出逻辑回归、sigmoid 和决策边界。接着我们再讨论:特征太多怎么办,模型在训练集上很好但测试集很差怎么办。

先回到线性回归

线性回归做的是连续值预测。

例如根据学习时间预测考试分数:

y^=wx+b\hat{y}=wx+b

如果 w=8,b=40w=8,b=40,学习 5 小时:

y^=8×5+40=80\hat{y}=8\times 5+40=80

这里的输出是 80 分,是一个连续值。

但很多任务不是预测连续值,而是判断类别:

  • 邮件是不是垃圾邮件。
  • 用户会不会流失。
  • 一张图片是不是猫。
  • 一个请求是不是恶意请求。

这时我们希望模型输出一个概率。

从线性得分到概率

我们仍然可以先算一个线性得分:

z=wTx+bz=w^Tx+b

但 zz 的范围是 (−∞,+∞)(-\infty,+\infty),不能直接当概率。概率必须在 0 到 1 之间。

所以我们需要一个函数,把任意实数压到 0 到 1。这个函数就是 sigmoid:

σ(z)=11+e−z\sigma(z)=\frac{1}{1+e^{-z}}

逻辑回归写作:

P(y=1∣x)=σ(wTx+b)P(y=1\mid x)=\sigma(w^Tx+b)

它的流程是:

输入特征 -> 线性得分 -> sigmoid -> 属于正类的概率

所以逻辑回归虽然名字里有“回归”,但常用于二分类。

一个垃圾邮件例子

假设我们只用两个特征判断邮件是否垃圾:

x1 = 是否包含“中奖”
x2 = 是否包含“点击链接”

模型学到:

z=2x1+3x2−2z=2x_1+3x_2-2

如果一封邮件两个词都包含:

z=2×1+3×1−2=3z=2\times 1+3\times 1-2=3

概率为:

σ(3)≈0.95\sigma(3)\approx 0.95

模型会认为它很可能是垃圾邮件。

如果两个词都不包含:

z=−2z=-2 σ(−2)≈0.12\sigma(-2)\approx 0.12

模型会认为它大概率不是垃圾邮件。

这个例子说明:逻辑回归并没有抛弃线性模型,而是在它外面包了一层概率解释。

决策边界

如果用 0.5 作为阈值:

P(y=1 | x) >= 0.5 -> 判为 1
P(y=1 | x) < 0.5  -> 判为 0

由于 σ(0)=0.5\sigma(0)=0.5,所以决策边界就是:

wTx+b=0w^Tx+b=0

二维特征下,这是一条直线;三维特征下,这是一个平面;更高维就是超平面。

因此逻辑回归的核心直觉是:

先用一条线或一个超平面切分空间,再把离边界的远近转换成概率。

为什么用交叉熵损失

线性回归常用均方误差。逻辑回归更常用交叉熵:

L=−[ylog⁡p^+(1−y)log⁡(1−p^)]L=-\left[y\log \hat{p}+(1-y)\log(1-\hat{p})\right]

其中 p^=P(y=1∣x)\hat{p}=P(y=1\mid x)。

如果真实标签 y=1y=1,损失变成:

L=−log⁡p^L=-\log \hat{p}

模型给真实类别的概率越低,损失越大。

如果真实标签 y=0y=0,损失变成:

L=−log⁡(1−p^)L=-\log(1-\hat{p})

这个形式和上一篇 概率统计基础 里的最大似然估计有关:训练分类模型时,我们希望模型给真实标签更高概率。

特征不是越多越好

到这里,我们已经知道模型如何从特征预测结果。但还有一个现实问题:

哪些特征应该放进模型?

例如做用户流失预测,可能有很多特征:

年龄
最近登录次数
最近消费金额
客服投诉次数
注册浏览器版本
昵称长度
手机壳颜色

不是每个特征都有用。有些特征和目标几乎无关,有些特征噪声很大,有些特征和其他特征重复。

特征选择的目的就是:

从原始特征里挑出更有用的一部分。

它可以降低噪声、防止过拟合、提高训练效率,也能让模型更容易解释。

Filter:先用统计指标筛一遍

Filter 方法不依赖具体模型,而是先用统计指标给特征打分。

常见指标包括:

  • 方差。
  • 相关系数。
  • 卡方检验。
  • 互信息。
  • ANOVA F-score。

例如某个特征在所有样本中几乎都是同一个值:

country = China

它对区分类别没有帮助,可以先过滤掉。

Filter 的优点是快,适合高维数据初筛;缺点是它通常只看单个特征,容易忽略特征组合。

Wrapper:用模型效果评价特征组合

Wrapper 方法把选特征当成搜索问题。

基本流程是:

选一组特征 -> 训练模型 -> 验证集评估 -> 换一组特征 -> 再比较

常见方法:

  • 前向选择。
  • 后向消除。
  • 递归特征消除 RFE。

它的优点是贴近模型最终效果;缺点是计算成本高。

Embedded:训练过程中顺便选特征

Embedded 方法把特征选择嵌入模型训练过程。

典型例子是 L1 正则化,也叫 Lasso。

普通训练只优化预测损失:

L(θ)L(\theta)

加入 L1 正则化后:

L(θ)+λ∑i∣wi∣L(\theta)+\lambda\sum_i |w_i|

这个额外项会惩罚权重绝对值之和。L1 的一个重要性质是容易把部分权重压到 0。

如果某个特征对应权重为 0,那么它对输出没有影响,相当于被模型丢掉。

所以 L1 正则化既能限制模型复杂度,也能产生稀疏特征选择效果。

模型真正追求的是泛化

学到这里,容易产生一个误解:

训练集准确率越高,模型越好。

这不对。机器学习真正追求的是在没见过的数据上也表现好,这叫泛化能力。

训练集上表现好,只说明模型能解释已经见过的数据;测试集或真实线上数据表现好,才说明它学到了一些稳定规律。

欠拟合:模型学不动

欠拟合通常是模型太简单,连训练集都学不好。

表现是:

  • 训练误差高。
  • 测试误差也高。
  • 换一批数据还是不行。

常见原因:

  • 特征不够。
  • 模型太简单。
  • 训练不充分。
  • 正则化太强。

一句话记:

欠拟合是模型表达能力不够,规律没学到。

过拟合:模型学过头

过拟合是模型把训练集里的噪声、偶然细节也记住了。

表现是:

  • 训练误差低。
  • 测试误差高。

你已有的 多项式回归 就是很好的例子:低阶模型可能欠拟合,高阶模型可能把训练点硬拟合得很好,但测试效果变差。

一句话记:

欠拟合是学不动,过拟合是学过头。

用误差判断问题

最实用的诊断方式是同时看训练误差和测试误差:

训练误差测试误差可能问题常见处理
高高欠拟合增加特征、换更强模型、减弱正则化
低高过拟合增加数据、加强正则化、做特征选择
低低泛化较好继续观察真实环境表现

这个表比单看准确率更有用。

训练数据分布也很重要

还有一种情况很常见:训练集和真实环境不是同一个分布。

例如风控模型主要用老用户数据训练,但上线后面对大量新用户。即使离线测试效果很好,线上也可能出问题。

这是因为模型学到的是训练数据里的规律。如果训练数据不代表真实世界,模型就会学偏。

需要关注:

  • 训练集是否覆盖真实场景。
  • 验证集是否按时间、人群、地区、设备切分。
  • 线上输入特征分布是否漂移。
  • 业务变化后是否需要重训。

和后续深度学习的关系

这篇文章里的问题,后面都会继续出现:

  • 逻辑回归里的 sigmoid,会扩展到神经网络里的激活函数。
  • 交叉熵损失,会扩展到多分类和语言模型训练。
  • 过拟合,会在 多项式回归 和深度网络中更明显。
  • 正则化,会扩展到 weight decay、dropout、early stopping。
  • 数据分布,会影响大模型微调和推理效果。

下一步可以读 浅谈神经网络原理,从线性模型进入多层非线性模型;再读 深度学习训练稳定性,理解深层网络为什么更难训练。

总结

这篇文章从线性模型继续往前走:

线性回归 -> 逻辑回归 -> 特征选择 -> 正则化 -> 欠拟合/过拟合 -> 数据分布

机器学习建模不是“选一个算法跑一下”。它要不断回答三个问题:

  1. 模型输出是否符合任务形式?
  2. 输入特征是否真的有用?
  3. 模型是否能泛化到新数据?

尺素

0 封尺素

正在取尺素...