10-2 线性模型的扩展(二):岭回归与 Lasso——正则化防过拟合

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    1. 理解正则化的核心思想:在损失函数中增加惩罚项,约束模型参数
    2. 掌握岭回归(L2 正则化)的原理与代码实现。
    3. 掌握 Lasso(L1 正则化)的原理与代码实现。
    4. 理解岭回归与 Lasso 的核心区别:Lasso 能让部分系数变为 0,实现特征选择
  • ⚙️ 能力目标
    1. 能使用 RidgeLasso 替代 LinearRegression 来训练模型。
    2. 能通过调整 alpha 参数控制正则化强度。
    3. 能根据业务需求选择 Ridge(保留所有特征)或 Lasso(自动筛选特征)。
  • 💡 素养目标
    1. 建立“好模型需要约束”的工程哲学——自由越多,风险越大
    2. 理解“特征选择”在实际项目中的价值——简化模型、提高可解释性。

【重点与难点】

  • 🟢 教学重点
    1. 岭回归与 Lasso 的代码实现(RidgeLasso)。
    2. alpha 参数的作用——越大惩罚越重,模型越简单
  • 🟡 教学难点
    1. 理解“惩罚项”如何约束参数——为什么加了惩罚就能防过拟合。
    2. 理解 L1 和 L2 的区别——为什么 Lasso 能让系数变成 0。

📌 一、 课程导入(5 分钟)

复习上节课的“惨状”

上节课我们用 degree=15 的多项式回归,得到了一条疯狂扭曲的曲线——训练集误差几乎为 0,但测试集误差巨大。

追问:那条扭曲的曲线为什么那么扭曲?

答案:因为模型的系数(权重)变得极大。比如 \( y = 100x^{15} - 50x^{14} + 30x^{13} - \dots \),这些巨大的系数让曲线剧烈震荡。

核心洞察

过拟合的“元凶”之一是系数过大。如果我们能“惩罚”过大的系数,让它们不要那么大,曲线就不会那么扭曲了。

引出方案:在损失函数里加一笔“罚款”——系数越大,罚款越多。模型为了减少总损失,就不得不把系数变小。这就是 正则化(Regularization)

  • 👨‍🏫 教师活动:展示上节课 degree=15 的扭曲曲线图,指着那些剧烈的波动问:“你们觉得什么导致了这种剧烈波动?”引导学生想到“系数太大”。
  • 🧑‍🎓 学生活动:学生回忆上节课的内容,观察曲线,思考“为什么曲线会这么扭曲”。

用上节课的“惨状”作为引子,让学生带着“怎么解决”的疑问进入本节课,形成强烈的问题驱动。


📖 二、 解决问题过程(一):正则化——给模型“上枷锁”

1. 什么是正则化(Regularization)?

正则化就是在原来的损失函数(比如 MSE)后面加上一个惩罚项,用来约束模型参数的大小。

公式对比

方法 损失函数 惩罚项
普通线性回归 \( MSE = \frac{1}{m}\sum(y - \hat{y})^2 \)
岭回归 (Ridge) \( MSE + \alpha \sum w_j^2 \) 系数的平方和(L2)
Lasso ( MSE + \alpha \sum w_j

2. 生活类比(罚款制度)

  • 没有正则化:模型可以随意把系数调得很大——就像开车没有限速,随便飙。
  • 岭回归(L2):每超速 1 公里/小时罚 1 块钱——系数越大罚得越多,但不会把系数直接降到 0。
  • Lasso(L1):超速直接吊销驾照——某些系数会被直接“砍”成 0。

3. 岭回归 vs Lasso 的核心区别

对比维度 岭回归 (Ridge / L2) Lasso (L1)
惩罚项 系数的平方和 \( \sum w_j^2 \) 系数的绝对值之和 ( \sum
对系数的影响 所有系数都缩小,但不会变成 0 部分系数直接变成 0
特征选择 ❌ 不能自动筛选特征 能自动筛选特征(系数为 0 的特征被丢弃)
适用场景 所有特征都有用,都想保留 特征很多,怀疑只有少数是重要的
处理共线性 ✅ 效果很好 ⚠️ 效果一般

4. 参数 α(alpha)的作用

alpha 控制惩罚的强度:

  • alpha = 0:等于普通线性回归(无惩罚)。
  • alpha 很小:惩罚很轻,模型接近普通线性回归。
  • alpha 很大:惩罚很重,系数被大幅压缩,模型变得很简单。

口诀alpha 越大,模型越“乖”(简单),越不容易过拟合。

  • 👨‍🏫 教师活动
    1. 在黑板上写出两个公式的对比,圈出 L2(平方)和 L1(绝对值)的区别。
    2. 用“罚款”的比喻解释为什么 Lasso 能让系数变 0——绝对值惩罚在小数上更“狠”。
  • 🧑‍🎓 学生活动
    1. 学生在笔记本上画出对比表格。
    2. 讨论:“如果我有 100 个特征,但觉得只有 5 个真正有用,应该用 Ridge 还是 Lasso?”(答案:Lasso)。

用“罚款”类比让抽象的正则化变得直观。重点强调 Lasso 的“特征选择”功能,这是实际工作中非常实用的技能。


💻 三、 解决问题过程(二):代码实战——用 Ridge 和 Lasso 驯服过拟合

1. 核心实验:用上节课的“问题数据”对比三种方法

我们用上节课 degree=15 的过拟合数据,分别用:

  • 普通线性回归(无正则化)
  • 岭回归(Ridge)
  • Lasso

观察三种方法的效果差异。

 1import numpy as np
 2import matplotlib.pyplot as plt
 3from sklearn.preprocessing import PolynomialFeatures
 4from sklearn.linear_model import LinearRegression, Ridge, Lasso
 5from sklearn.model_selection import train_test_split
 6from sklearn.metrics import mean_squared_error
 7from sklearn.pipeline import make_pipeline
 8
 9# 生成数据(和上节课一样)
10np.random.seed(42)
11X = np.random.uniform(-3, 3, size=30).reshape(-1, 1)
12y = 0.5 * X**2 + X + 2 + np.random.normal(0, 0.5, size=(30, 1))
13X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
14
15# 创建三个模型(都用 degree=15 的多项式特征)
16degree = 15
17alpha = 0.1  # 正则化强度
18
19models = {
20    '线性回归 (无正则化)': LinearRegression(),
21    f'岭回归 (alpha={alpha})': make_pipeline(PolynomialFeatures(degree, include_bias=False), Ridge(alpha=alpha)),
22    f'Lasso (alpha={alpha})': make_pipeline(PolynomialFeatures(degree, include_bias=False), Lasso(alpha=alpha))
23}
24
25# 训练并评估
26plt.figure(figsize=(15, 4))
27X_plot = np.linspace(-3, 3, 200).reshape(-1, 1)
28
29for i, (name, model) in enumerate(models.items()):
30    model.fit(X_train, y_train.ravel())
31    y_train_pred = model.predict(X_train)
32    y_test_pred = model.predict(X_test)
33    
34    train_mse = mean_squared_error(y_train, y_train_pred)
35    test_mse = mean_squared_error(y_test, y_test_pred)
36    
37    plt.subplot(1, 3, i+1)
38    plt.scatter(X_train, y_train, alpha=0.7, label='训练集')
39    plt.scatter(X_test, y_test, alpha=0.7, label='测试集')
40    plt.plot(X_plot, model.predict(X_plot), 'r-', label=name)
41    plt.title(f'{name}\n训练MSE={train_mse:.3f}, 测试MSE={test_mse:.3f}')
42    plt.legend()
43    plt.xlim(-3, 3)
44
45plt.tight_layout()
46plt.show()

2. 运行结果解读(课堂重点)

模型 训练集 MSE 测试集 MSE 曲线形态
线性回归(无正则化) 极小(≈0) 极大 疯狂扭曲的蛇形线
岭回归 (Ridge) 较小 明显降低 平滑了很多,不再剧烈震荡
Lasso 较小 明显降低 平滑,且部分特征系数变为 0

3. 调节 alpha 观察变化

1# 尝试不同的 alpha 值
2alphas = [0.001, 0.01, 0.1, 1, 10]
3for alpha in alphas:
4    model = make_pipeline(PolynomialFeatures(15, include_bias=False), Ridge(alpha=alpha))
5    model.fit(X_train, y_train.ravel())
6    # 观察测试集 MSE 的变化

观察结论

  • alpha 太小(如 0.001):惩罚太轻,曲线依然扭曲,过拟合没解决。
  • alpha 适中(如 0.1 ~ 1):曲线平滑,测试集误差最低。
  • alpha 太大(如 10):惩罚太重,曲线几乎变成直线,欠拟合了。
  • 👨‍🏫 教师活动
    1. 运行对比代码,让三张图并排显示,指着中间的 Ridge 图说:“看,加了惩罚之后,那条疯狂的蛇形线变乖了!”
    2. 演示调节 alpha 从 0.001 到 10 的过程,让学生观察曲线从“扭曲”到“平滑”再到“直线”的变化。
  • 🧑‍🎓 学生活动
    1. 观察三张图的 MSE 数值,验证“加了正则化后测试集误差下降了”。
    2. 自己动手修改 alpha 值,观察曲线变化,感受“调参”的感觉。

这是本节课的高潮实验。通过三图对比,让学生亲眼看到正则化如何“驯服”过拟合。通过调节 alpha,让学生直观理解“惩罚强度”对模型复杂度的影响。


✍️ 四、 解决问题过程(三):Lasso 的特征选择能力

1. 核心亮点:Lasso 能自动“淘汰”不重要的特征

在实际工作中,我们经常遇到特征很多但不知道哪些重要的情况。Lasso 可以帮我们自动筛选——它会把不重要的特征的系数直接变成 0。

2. 演示实验:用 Lasso 从 15 个特征中选出重要的

在 degree=15 的多项式回归中,我们有 15 个特征(\( x, x^2, x^3, \dots, x^{15} \))。但真实数据是由二次函数生成的,所以真正重要的只有 \( x \) 和 \( x^2 \)。

看看 Lasso 能不能“发现”这个事实:

 1from sklearn.preprocessing import PolynomialFeatures
 2from sklearn.linear_model import Lasso
 3
 4# 生成数据(真实规律是二次函数)
 5np.random.seed(42)
 6X = np.random.uniform(-3, 3, size=100).reshape(-1, 1)
 7y = 0.5 * X**2 + X + 2 + np.random.normal(0, 0.3, size=(100, 1))
 8
 9# 生成 15 次多项式特征
10poly = PolynomialFeatures(degree=15, include_bias=False)
11X_poly = poly.fit_transform(X)
12
13# 用 Lasso 拟合(alpha 调大一点,让特征选择更明显)
14lasso = Lasso(alpha=0.5)
15lasso.fit(X_poly, y.ravel())
16
17# 查看系数
18coefs = lasso.coef_
19feature_names = [f'x^{i+1}' for i in range(15)]
20
21print("Lasso 的系数:")
22for name, coef in zip(feature_names, coefs):
23    if abs(coef) > 0.01:
24        print(f"  {name}: {coef:.4f}")
25    else:
26        print(f"  {name}: {coef:.4f} ← 被淘汰!")

运行结果示例

1Lasso 的系数:
2  x^1: 0.9876
3  x^2: 0.4987
4  x^3: 0.0000 ← 被淘汰!
5  x^4: 0.0000 ← 被淘汰!
6  ...
7  x^15: 0.0000 ← 被淘汰!

结论:Lasso 成功识别出只有 \( x \) 和 \( x^2 \) 是重要的,其他 13 个特征的系数全部变为 0!

3. 什么时候用 Ridge,什么时候用 Lasso?(职高必记)

场景 推荐 原因
特征不多(<20),且都有业务意义 Ridge 保留所有特征,只是缩小系数
特征很多(>50),怀疑只有少数重要 Lasso 自动筛选重要特征,简化模型
需要向老板解释“哪些特征最重要” Lasso 系数为 0 的特征可以直接说“这个不重要”
特征之间有强相关性(共线性) Ridge Lasso 在共线性下表现不稳定
  • 👨‍🏫 教师活动
    1. 运行 Lasso 系数打印代码,让学生看到大量系数变成 0 的“壮观”场面。
    2. 提问:“如果老板问你‘这 15 个特征里哪些对房价影响最大’,你怎么回答?”(答案:用 Lasso,系数不为 0 的就是重要的)。
  • 🧑‍🎓 学生活动
    1. 观察 Lasso 的系数输出,数一数有多少个变成了 0。
    2. 讨论:如果特征是“年龄、收入、学历、城市、职业…”等 50 个,用 Ridge 还是 Lasso?

Lasso 的“特征选择”能力是它在工业界备受青睐的原因。通过这个实验,让学生看到 Lasso 不仅能防过拟合,还能帮我们“读懂”数据——哪些特征真正重要。


📝 五、 课堂小结(5 分钟)

flowchart TB
    root["🛡️ 正则化:给模型『上枷锁』"]

    root --> C1["📐 岭回归 (Ridge / L2)"]
    root --> C2["📏 Lasso (L1)"]

    C1 --> C1a["惩罚项: 系数平方和"]
    C1 --> C1b["效果: 所有系数都缩小"]
    C1 --> C1c["特点: 不删除任何特征"]
    C1 --> C1d["适用: 所有特征都有用"]

    C2 --> C2a["惩罚项: 系数绝对值之和"]
    C2 --> C2b["效果: 部分系数变为 0"]
    C2 --> C2c["特点: 自动特征选择"]
    C2 --> C2d["适用: 特征很多,只少数重要"]

    root --> C3["⚙️ alpha 参数"]
    C3 --> C3a["alpha 越大 → 惩罚越重 → 模型越简单"]
    C3 --> C3b["alpha 太小 → 过拟合"]
    C3 --> C3c["alpha 太大 → 欠拟合"]

    style root fill:#4b6cb7,stroke:#253b6e,color:#fff
    style C1 fill:#e3f2fd,stroke:#2196f3
    style C2 fill:#fff3e0,stroke:#ff9800
    style C3 fill:#e8f5e9,stroke:#4caf50

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 岭回归(Ridge)和 Lasso 的共同点是什么?
  • A. 都能让所有系数变为 0
  • B. 都在损失函数中添加了惩罚项来防止过拟合
  • C. 都只能用于分类问题
  • D. 都不需要调节超参数
【答案】

【解析】B。两者都是通过添加正则化惩罚项来防止过拟合,区别在于惩罚项不同(L2 vs L1)。

  1. 以下哪个场景最适合使用 Lasso 回归?
  • A. 只有 3 个特征,且都已知对结果有影响
  • B. 有 100 个特征,怀疑只有 5 个真正重要
  • C. 数据量非常大(100 万条)
  • D. 特征之间完全没有相关性
【答案】

【解析】B。Lasso 的核心优势是自动特征选择,当特征很多且只有少数重要时最适用。

  1. 在岭回归中,增大 alpha 值会带来什么影响?
  • A. 模型变得更复杂,过拟合加剧
  • B. 模型变得更简单,系数被进一步压缩
  • C. 模型不受任何影响
  • D. 模型会删除所有特征
【答案】

【解析】B。alpha 控制正则化强度,alpha 越大惩罚越重,模型越简单。

二、 代码填空题

题目:请补全代码,使用岭回归训练一个多项式回归模型(degree=10, alpha=0.5)。

 1from sklearn.preprocessing import PolynomialFeatures
 2from sklearn.linear_model import Ridge
 3from sklearn.pipeline import make_pipeline
 4
 5# 创建管道:先产生多项式特征,再用岭回归
 6model = make_pipeline(
 7    _________________________________,
 8    _________________________________
 9)
10model.fit(X_train, y_train)
【答案】
  1. PolynomialFeatures(degree=10, include_bias=False)
  2. Ridge(alpha=0.5)

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础代码题:用上节课 degree=15 的过拟合数据,分别用 Ridge(alpha=0.01, 0.1, 1, 10) 训练,绘制四张对比图,观察 alpha 变化对曲线的影响。
  2. 对比分析题:使用 Lasso(alpha=0.1)Ridge(alpha=0.1) 训练同一个数据集,打印各自的系数,观察哪些系数被 Lasso 变成了 0。
  3. 思考题:如果特征之间有很强的相关性(比如“面积”和“长度×宽度”),用 Ridge 还是 Lasso 更稳定?为什么?(答案:Ridge,因为 Lasso 在强共线性下会随机选择其中一个,不稳定)。
  4. 预习任务:我们学了线性模型的扩展(多项式、Ridge、Lasso)。下一章我们将进入几何与空间距离的世界——LDA 和 KNN,看看“距离”在机器学习中怎么用。
  5. 职高衔接拓展:你在工作中有一个包含 200 个特征的客户数据集,老板要求你找出“最重要的 10 个特征”来简化报表。你应该用什么算法?(答案:Lasso,它能自动把不重要特征的系数变成 0)。

📋 七、 板书设计

🛠️ 板书设计…
 1第十章 线性模型的扩展
 2第二课时:岭回归与 Lasso——正则化防过拟合
 3
 4一、为什么需要正则化?
 5   过拟合的元凶:系数太大!
 6   解决方案:加惩罚项(罚款)
 7
 8二、两种正则化方法
 9
10   岭回归 (Ridge / L2):
11     惩罚 = α × Σ(w²)
12     效果:所有系数缩小,但不为 0
13     适用:所有特征都有用
14
15   Lasso (L1):
16     惩罚 = α × Σ|w|
17     效果:部分系数变为 0 → 特征选择!
18     适用:特征很多,只少数重要
19
20三、参数 alpha
21   alpha 越大 → 惩罚越重 → 模型越简单
22   - 太小 → 过拟合
23   - 太大 → 欠拟合
24   - 适中 → 刚刚好
25
26四、选型口诀
27   “特征都重要,用 Ridge;特征多且杂,用 Lasso。”

本课用到的单词

单词 发音 专业英语解释(中文)
Regularization /ˌreɡjələrəˈzeɪʃən/ 正则化。在损失函数中添加惩罚项以防止过拟合的技术。
Ridge Regression /rɪdʒ rɪˈɡreʃən/ 岭回归。使用 L2 正则化(系数平方和)的线性回归方法。
Lasso /ˈlæsoʊ/ 套索回归。使用 L1 正则化(系数绝对值之和)的线性回归方法,可自动进行特征选择。
L1 Regularization /el wʌn ˌreɡjələrəˈzeɪʃən/ L1 正则化。惩罚项为系数绝对值之和,能使部分系数变为 0。
L2 Regularization /el tuː ˌreɡjələrəˈzeɪʃən/ L2 正则化。惩罚项为系数平方和,能使所有系数缩小但不为 0。
Alpha /ˈælfə/ 正则化强度参数。控制惩罚项在损失函数中的权重,越大模型越简单。
Feature Selection /ˈfiːtʃər sɪˈlekʃən/ 特征选择。从众多特征中筛选出重要特征的过程,Lasso 可自动完成。