📑 本页目录(点开跳转)
03 · 线性模型:一切的起点
⏱ 26 分钟 | ⭐ 核心 | 🔨 有代码
🎯 一句话
线性模型就是 y = w₁x₁ + w₂x₂ + ... + b ——给每个特征配一个权重,加起来。
简单到不像个「AI」,但神经网络的每一层都是它,所以必须搞透。
📈 一、线性回归:预测一个数
房价 = 0.8×面积 + 12×地段分 − 3×楼龄 + 20
↑权重 w ↑权重 w ↑权重 w ↑偏置 b
💡 权重的含义很直白:
w 为正 → 这个特征越大,预测值越大
|w| 越大 → 这个特征越重要(前提:特征已标准化!)
损失函数(第 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}}$$
1 ┤ ╭──────── σ(-5) ≈ 0.007
0.5 ┤ ╭──╯ σ(0) = 0.5
0 ┤────╯ σ(5) ≈ 0.993
└──────────────►
-5 0 5
损失函数 —— 交叉熵(不是 MSE!):
$$\mathcal{L} = -\frac{1}{n}\sum \left[ y\log\hat{p} + (1-y)\log(1-\hat{p}) \right]$$
💡 人话:真实是 1,模型说 0.9 → 罚得轻;说 0.01 → 罚到飞起。 它专门重罚「很自信但错了」的预测。
⚠️ 为什么分类不用 MSE:配 Sigmoid 用 MSE 会导致梯度消失(预测越错梯度反而越小,模型学不动)。 交叉熵配 Sigmoid,梯度正好是
(预测 − 真实),干净利落。这是个经典考点。⭐ 既然是经典考点,它多半会以「写一下」而不是「说一下」的形式出现: 🔗 附录 C 第 10 题把这句话写成了 10 行纯 numpy 的逻辑回归(在 breast_cancer 上跑到 98.2%, sklearn 是 98.8%),第 1 题是它的多分类版本—— softmax + 交叉熵的反向就是 $p-\text{onehot}(y)$,和这里的
(预测 − 真实)是同一件事。 那边还回答了两个这里没展开的追问:为什么逻辑回归可以零初始化而神经网络不行、为什么偏置不加 L2。🔗 重要连接:逻辑回归 = 一层神经网络 + Sigmoid。 你在推荐算法第 8 章见的所有深度模型,最后一层都是它。
🔒 三、正则化:对抗过拟合的第一把武器
第 1 章你看到过拟合了。线性模型怎么防?别让权重太大。
$$\mathcal{L}_{total} = \underbrace{\text{原损失}}_{\text{拟合数据}} + \lambda \underbrace{\|w\|}_{\text{惩罚复杂度}}$$
| 类型 | 惩罚项 | 效果 | 什么时候用 |
|---|---|---|---|
| L2 / Ridge | $\lambda\sum w_i^2$ | 权重都变小但不为 0,平滑 | ⭐ 默认选它 |
| L1 / Lasso | $\lambda\sum \|w_i\|$ | 一部分权重变成 0 → 自动特征选择 | 特征多且怀疑很多没用 |
| ElasticNet | 两者混合 | 兼顾 | 特征多且相关性强 |
💡 为什么限制权重能防过拟合:
权重特别大 = 模型对某个特征极度敏感 = 输入稍微变一点输出就剧变 = 它在拟合噪声。 让权重都小一点,模型就"稳重"了。
🎚️ λ 怎么调:
λ 太小 → 等于没正则 → 过拟合
λ 太大 → 权重全被压扁 → 欠拟合
常用范围 1e-4 ~ 1e1,用交叉验证扫(第 5 章)
🔗 推荐算法第 5 章矩阵分解里的那个
λ(‖p‖² + ‖q‖²),就是 L2 正则。🔬 为什么加一项 λ‖w‖² 就能防过拟合?为什么 L1 会产生稀疏? 这两个问题有一个漂亮的统一答案:L2 正则 = 给权重加高斯先验,L1 = 拉普拉斯先验, 而 λ = 噪声方差/先验方差。见《机器学习的数学原理》第 2 章。
⚠️ 四、必须做的预处理:标准化
线性模型对特征尺度极度敏感:
面积(1~200 平米) 权重会很小
房间数(1~5 个) 权重会很大
→ 正则化会不公平地惩罚尺度小的特征
→ 梯度下降会走"之"字形,收敛极慢
✅ 标准化:(x − 均值) / 标准差 → 所有特征都变成均值0方差1
⚠️ 最经典的坑:
# ❌ 错误:用全部数据算均值方差 → 测试集信息泄漏进训练
scaler.fit(X) # X 包含测试集!
# ✅ 正确:只用训练集拟合,再变换两边
scaler.fit(X_train)
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)
🔗 这是推荐算法第 3 章「数据泄漏」在预处理环节的版本。 树模型不需要标准化(它只看特征的相对大小),线性模型和神经网络必须做。
🔨 动手:看正则化怎么起作用
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 训练集 测试集 权重绝对值和
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
C=0.1 测试集 95.9% 选中特征 6/30
C=1 测试集 97.7% 选中特征 14/30 ← 砍掉一半特征,精度几乎不掉
三个值得盯着看的点: 1. 权重绝对值和从 1.3 一路涨到 107.2 —— 正则放松,权重就爆炸 2. 测试集在 C=1 达到峰值后开始跌,但训练集还在涨 → 又是第 1 章那个拐点 3. L1 用 14 个特征拿到 97.7% —— 一半特征是冗余的
⚠️ 版本提示:sklearn 1.8 起
penalty="l1"被l1_ratio=1取代。 老版本报错的话改回penalty="l1", solver="liblinear"。
🧩 线性模型的能力边界
这个局限直接催生了神经网络(第 7 章)——给线性模型套上非线性激活并堆叠起来,就能画任意曲线。
✅ 检查点
- 线性回归和逻辑回归的区别?各用什么损失函数?
- 为什么分类不用 MSE 而用交叉熵?
- L1 和 L2 正则的区别?各什么时候用?
- 为什么限制权重大小能防过拟合?
- 标准化时最经典的坑是什么?哪类模型不需要标准化?
👀 答案
- 线性回归预测数值,用 MSE;逻辑回归套 Sigmoid 输出概率做分类,用交叉熵。
- Sigmoid + MSE 会梯度消失(预测越错梯度越小,学不动);Sigmoid + 交叉熵的梯度正好是(预测−真实),干净且不消失。
- L2 让权重都变小但不为零(平滑,默认选它);L1 会把一部分权重压成 0(自动特征选择,特征多且怀疑很多没用时选它)。
- 权重大 = 模型对该特征极度敏感 = 输入微变输出剧变 = 在拟合噪声。压小权重让模型"稳重"。
- 用全部数据(含测试集)去 fit scaler,导致测试集信息泄漏。正确做法是只 fit 训练集。树模型不需要标准化。
🛑 可以停在这里
⚡ 走神救援
线性模型 y=Σwx+b,权重就是特征重要性(前提:已标准化)。线性回归用 MSE;⭐逻辑回归=线性套 Sigmoid,用交叉熵,它专门重罚"很自信但错了":真实是 1,说 0.9 罚得轻、说 0.01 罚到飞起。⚠️分类不用 MSE:Sigmoid 配 MSE 会梯度消失(越错梯度越小、学不动),交叉熵的梯度正好是(预测−真实)——经典考点。⭐逻辑回归就是一层神经网络,所有深度模型最后一层都是它。正则化=损失后加 λ‖w‖:L2 让权重都变小但不为 0,默认选它;L1 把一部分压成 0=自动特征选择。原理是大权重=对某特征极度敏感=输入微变输出剧变=在拟合噪声;λ 常用 1e-4~1e1。⭐实测那张表(C 是 λ 的倒数,C 越小正则越强):C=0.001 训 88.9% / 测 90.1%、权重绝对值和只有 1.3(欠拟合)→ C=1 训 98.7% / 测 98.8%、权重和 15.8 是甜点区 → C=100 训 99.5% / 测 95.3%、权重和暴涨到 107.2(权重爆炸+过拟合)。三个要盯的点:权重和从 1.3 涨到 107.2;测试集在 C=1 见顶后跌、训练集还在涨(又是第 1 章那个拐点);⭐L1 只用 14/30 个特征就拿到 97.7%,砍掉一半精度几乎不掉。⚠️必须标准化,否则尺度小的特征被正则不公平惩罚、梯度下降走"之"字形收敛极慢;💀最经典的坑:用含测试集的全量数据 fit scaler =信息泄漏,正确做法是只 fit 训练集再变换两边;树模型不需要标准化。能力边界:画不出异或 → 套上非线性激活再堆叠起来,就是神经网络。
下一节 👉 04-决策树与集成学习.md