机器学习建模:从线性模型到泛化诊断
在已有线性回归基础上,继续讲逻辑回归、sigmoid、决策边界、特征选择、L1 正则化、欠拟合、过拟合和训练数据分布。
- AI
- 机器学习
机器学习建模:从线性模型到泛化诊断
上一篇 机器学习基础 已经从 出发,讲了线性回归、损失函数和梯度下降。这篇文章继续沿着这条路走。
我们先从一个简单问题开始:
如果模型不再预测房价、分数这类连续值,而是预测“是/否”,线性模型还能用吗?
这个问题会自然引出逻辑回归、sigmoid 和决策边界。接着我们再讨论:特征太多怎么办,模型在训练集上很好但测试集很差怎么办。
先回到线性回归
线性回归做的是连续值预测。
例如根据学习时间预测考试分数:
如果 ,学习 5 小时:
这里的输出是 80 分,是一个连续值。
但很多任务不是预测连续值,而是判断类别:
- 邮件是不是垃圾邮件。
- 用户会不会流失。
- 一张图片是不是猫。
- 一个请求是不是恶意请求。
这时我们希望模型输出一个概率。
从线性得分到概率
我们仍然可以先算一个线性得分:
但 的范围是 ,不能直接当概率。概率必须在 0 到 1 之间。
所以我们需要一个函数,把任意实数压到 0 到 1。这个函数就是 sigmoid:
逻辑回归写作:
它的流程是:
输入特征 -> 线性得分 -> sigmoid -> 属于正类的概率
所以逻辑回归虽然名字里有“回归”,但常用于二分类。
一个垃圾邮件例子
假设我们只用两个特征判断邮件是否垃圾:
x1 = 是否包含“中奖”
x2 = 是否包含“点击链接”
模型学到:
如果一封邮件两个词都包含:
概率为:
模型会认为它很可能是垃圾邮件。
如果两个词都不包含:
模型会认为它大概率不是垃圾邮件。
这个例子说明:逻辑回归并没有抛弃线性模型,而是在它外面包了一层概率解释。
决策边界
如果用 0.5 作为阈值:
P(y=1 | x) >= 0.5 -> 判为 1
P(y=1 | x) < 0.5 -> 判为 0
由于 ,所以决策边界就是:
二维特征下,这是一条直线;三维特征下,这是一个平面;更高维就是超平面。
因此逻辑回归的核心直觉是:
先用一条线或一个超平面切分空间,再把离边界的远近转换成概率。
为什么用交叉熵损失
线性回归常用均方误差。逻辑回归更常用交叉熵:
其中 。
如果真实标签 ,损失变成:
模型给真实类别的概率越低,损失越大。
如果真实标签 ,损失变成:
这个形式和上一篇 概率统计基础 里的最大似然估计有关:训练分类模型时,我们希望模型给真实标签更高概率。
特征不是越多越好
到这里,我们已经知道模型如何从特征预测结果。但还有一个现实问题:
哪些特征应该放进模型?
例如做用户流失预测,可能有很多特征:
年龄
最近登录次数
最近消费金额
客服投诉次数
注册浏览器版本
昵称长度
手机壳颜色
不是每个特征都有用。有些特征和目标几乎无关,有些特征噪声很大,有些特征和其他特征重复。
特征选择的目的就是:
从原始特征里挑出更有用的一部分。
它可以降低噪声、防止过拟合、提高训练效率,也能让模型更容易解释。
Filter:先用统计指标筛一遍
Filter 方法不依赖具体模型,而是先用统计指标给特征打分。
常见指标包括:
- 方差。
- 相关系数。
- 卡方检验。
- 互信息。
- ANOVA F-score。
例如某个特征在所有样本中几乎都是同一个值:
country = China
它对区分类别没有帮助,可以先过滤掉。
Filter 的优点是快,适合高维数据初筛;缺点是它通常只看单个特征,容易忽略特征组合。
Wrapper:用模型效果评价特征组合
Wrapper 方法把选特征当成搜索问题。
基本流程是:
选一组特征 -> 训练模型 -> 验证集评估 -> 换一组特征 -> 再比较
常见方法:
- 前向选择。
- 后向消除。
- 递归特征消除 RFE。
它的优点是贴近模型最终效果;缺点是计算成本高。
Embedded:训练过程中顺便选特征
Embedded 方法把特征选择嵌入模型训练过程。
典型例子是 L1 正则化,也叫 Lasso。
普通训练只优化预测损失:
加入 L1 正则化后:
这个额外项会惩罚权重绝对值之和。L1 的一个重要性质是容易把部分权重压到 0。
如果某个特征对应权重为 0,那么它对输出没有影响,相当于被模型丢掉。
所以 L1 正则化既能限制模型复杂度,也能产生稀疏特征选择效果。
模型真正追求的是泛化
学到这里,容易产生一个误解:
训练集准确率越高,模型越好。
这不对。机器学习真正追求的是在没见过的数据上也表现好,这叫泛化能力。
训练集上表现好,只说明模型能解释已经见过的数据;测试集或真实线上数据表现好,才说明它学到了一些稳定规律。
欠拟合:模型学不动
欠拟合通常是模型太简单,连训练集都学不好。
表现是:
- 训练误差高。
- 测试误差也高。
- 换一批数据还是不行。
常见原因:
- 特征不够。
- 模型太简单。
- 训练不充分。
- 正则化太强。
一句话记:
欠拟合是模型表达能力不够,规律没学到。
过拟合:模型学过头
过拟合是模型把训练集里的噪声、偶然细节也记住了。
表现是:
- 训练误差低。
- 测试误差高。
你已有的 多项式回归 就是很好的例子:低阶模型可能欠拟合,高阶模型可能把训练点硬拟合得很好,但测试效果变差。
一句话记:
欠拟合是学不动,过拟合是学过头。
用误差判断问题
最实用的诊断方式是同时看训练误差和测试误差:
| 训练误差 | 测试误差 | 可能问题 | 常见处理 |
|---|---|---|---|
| 高 | 高 | 欠拟合 | 增加特征、换更强模型、减弱正则化 |
| 低 | 高 | 过拟合 | 增加数据、加强正则化、做特征选择 |
| 低 | 低 | 泛化较好 | 继续观察真实环境表现 |
这个表比单看准确率更有用。
训练数据分布也很重要
还有一种情况很常见:训练集和真实环境不是同一个分布。
例如风控模型主要用老用户数据训练,但上线后面对大量新用户。即使离线测试效果很好,线上也可能出问题。
这是因为模型学到的是训练数据里的规律。如果训练数据不代表真实世界,模型就会学偏。
需要关注:
- 训练集是否覆盖真实场景。
- 验证集是否按时间、人群、地区、设备切分。
- 线上输入特征分布是否漂移。
- 业务变化后是否需要重训。
和后续深度学习的关系
这篇文章里的问题,后面都会继续出现:
- 逻辑回归里的 sigmoid,会扩展到神经网络里的激活函数。
- 交叉熵损失,会扩展到多分类和语言模型训练。
- 过拟合,会在 多项式回归 和深度网络中更明显。
- 正则化,会扩展到 weight decay、dropout、early stopping。
- 数据分布,会影响大模型微调和推理效果。
下一步可以读 浅谈神经网络原理,从线性模型进入多层非线性模型;再读 深度学习训练稳定性,理解深层网络为什么更难训练。
总结
这篇文章从线性模型继续往前走:
线性回归 -> 逻辑回归 -> 特征选择 -> 正则化 -> 欠拟合/过拟合 -> 数据分布
机器学习建模不是“选一个算法跑一下”。它要不断回答三个问题:
- 模型输出是否符合任务形式?
- 输入特征是否真的有用?
- 模型是否能泛化到新数据?
尺素
0 封尺素
正在取尺素...