8-1 线性回归(Linear Regression)

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    • 理解分类与回归的核心区别(离散 vs 连续)。
    • 理解线性回归的核心思想(找到一条最优趋势线/超平面)。
    • 掌握权重 $w$、偏置 $b$ 与均方误差($MSE$)损失函数的概念。
  • ⚙️ 能力目标
    • 能够使用 Python 的 scikit-learn 库构建一维及多维线性回归模型。
    • 能够根据训练好的模型对新数据进行预测分析。
  • 💡 素养目标
    • 培养用“数据建模思维”解决现实问题的能力。
    • 建立对机器学习算法“从数学原理到工程落地”的严谨科学态度。

【重点与难点】

  • 🟢 教学重点:线性回归方程的物理意义与 sklearn 模型训练的标准全流程。
  • 🟡 教学难点:损失函数($MSE$)的数学含义与梯度下降法(优化算法)的直观理解。

📌 一、 课程导入:我们如何做预测?(10 分钟)

在现实生活中,我们经常需要对未来的事物做出预测:

  1. 场景 A:根据今天的邮件标题和正文,判断它是不是“垃圾邮件”。
  2. 场景 B:根据房屋的面积(平方米),预测它的“二手售价”(万元)。

这两个问题的预测结果有什么本质不同?

💡 核心概念:分类 vs 回归

对比维度 回归(Regression) 分类(Classification)
预测目标 连续数值(Continuous Value) 离散标签(Discrete Label)
回答问题 “是多少?”(如:房价、温度、销量) “是什么?”(如:垃圾/正常、猫/狗)
核心逻辑 寻找数据之间的数量关系规律线 划出区分不同类别的分类边界线
  • 👨‍🏫 教师活动
    1. 抛出现实生活中的两个预测场景,引导学生对比思考。
    2. 板书并对比“分类”与“回归”的核心区别。
  • 🧑‍🎓 学生活动
    1. 思考并回答两个场景输出结果的区别(一个是类别,一个是数字)。
    2. 举出生活中其他属于“回归任务”的例子(如股票价格、明日气温预测)。

通过贴近生活的实际问题切入,消除机器学习算法的抽象感;通过对比强化理解,帮助学生迅速建立对“回归任务”的本质认知[cite: 2]。


📖 二、 解决问题过程(一):线性回归模型原理(25 分钟)

1. 什么是线性回归?

线性回归就是通过已知的数据,画一条“最拟合”的线,来表达变量之间的趋势

初中数学中预测房价(假设只有“面积”一个特征):

$$y = kx + b$$

在机器学习领域,我们换了一套“符号马甲”:

$$y = wx + b$$
  • $w$(Weight / 权重):表示特征对结果的影响权重(斜率)。
  • $b$(Bias / 偏置):模型的基准线(截距)。

2. 多特征场景(多元线性回归)

  • 单特征:$y = wx + b$ (一维空间里的一条直线)
  • 双特征:$y = w_1x_1 + w_2x_2 + b$ (三维空间里的一个平整平面)
  • 多特征:$y = w_1x_1 + w_2x_2 + ... + w_nx_n + b$ (高维空间里的超平面)
⚠️ 思想误区警示:回归 ≠ 因果关系

例如“冰淇淋销量高,溺水人数也多”,这属于相关性,并不意味着“吃冰淇淋会导致溺水”。线性回归研究的是如何用已有变量去拟合和预测目标变量

3. 计算机是如何“寻找”最优直线的?

计算机刚开始并不知道 $w$ 和 $b$ 的真实值,它会随机假设一组参数,然后通过以下步骤迭代学习:

步骤一:衡量误差——均方误差(MSE)

$$MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$$
  • $y_i$:实际真实值 | $\hat{y}_i$:模型预测值
  • 为什么要取平方?
    1. 消除正负抵消。
    2. 放大较大误差(误差越大,平方后惩罚越重)。
    3. 函数平滑,处处可导,利于数学优化。

步骤二:调整参数——梯度下降法(Gradient Descent)

好比一个人被蒙上双眼停在半山腰,他用脚感受脚下坡度最陡的方向(计算梯度),然后向山谷(误差最小点)迈出一步(更新参数),一步步走到山谷底部。

  • 👨‍🏫 教师活动
    1. 将初中 $y=kx+b$ 迁移讲解为机器学习的 $y=wx+b$,降低心理门槛。
    2. 用“蒙眼下山”的比喻形象化讲解梯度下降法与 MSE 损失函数。
  • 🧑‍🎓 学生活动
    1. 理解并记录 $w$(权重)与 $b$(偏置)的定义。
    2. 思考为什么 MSE 要用平方而不是绝对值。

将复杂的优化算法与损失函数转化为直观的几何画面与生活比喻,突破数学推导上的难点,建立算法直觉[cite: 2]。


💻 三、 解决问题过程(二):代码实践与工业实现(25 分钟)

1. 算法底层机制(Python 原生梯度下降模拟)

 1import time
 2
 3# 1. 准备训练数据 (假设真实规律为 y = 2x + 1)
 4X = [1, 2, 3]
 5Y = [3, 5, 7]
 6
 7# 2. 参数初始化
 8w, b = 0.0, 0.0
 9learning_rate = 0.05  # 学习率(步长)
10epochs = 200          # 训练轮次
11
12print("开始梯度下降迭代:")
13for epoch in range(epochs):
14    grad_w, grad_b, total_loss = 0, 0, 0
15    for x, y in zip(X, Y):
16        y_pred = w * x + b
17        total_loss += (y_pred - y) ** 2
18        grad_w += 2 * (y_pred - y) * x
19        grad_b += 2 * (y_pred - y)
20        
21    # 更新参数
22    w -= learning_rate * (grad_w / len(X))
23    b -= learning_rate * (grad_b / len(X))
24    
25    if (epoch + 1) % 50 == 0:
26        print(f"第 {epoch+1:3d} 步 | Loss: {total_loss/len(X):.4f} | w: {w:.2f}, b: {b:.2f}")
27
28print(f"最终学到的模型方程: y = {w:.1f}x + {b:.1f}")

2. 工业级开发:使用 scikit-learn 快速拟合

在实际开发中,我们使用封装好的标准库:

 1import numpy as np
 2from sklearn.linear_model import LinearRegression
 3
 4# 1. 准备数据 (注意:sklearn 要求特征 X 必须是二维数组/矩阵)
 5X = np.array([[1], [2], [3]])
 6y = np.array([3, 5, 7])
 7
 8# 2. 实例化模型并训练
 9model = LinearRegression()
10model.fit(X, y)
11
12# 3. 打印模型学习到的参数
13print(f"模型权重 w (斜率): {model.coef_[0]:.2f}")
14print(f"模型偏置 b (截距): {model.intercept_:.2f}")
15
16# 4. 预测未知新数据 (例如 x = 5)
17x_new = np.array([[5]])
18pred = model.predict(x_new)
19print(f"当 x = 5 时,AI 预测输出为: {pred[0]:.2f}")
  • 👨‍🏫 教师活动
  1. 在 Jupyter Notebook 中实时演示代码运行与参数“进化”过程。
  2. 重点强调 sklearn 框架中数据矩阵格式 X(必须是二维 [n_samples, n_features])的常见踩坑点。
  • 🧑‍🎓 学生活动
  1. 在本地开发环境同步敲写并运行 sklearn 代码。
  2. 尝试修改输入数据 $X, y$,观察输出的权重 $w$ 与偏置 $b$ 的变化。

通过“原生代码理解原理 + 标准库掌握工程应用”的双轨教学,既确保理论落地,又提升学生的实际代码动手能力。


✍️ 四、 解决问题过程(三):课堂实践与任务驱动(20 分钟)

📝 任务一:外卖骑手“月收入预测”…

背景:某外卖平台收集了骑手的“每日平均送单量”与“月收入”数据。请使用 LinearRegression 编写代码,预测当骑手每日送 45 单 时,其预估月收入是多少?

每日送单量(单) $X$ 月收入(元) $y$
20 4500
30 6200
40 8100
50 9800
🔍 查看参考代码与答案解析
 1import numpy as np
 2from sklearn.linear_model import LinearRegression
 3
 4X = np.array([[20], [30], [40], [50]])
 5y = np.array([4500, 6200, 8100, 9800])
 6
 7model = LinearRegression()
 8model.fit(X, y)
 9
10income_45 = model.predict([[45]])
11print(f"每天送 45 单,预估月收入为: {income_45[0]:.2f} 元")
12print(f"方程参数: w = {model.coef_[0]:.2f}, b = {model.intercept_:.2f}")

📝 任务二:二手电动车“续航与二手价预测”…

背景:评估二手电动车的售价需同时考虑“驾龄”和“电池健康度”。现收集数据如下:

驾龄 $x_1$(年) 电池健康度 $x_2$(%) 二手售价 $y$(元)
1 95 8200
2 90 6800
3 80 5100
4 75 4200

任务:训练多元线性回归模型,预测一辆驾龄 2.5 年、电池健康度 85% 的电动车合理售价是多少?

🔍 查看参考代码与答案解析
 1import numpy as np
 2from sklearn.linear_model import LinearRegression
 3
 4# 多特征输入:矩阵每行代表一个样本,每列代表一个特征
 5X = np.array([
 6    [1, 95],
 7    [2, 90],
 8    [3, 80],
 9    [4, 75]
10])
11y = np.array([8200, 6800, 5100, 4200])
12
13model = LinearRegression()
14model.fit(X, y)
15
16pred_price = model.predict([[2.5, 85]])
17print(f"预计合理售价为: {pred_price[0]:.2f} 元")
18print(f"特征权重 w1(驾龄): {model.coef_[0]:.2f}, w2(电池): {model.coef_[1]:.2f}")

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

mindmap
  root(("8-1 线性回归"))
    核心概念
      分类任务
        "预测离散标签"
        "回答:是什么"
      回归任务
        "预测连续数值"
        "回答:是多少"
    核心原理
      数学模型
        "一维:y = wx + b"
        "多维:y = w1x1 + w2x2 + ... + b"
      损失函数 MSE
        "衡量预测误差"
        "平方放大较大误差"
      优化算法
        "梯度下降法"
        "沿着最陡方向更新 w 与 b"
    工程实现
      工具包
        "scikit-learn"
      标准三步法
        "步骤 1:实例化 model = LinearRegression"
        "步骤 2:训练 fit - X, y"
        "步骤 3:预测 predict - X_new"
      注意事项
        "特征 X 必须是二维矩阵"

📮 六、 课后作业与拓展思考(5 分钟)

📮 课后巩固作业
  1. 基础题:小明收集了二手手机“使用年限”与“售价”的数据: X = [[0.5], [1.0], [1.5], [2.0], [3.0]]y = [5200, 4300, 3900, 3100, 2200]。 请编写 Python 脚本预测使用 2.5 年 的手机售价,并输出斜率 $w$。结合 $w$ 的实际数值说明:使用时间每增加 1 年,手机价格平均下降多少元?
  2. 拓展挑战题(选做):加载 sklearn.datasets.fetch_california_housing(加州房价数据集),查看包含的 8 个维度特征,训练模型并打印各自权重,尝试分析哪一个因素对房价的影响最大。

📋 七、 板书设计

🛠️ 板书设计 …
 1         8-1 线性回归 (Linear Regression)
 2
 3一、分类 vs 回归                   三、机器学习训练三要素
 41. 分类: 预测离散标签 (是什么)       1. 模型: y = wx + b
 52. 回归: 预测连续数值 (是多少)       2. 损失: MSE = Σ(y - y_hat)^2 / n
 6                                 3. 优化: 梯度下降 (蒙眼下山)
 7二、基本数学模型
 81. 单特征: y = wx + b             四、Sklearn 4步法
 92. 多特征: y = w1*x1 + w2*x2 + b    1. import LinearRegression
10                                   2. model = LinearRegression()
11                                   3. model.fit(X, y)   # X需为二维矩阵
12                                   4. model.predict(X_new)