📑 本页目录(点开跳转)
03 / 线性模型 · 从一个预测开始
先分清预测什么,
再看公式怎么做。
预测房价是一个数;判断是否违约,先得到一个概率。两者都从加权求和出发。
你先带走这句就够了
先预测,再衡量差多少,
最后调整权重。
下面的蓝色下划线可以点开:解释的是它在当前公式里的作用。
- 1把特征组合起来
权重决定方向和力度,偏置调整起点。
- 2看预测与答案的差距
用与任务相配的损失衡量。
- 3让下一次预测更好
训练调整参数;验证集检查是否学偏。
01 / 数值预测
线性回归:加权求和
例如只有“面积”一个输入:权重 0.8、面积 100、偏置 20,模型预测 100(示意单位)。
负权重表示:其他输入不变,这一项增加会让预测降低。它不是因果证明。
02 / 二分类
逻辑回归:分数转成概率
Sigmoid 把分数压进 0 到 1。分数是 0 时,预测概率为 0.5;分数是 2 时,约为 0.881。
概率还不是类别。是否判为正类,要另外选择阈值;0.5 只是常见起点。
03 / 先算一次,再记名字
MSE:把每次预测的误差平方,再取平均
误差平方:(3 − 2)² = 1
误差平方:(5 − 7)² = 4
平均误差是 (1 + 4) / 2 = 2.5。这是回归示例;二分类通常用后文的交叉熵。
可以停在这里
能分清“数值”和“概率”,能用两个样本算出 MSE,就完成了这次的小目标。
继续看图解、交叉熵和标准化 →L1/L2 与实验保留在正文的“第二遍实战”里,需要时再展开。
原有正文、图解和例子都在下方。按需跳转,不必一次读完。
03 · 线性模型:一切的起点
⏱ 26 分钟 | ⭐ 核心 | 🔨 有代码
🎯 一句话
线性模型就是 y = w₁x₁ + w₂x₂ + ... + b ——给每个特征配一个权重,加起来。
简单到不像个「AI」,但神经网络的许多层都包含这样的加权求和,再接非线性等运算,所以值得理解。
第一遍只走主线:线性回归 → 逻辑回归 → 标准化 → 能力边界。
第二遍再打开实战:正则化、C 的调参实验和 L1 特征选择。先会分清“预测数值”和“预测概率”,已经完成最重要的一半。
📈 一、线性回归:预测一个数
| 看什么 | 它告诉你什么 | 这个例子 |
|---|---|---|
| 权重是正还是负 | 特征变大时,预测值朝哪个方向变 | 面积、地段分越高,房价越高;楼龄越大,房价越低 |
| 权重绝对值 | 影响力度的大小 | 只有在特征已经标准化时,才适合横向比较谁更“重要” |
偏置 b |
所有特征为 0 时的基础起点 | 这里是 20;它不是某个特征的权重 |
💡 不要把权重当成因果结论。 “楼龄权重为负”表示在这个模型里、其他特征不变时,楼龄增加会让预测房价降低;这是模型中的反向关系,不等于楼龄本身单独造成房价下降。 损失函数(第 2 章三要素之二)—— 均方误差 MSE:
$$\mathcal{L} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$$
💡 人话:每个样本预测差多少,平方后取平均。平方的作用是让大误差被重罚,且处处可导(方便求梯度)。
🎯 二、逻辑回归:预测一个概率
问题:分类要输出 0~1 的概率,但线性输出是任意实数。
解法:外面套一个 Sigmoid 把它压进 0~1:
$$\hat{p} = \sigma(w^\top x + b), \quad \sigma(z) = \frac{1}{1+e^{-z}}$$
损失函数 —— 交叉熵(不是 MSE!):
$$\mathcal{L} = -\frac{1}{n}\sum \left[ y\log\hat{p} + (1-y)\log(1-\hat{p}) \right]$$
💡 人话:真实是 1,模型说 0.9 → 罚得轻;说 0.01 → 罚到飞起。 它专门重罚「很自信但错了」的预测。
⚠️ 为什么二分类通常优先用交叉熵:Sigmoid 配 MSE 时,自信但错误的饱和预测可能得到很小的梯度,纠错变慢;并不是分类绝对不能用 MSE。 单样本二元交叉熵对 Sigmoid 前的分数 z 求导,结果是
(预测概率 − 真实标签);按 n 个样本取平均时还要除以 n。这不保证深层网络的所有梯度都不会消失。⭐ 既然是经典考点,它多半会以「写一下」而不是「说一下」的形式出现: 🔗 附录 C 第 10 题把这句话写成了 10 行纯 numpy 的逻辑回归(在 breast_cancer 上跑到 98.2%, sklearn 是 98.8%),第 1 题是它的多分类版本—— softmax + 交叉熵的反向就是 $p-\text{onehot}(y)$,和这里的
(预测 − 真实)是同一件事。 那边还回答了两个这里没展开的追问:为什么逻辑回归可以零初始化而神经网络不行、为什么偏置不加 L2。🔗 重要连接:逻辑回归 = 一层神经网络 + Sigmoid。 你在推荐算法第 8 章见的所有深度模型,最后一层都是它。
🧪 第二遍实战:正则化怎么防过拟合
展开:L1、L2、C 的方向,以及一组真实实验
第 1 章你看到过拟合了。线性模型怎么防?别让权重太大。
$$\mathcal{L}_{L2} = \text{原损失} + \lambda\sum_i w_i^2$$
L2 用平方惩罚大权重;L1 换成绝对值惩罚:
$$\mathcal{L}_{L1} = \text{原损失} + \lambda\sum_i |w_i|$$
λ 小 → 正则弱 → 更容易过拟合;λ 大 → 正则强 → 更容易欠拟合。
本页代码库用的是
C = 1 / λ,所以方向正好相反:C 小 → 正则强;C 大 → 正则弱。| 类型 | 惩罚项 | 效果 | 什么时候用 |
|---|---|---|---|
| L2 / Ridge | $\lambda\sum w_i^2$ | 通常整体收缩权重,不以制造恰好为 0 的系数为特点 | 常用起点,再用验证集比较 |
| L1 / Lasso | $\lambda\sum |w_i|$ | 一部分权重变成 0 → 自动特征选择 | 特征多且怀疑很多没用 |
| ElasticNet | 两者混合 | 兼顾 | 特征多且相关性强 |
💡 为什么限制权重能防过拟合:
权重特别大 = 模型对某个特征极度敏感 = 输入稍微变一点输出就剧变 = 它在拟合噪声。 让权重都小一点,模型就"稳重"了。
🎚️ λ 怎么调:
| λ 的状态 | 模型发生什么 | 你会看到的结果 |
|---|---|---|
| 太小 | 对大权重几乎没有约束 | 训练集很好,测试集变差:过拟合 |
| 太大 | 有用的权重也被压得过小 | 训练集和测试集都差:欠拟合 |
| 合适 | 允许模型学习,但不鼓励靠极端权重硬记 | 用验证集或交叉验证选择 |
不要死背一个 λ 数字。 合理范围会随数据规模、特征缩放和模型实现变化;先用对数尺度试一串候选值,再只根据验证集决定。 🔗 推荐算法第 5 章矩阵分解里的那个
λ(‖p‖² + ‖q‖²),就是 L2 正则。🔬 为什么加一项 λ‖w‖² 就能防过拟合?为什么 L1 会产生稀疏? 这两个问题有一个漂亮的统一答案:L2 正则 = 给权重加高斯先验,L1 = 拉普拉斯先验, 而 λ = 噪声方差/先验方差。见《机器学习的数学原理》第 2 章。
⚠️ 三、常用的预处理:标准化
线性模型对特征尺度极度敏感:
| 原始特征 | 数字范围 | 没标准化时会发生什么 |
|---|---|---|
| 面积 | 1~200 ㎡ | 数字本身大,模型只需配一个较小的权重 |
| 房间数 | 1~5 个 | 数字本身小,模型被迫配一个较大的权重 |
| 正则化 | 惩罚权重大小 | 会误以为“权重大”的房间数更该被罚 |
| 梯度下降 | 沿各维度找最低点 | 尺度差太大时容易走“之”字,训练变慢 |
一句话结论:先标准化,再训练。 这会让正则化公平、梯度下降也更容易直接朝正确方向走。 ⚠️ 最经典的坑:
# ❌ 错误:用全部数据算均值方差 → 测试集信息泄漏进训练
scaler.fit(X) # X 包含测试集!
# ✅ 正确:只用训练集拟合,再变换两边
scaler.fit(X_train)
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)
🔗 这是推荐算法第 3 章「数据泄漏」在预处理环节的版本。 树模型通常不需要标准化。尺度差异较大的数值特征,在线性模型和神经网络里通常值得先缩放,但不是所有模型、所有输入都必须使用 StandardScaler。常数列也不能变成标准差 1。
🧪 第二遍实战:看正则化怎么起作用
展开实验:运行代码、看曲线、理解 L1 怎样筛特征
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
X, y = load_breast_cancer(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3,
random_state=42, stratify=y)
sc = StandardScaler().fit(X_tr) # ⭐ 只 fit 训练集
Xtr, Xte = sc.transform(X_tr), sc.transform(X_te)
print(f"{'正则强度C':<12}{'训练集':>9}{'测试集':>9}{'权重绝对值和':>14}{'零权重数':>9}")
print("-" * 56)
# C 是 λ 的倒数:C 越小 = 正则越强
for C in [0.001, 0.01, 0.1, 1, 10, 100]:
m = LogisticRegression(C=C, max_iter=5000).fit(Xtr, y_tr)
w = m.coef_[0]
print(f"{C:<12}{m.score(Xtr,y_tr):>8.1%}{m.score(Xte,y_te):>9.1%}"
f"{np.abs(w).sum():>14.1f}{(np.abs(w)<1e-4).sum():>9}")
print("\n用 L1 正则做特征选择:")
print(f"{'C':<12}{'测试集':>9}{'被选中的特征数':>16}")
print("-" * 40)
for C in [0.01, 0.05, 0.1, 1]:
# l1_ratio=1 即纯 L1(sklearn 1.8+ 的新写法;老版本用 penalty="l1")
m = LogisticRegression(C=C, l1_ratio=1, solver="saga",
max_iter=20000).fit(Xtr, y_tr)
n_used = (np.abs(m.coef_[0]) > 1e-6).sum()
print(f"{C:<12}{m.score(Xte,y_te):>8.1%}{n_used:>13} / 30")
下方保留一组历史实验结果,供观察趋势;不同版本与划分不保证逐项相同。
实验边界:不要照着测试分数调 C。 这组结果用于展示正则强弱的现象。实际调参应在训练数据内切验证集或做交叉验证,选定 C 后才用独立测试集报告一次成绩。C=1 不是通用最优值。
C = 0.001:测试集 90.1%,正则太强,模型学不动。
C = 1:测试集 98.8%,这是这组数据的甜点区。
C = 100:训练集继续涨、测试集跌到 95.3%,模型开始记住训练集。
完整实验数据(只在想核对具体数字时看)
| C | 训练集 | 测试集 | 权重绝对值和 | 该怎么读 |
|---|---|---|---|---|
| 0.001 | 88.9% | 90.1% | 1.3 | 正则太强,模型学不动 → 欠拟合 |
| 0.01 | 96.0% | 94.2% | 3.8 | 开始学到规律 |
| 0.1 | 98.5% | 98.2% | 8.2 | 表现很好 |
| 1 | 98.7% | 98.8% | 15.8 | 甜点区:测试集最好 |
| 10 | 99.0% | 98.2% | 35.4 | 开始记住训练集 |
| 100 | 99.5% | 95.3% | 107.2 | 正则太弱,权重膨胀 → 过拟合 |
L1 的额外能力:自动丢掉不重要的特征。
| C | 测试集 | 保留特征 | 读法 |
|---|---|---|---|
| 0.05 | 94.2% | 4 / 30 | 正则很强,只留很少特征 |
| 0.1 | 95.9% | 6 / 30 | 多放开一点,效果变好 |
| 1 | 97.7% | 14 / 30 | 砍掉一半多特征,精度几乎不掉 |
1. 权重绝对值和从 1.3 一路涨到 107.2 —— 正则放松,权重就爆炸。
2. 测试集在 C=1 达到峰值后开始跌,但训练集还在涨 —— 又是第 1 章那个拐点。
3. L1 用 14 个特征拿到 97.7% —— 一半特征是冗余的。
⚠️ 版本提示:sklearn 1.8 起弃用
penalty参数(不是立即删除);新代码可用l1_ratio=1指定 L1,配合支持它的solver="saga"。参见 官方参数说明。 老版本报错的话改回penalty="l1", solver="liblinear"。
🧩 线性模型的能力边界
这个局限直接催生了神经网络(第 7 章)——给线性模型套上非线性激活并堆叠起来,就能画任意曲线。
✅ 检查点
- 线性回归和逻辑回归的区别?各用什么损失函数?
- 为什么分类不用 MSE 而用交叉熵?
- L1 和 L2 正则的区别?各什么时候用?
- 为什么限制权重大小能防过拟合?
- 标准化时最经典的坑是什么?哪类模型不需要标准化?
👀 答案
- 线性回归预测数值,用 MSE;逻辑回归套 Sigmoid 输出概率做分类,用交叉熵。
- Sigmoid + MSE 在自信但错误的饱和区可能梯度很小;单样本交叉熵对 logit 的梯度是预测概率减真实标签。它不保证整张网络没有梯度消失。
- L2 通常收缩权重,不以产生零系数为特点;L1 可能把一部分权重压到恰好 0,用于稀疏化和特征选择。
- 权重大 = 模型对该特征极度敏感 = 输入微变输出剧变 = 在拟合噪声。压小权重让模型"稳重"。
- 用全部数据(含测试集)去 fit scaler,导致测试集信息泄漏。正确做法是只 fit 训练集。树模型不需要标准化。
🛑 可以停在这里
⚡ 走神救援
- 线性回归:预测一个数,用 MSE;逻辑回归:预测概率,用 Sigmoid + 交叉熵。
- 分类别用 MSE:Sigmoid 配 MSE 会让“错得很离谱”的样本梯度反而变小;交叉熵专门重罚自信但错误的预测。
- 缩放要避免泄漏:只用训练集估计均值和标准差;数值型线性模型和神经网络常受益,树模型通常不需要。
- 正则化是第二遍重点:L2 默认让所有权重变小;L1 会把一部分权重压成 0,顺便筛特征。
- 能力边界:一条直线画不出 XOR;加上非线性并堆叠,才走到神经网络。
下一节 👉 04-决策树与集成学习.md