8-2 机器学习模型评估(回归指标)
📌 一、 课程导入(10分钟)
在上节课《8-1 线性回归》中,我们学会了用 model.fit(X, y) 拟合出一条预测线。
抛出问题: 假设我们拟合出了两个房价预测模型(模型 A 和模型 B),模型 A 预测一套房子差了 5 万元,模型 B 预测差了 12 万元。
- 我们怎么用一个量化的指标告诉客户哪个模型更好?
- 如果考试满分是 100 分,有没有一个指标能给机器学习模型也打一个 0 ~ 1 之间的“成绩单”?
核心结论: 数据拟合只是第一步,模型评估才是验证算法能否真实落地的“验货把关”过程。
- 👨🏫 教师活动:展示两个误差不同的房价预测结果图表,抛出“如何量化评价模型好坏”的问题,引出本节课的主题。
- 🧑🎓 学生活动:观察图表,对比预测值与真实值的差距,思考如何用数字表达“精准度”。
以“给模型打分”这一形象生动的比喻切入,消除数学指标的枯燥感,帮助学生快速建立“模型评估与测试”的工程视角。
📖 二、 解决问题过程(一):四大回归评估指标原理(25分钟)
假设真实值为 $y$,模型预测值为 $\hat{y}$,样本数量为 $n$:
1. MAE(Mean Absolute Error,平均绝对误差)
$$\text{MAE} = \frac{1}{n}\sum_{i=1}^{n}\vert{}y_i - \hat{y}_i\vert{}$$- 含义:预测误差绝对值的平均数。
- 优点:单位与原始数据完全一致(如“平均相差 X 万元”),最直观易懂。
2. MSE(Mean Squared Error,均方误差)
$$\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$$- 含义:预测误差平方的平均数(上节课损失函数)。
- 特点:对离群点(大误差)非常敏感,误差越大惩罚越重。
3. RMSE(Root Mean Squared Error,均方根误差)
$$\text{RMSE} = \sqrt{\text{MSE}} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}$$- 含义:对 MSE 开平方。
- 优点:既保留了 MSE 对大误差惩罚的特性,又把单位还原回了原始数据的量纲。
4. $R^2$ Score(Coefficient of Determination,决定系数)
$$\text{R}^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2} = 1 - \frac{\text{残差平方和(你的模型误差)}}{\text{总平方和(瞎猜均值的误差)}}$$- 物理意义:你的模型比“只猜平均值”的基准模型好多少?
- 打分区间:
- $R^2 = 1$:完美预测,零误差。
- $R^2 \approx 0.8 \sim 0.9$:模型效果非常优秀。
- $R^2 = 0$:模型效果和“直接猜平均值”没有任何区别。
- $R^2 < 0$:模型极差,预测效果还不如直接猜平均值。
- 👨🏫 教师活动:逐一推导和对比 MAE、MSE、RMSE 的量纲区别;重点用“跟平均值瞎猜比较”的图示解释 $R^2$ 的直观含义。
- 🧑🎓 学生活动:记录四个指标的英文缩写与中文含义,思考为什么 MSE 需要开平方(RMSE)。
从简单直观的 MAE 循序渐进引出 $R^2$,突破“决定系数”公式抽象的教学难点,让学生彻底搞懂 $R^2$ 为什么被称为“模型成绩单”。
💻 三、 解决问题过程(二):使用 Scikit-Learn 进行评估代码实践(25分钟)
在 Python 中,sklearn.metrics 模块提供了内置的评估 API,也可以直接使用模型的 .score() 方法。
- 👨🏫 教师活动:在 Jupyter Notebook 中演示代码,重点对比
mean_absolute_error与r2_score的输出结果,并讲解model.score(X, y)的简便用法。 - 🧑🎓 学生活动:同步编写代码并运行,观察打印出的评估报告;尝试向
y中引入一个离群异常值,观察哪个评估指标变化最剧烈。
通过工业级 API 代码演示,让学生掌握如何在实际项目中用 3 行代码快速生成模型的评估报告,实现“理论到工程”的落地。
✍️ 四、 解决问题过程(三):课堂练习与巩固(20分钟)
📝 五、 课堂小结(5 分钟)
flowchart LR
root["📊 8-2 模型评估(回归)"]
subgraph C1["💡 核心概念"]
direction TB
A1["评估目的:给算法打分验货"]
A2["训练集与测试集评估的区别"]
end
subgraph C2["📐 量纲指标"]
direction TB
B1["MAE:平均绝对误差(原始单位)"]
B2["MSE:均方误差(放大离群误差)"]
B3["RMSE:均方根误差(还原原始单位)"]
end
subgraph C3["🏆 打分指标"]
direction TB
C1_node["R2 决定系数(0 ~ 1 分数)"]
C2_node["含义:对比均值瞎猜模型的提升程度"]
end
subgraph C4["💻 代码实现"]
direction TB
D1["sklearn.metrics 模块"]
D2["model.score 函数直接获取 R2"]
end
root --> C1
root --> C2
root --> C3
root --> C4
%% 自定义主题色彩美化
style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px
style C4 fill:#f3e5f5,stroke:#9c27b0,stroke-width:1px