🏠 总目录📚 本教程 03 · 线性模型
📑 本页目录(点开跳转)

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"


🧩 线性模型的能力边界

能解决:线性可分 解决不了:异或(XOR) 一条直线能分开 任何一条直线都会分错 必须用曲线 / 折线
同类挤在一边时,一条直线(虚线代表尝试过的切法)就够了;异或把同类摆到对角线上,直线无论怎么放都会切错 —— 这就是线性模型的能力边界。

这个局限直接催生了神经网络(第 7 章)——给线性模型套上非线性激活并堆叠起来,就能画任意曲线。


✅ 检查点

  1. 线性回归和逻辑回归的区别?各用什么损失函数?
  2. 为什么分类不用 MSE 而用交叉熵?
  3. L1 和 L2 正则的区别?各什么时候用?
  4. 为什么限制权重大小能防过拟合?
  5. 标准化时最经典的坑是什么?哪类模型不需要标准化?
👀 答案
  1. 线性回归预测数值,用 MSE;逻辑回归套 Sigmoid 输出概率做分类,用交叉熵。
  2. Sigmoid + MSE 会梯度消失(预测越错梯度越小,学不动);Sigmoid + 交叉熵的梯度正好是(预测−真实),干净且不消失。
  3. L2 让权重都变小但不为零(平滑,默认选它);L1 会把一部分权重压成 0(自动特征选择,特征多且怀疑很多没用时选它)。
  4. 权重大 = 模型对该特征极度敏感 = 输入微变输出剧变 = 在拟合噪声。压小权重让模型"稳重"。
  5. 用全部数据(含测试集)去 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

打卡记录保存在你的浏览器里,首页能看到总进度