9-2 逻辑回归模型评估(分类指标)
📌 一、 课程导入(10分钟)
在上节课《9-1 逻辑回归》中,我们学会了用逻辑回归预测“是/否”或“0/1”的二分类问题。
抛出“准确率陷阱”案例: 假设我们医院开发了一套“罕见病筛查 AI”,1000 个受检者中只有 10 个真正患病(正样本),990 个都是健康人(负样本)。
- 如果这个 AI 不管三七二十一,把所有人都预测为“健康”:
- 它的预测准确率高高达 99%(990/1000)!
- 但这个模型有意义吗?它漏诊了所有的真正患者(0/10)!
核心结论: 在分类任务中,单纯看“准确率”是远远不够的。我们需要引入混淆矩阵以及精确率、召回率等更细致的工具来多维度审视模型。
- 👨🏫 教师活动:在黑板上列举“罕见病诊断”或“信用卡欺诈”极度不平衡的数据案例,向学生提问:“99% 准确率的模型一定是好模型吗?”
- 🧑🎓 学生活动:计算漏诊率,讨论并意识到盲目追求“全局准确率”会导致严重业务灾难。
通过反直觉的“准确率陷阱”案例破题,打破学生对单一指标的盲目信任,顺理成章地引出分类评估的核心工具——混淆矩阵。
📖 二、 解决问题过程(一):混淆矩阵与四大分类指标(25分钟)
1. 混淆矩阵(Confusion Matrix)
将模型的“预测值”与“真实值”进行交叉组合,形成 2x2 的矩阵:
| 真实 \ 预测 | 预测为 正例 (1) | 预测为 负例 (0) |
|---|---|---|
| 实际为 正例 (1) | TP (True Positive,真正例) | FN (False Negative,假负例/漏报) |
| 实际为 负例 (0) | FP (False Positive,假正例/误报) | TN (True Negative,真负例) |
2. 四大核心分类指标
- 准确率(Accuracy):所有预测对的样本占总样本的比例。 $$\text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}$$
- 精确率(Precision,查准率):预测为 1 的样本中,实际上真正是 1 的比例。(追求“抓得准”,如:垃圾邮件拦截) $$\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}$$
- 召回率(Recall,查全率):实际为 1 的样本中,被模型成功找出来的比例。(追求“找得全”,如:癌症筛查、安全预警) $$\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}$$
- F1 分数(F1-Score):精确率与召回率的调和平均数,综合衡量模型性能。 $$\text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
- 👨🏫 教师活动:板书 2x2 混淆矩阵,用“宁可错杀一千,绝不放过一个”(高 Recall)与“宁缺毋滥”(高 Precision)的比喻帮助学生区分 Recall 与 Precision。
- 🧑🎓 学生活动:对照混淆矩阵图,计算给定数值下的 TP、TN、FP、FN,手算 Precision 和 Recall。
将复杂的概念口诀化、场景化,帮助职业高中学生快速掌握混淆矩阵四个象限的直观意义。
💻 三、 解决问题过程(二):使用 Scikit-Learn 进行分类评估实践(25分钟)
在 Python 中,使用 sklearn.metrics 模块中的 confusion_matrix 和 classification_report 能够一键生成全套评估报告。
- 👨🏫 教师活动:在 Jupyter Notebook 中演示代码,逐行解读
classification_report中的 precision、recall、f1-score 以及 support 的含义。 - 🧑🎓 学生活动:同步运行代码,对应控制台输出的混淆矩阵验证
classification_report中的计算结果是否一致。
通过工业级标准化函数 classification_report 的输出演示,培养学生使用“专业工具链”解决实际问题的技能。
✍️ 四、 解决问题过程(三):课堂练习与巩固(20分钟)
📝 五、 课堂小结(5 分钟)
flowchart LR
root["📊 9-2 分类模型评估"]
subgraph C1["🧩 混淆矩阵"]
direction TB
A1["TP:预测为正,实际为正"]
A2["TN:预测为负,实际为负"]
A3["FP:预测为正,实际为负(误报)"]
A4["FN:预测为负,实际为正(漏报)"]
end
subgraph C2["📐 核心评估指标"]
direction TB
B1["Accuracy:总体对的比例"]
B2["Precision:抓得准不准(查准率)"]
B3["Recall:找得全不全(查全率)"]
B4["F1-Score:P 和 R 的调和平均"]
end
subgraph C3["💻 Sklearn 工具"]
direction TB
C1_node["confusion_matrix 函数"]
C2_node["classification_report 函数"]
end
root --> C1
root --> C2
root --> C3
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