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

03 / 线性模型 · 从一个预测开始

先分清预测什么,
再看公式怎么做。

预测房价是一个数;判断是否违约,先得到一个概率。两者都从加权求和出发。

你先带走这句就够了

先预测,再衡量差多少,
最后调整权重。

下面的蓝色下划线可以点开:解释的是它在当前公式里的作用。

  1. 1把特征组合起来

    权重决定方向和力度,偏置调整起点。

  2. 2看预测与答案的差距

    用与任务相配的损失衡量。

  3. 3让下一次预测更好

    训练调整参数;验证集检查是否学偏。

01 / 数值预测

线性回归:加权求和

$$\hat y = w^\top x + b$$

例如只有“面积”一个输入:权重 0.8、面积 100、偏置 20,模型预测 100(示意单位)。

负权重表示:其他输入不变,这一项增加会让预测降低。它不是因果证明。

02 / 二分类

逻辑回归:分数转成概率

$$\hat p = \sigma(w^\top x + b)$$

Sigmoid 把分数压进 0 到 1。分数是 0 时,预测概率为 0.5;分数是 2 时,约为 0.881。

概率还不是类别。是否判为正类,要另外选择阈值;0.5 只是常见起点。

03 / 先算一次,再记名字

MSE:把每次预测的误差平方,再取平均

$$\mathcal{L}=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y_i)^2$$
样本 A:真实 3,预测 2

误差平方:(3 − 2)² = 1

样本 B:真实 5,预测 7

误差平方:(5 − 7)² = 4

平均误差是 (1 + 4) / 2 = 2.5。这是回归示例;二分类通常用后文的交叉熵。

可以停在这里

能分清“数值”和“概率”,能用两个样本算出 MSE,就完成了这次的小目标。

继续看图解、交叉熵和标准化 →

L1/L2 与实验保留在正文的“第二遍实战”里,需要时再展开。

继续探索

原有正文、图解和例子都在下方。按需跳转,不必一次读完。

03 · 线性模型:一切的起点

⏱ 26 分钟 | ⭐ 核心 | 🔨 有代码


🎯 一句话

线性模型就是 y = w₁x₁ + w₂x₂ + ... + b ——给每个特征配一个权重,加起来。 简单到不像个「AI」,但神经网络的许多层都包含这样的加权求和,再接非线性等运算,所以值得理解。

这一页怎么读
第一遍只走主线:线性回归 → 逻辑回归 → 标准化 → 能力边界。
第二遍再打开实战:正则化、C 的调参实验和 L1 特征选择。先会分清“预测数值”和“预测概率”,已经完成最重要的一半。

📈 一、线性回归:预测一个数

房价 = 0.8 × 面积 + 12 × 地段分 − 3 × 楼龄 + 200.8:面积的权重12:地段分的权重−3:楼龄的权重20:偏置 b一条线性模型公式:每个特征都有一个“影响方向和力度”
先看系数前的正负号,再看绝对值大小;最后那个不乘任何特征的 20,是整体起点。
看什么 它告诉你什么 这个例子
权重是正还是负 特征变大时,预测值朝哪个方向变 面积、地段分越高,房价越高;楼龄越大,房价越低
权重绝对值 影响力度的大小 只有在特征已经标准化时,才适合横向比较谁更“重要”
偏置 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}}$$

10.50−505σ(−5) ≈ 0.007σ(0) = 0.5σ(5) ≈ 0.993输入越大,输出越接近 1;输入越小,输出越接近 0
Sigmoid 不会把负数“判错”,而是把任意分数平滑地变成 0 到 1 之间的概率。

损失函数 —— 交叉熵(不是 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 个标准化面积−10+1房间数−10+1非恒定列:训练集上均值 0、标准差 1
标准化不改变样本之间的相对关系;它只是让“面积”和“房间数”都用同一把尺说话。
原始特征 数字范围 没标准化时会发生什么
面积 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 不是通用最优值。

88%94%100%0.0010.010.11 ★10100C 越大 → 正则越弱训练集测试集本次划分:C=1 较高
先看两条曲线开始分开的地方:这份历史数据中 C=1 的留出成绩较高。正式选 C 应改用验证集或交叉验证,不反复查看最终测试集。
先只记住这三行:
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"。


🧩 线性模型的能力边界

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

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


✅ 检查点

  1. 线性回归和逻辑回归的区别?各用什么损失函数?
  2. 为什么分类不用 MSE 而用交叉熵?
  3. L1 和 L2 正则的区别?各什么时候用?
  4. 为什么限制权重大小能防过拟合?
  5. 标准化时最经典的坑是什么?哪类模型不需要标准化?
👀 答案
  1. 线性回归预测数值,用 MSE;逻辑回归套 Sigmoid 输出概率做分类,用交叉熵。
  2. Sigmoid + MSE 在自信但错误的饱和区可能梯度很小;单样本交叉熵对 logit 的梯度是预测概率减真实标签。它不保证整张网络没有梯度消失。
  3. L2 通常收缩权重,不以产生零系数为特点;L1 可能把一部分权重压到恰好 0,用于稀疏化和特征选择。
  4. 权重大 = 模型对该特征极度敏感 = 输入微变输出剧变 = 在拟合噪声。压小权重让模型"稳重"。
  5. 用全部数据(含测试集)去 fit scaler,导致测试集信息泄漏。正确做法是只 fit 训练集。树模型不需要标准化。

🛑 可以停在这里

⚡ 走神救援

  • 线性回归:预测一个数,用 MSE;逻辑回归:预测概率,用 Sigmoid + 交叉熵。
  • 分类别用 MSE:Sigmoid 配 MSE 会让“错得很离谱”的样本梯度反而变小;交叉熵专门重罚自信但错误的预测。
  • 缩放要避免泄漏:只用训练集估计均值和标准差;数值型线性模型和神经网络常受益,树模型通常不需要。
  • 正则化是第二遍重点:L2 默认让所有权重变小;L1 会把一部分权重压成 0,顺便筛特征。
  • 能力边界:一条直线画不出 XOR;加上非线性并堆叠,才走到神经网络。

下一节 👉 04-决策树与集成学习.md

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