9-2 逻辑回归模型评估(分类指标)

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    • 理解分类模型与回归模型评估逻辑的区别(预测离散标签 vs 预测连续数值)。
    • 掌握混淆矩阵(Confusion Matrix)的四个基本概念:TP、TN、FP、FN。
    • 掌握四大核心分类评估指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)与 F1 分数(F1-Score)。
  • ⚙️ 能力目标
    • 能够熟练使用 sklearn.metrics 模块输出分类模型评估报告(classification_report)与混淆矩阵。
    • 能够根据医疗诊断、垃圾邮件、金融风控等不同业务场景选择合适的评估侧重点(如偏重 Precision 还是 Recall)。
  • 💡 素养目标
    • 建立全面的“测试与评估”视角,避免掉入“只看准确率”的盲目自信陷阱。

【重点与难点】

  • 🟢 教学重点:混淆矩阵结构、精确率(Precision)与召回率(Recall)的计算公式及其 sklearn 代码实现。
  • 🟡 教学难点:精确率与召回率的矛盾与平衡(Trade-off),以及针对“样本不平衡问题”时准确率失效的原因分析。

📌 一、 课程导入(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_matrixclassification_report 能够一键生成全套评估报告。

 1import numpy as np
 2from sklearn.linear_model import LogisticRegression
 3from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
 4
 5# 1. 模拟学生违纪预测数据集 [夜不归宿次数, 卫生扣分]
 6X = np.array([
 7    [0, 1], [0, 2], [1, 0], [1, 1], [0, 3],  # 正常学生 (0)
 8    [2, 5], [3, 4], [4, 6], [2, 8], [5, 5]   # 违纪学生 (1)
 9])
10y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
11
12# 2. 训练逻辑回归模型
13model = LogisticRegression()
14model.fit(X, y)
15
16# 3. 对训练集进行预测
17y_pred = model.predict(X)
18
19# 4. 输出混淆矩阵
20cm = confusion_matrix(y, y_pred)
21print("--- 🧩 混淆矩阵 (Confusion Matrix) ---")
22print(cm)
23print(f"TP={cm[1,1]}, TN={cm[0,0]}, FP={cm[0,1]}, FN={cm[1,0]}")
24
25# 5. 输出完整分类评估报告
26print("\n--- 📊 分类评估报告 (Classification Report) ---")
27print(classification_report(y, y_pred, target_names=['正常(0)', '违纪(1)']))
  • 👨‍🏫 教师活动:在 Jupyter Notebook 中演示代码,逐行解读 classification_report 中的 precision、recall、f1-score 以及 support 的含义。
  • 🧑‍🎓 学生活动:同步运行代码,对应控制台输出的混淆矩阵验证 classification_report 中的计算结果是否一致。

通过工业级标准化函数 classification_report 的输出演示,培养学生使用“专业工具链”解决实际问题的技能。


✍️ 四、 解决问题过程(三):课堂练习与巩固(20分钟)

📝 任务一:垃圾邮件拦截系统的‘验货’评估…

背景与题目: 某邮箱防火墙对 10 封测试邮件进行了预测,已知真实标签与模型预测标签如下:

  • 真实标签 y_true = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1](0为正常,1为垃圾邮件)
  • 预测标签 y_pred = [0, 0, 0, 0, 1, 0, 1, 1, 1, 0]

任务要求

  1. 找出该模型的 TP、TN、FP、FN 分别是多少?
  2. 手算或用代码计算该模型的 准确率 与对“垃圾邮件(标签1)”的 精确率召回率
🔍 查看参考代码与解析…
 1import numpy as np
 2from sklearn.metrics import confusion_matrix, classification_report
 3
 4y_true = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1])
 5y_pred = np.array([0, 0, 0, 0, 1, 0, 1, 1, 1, 0])
 6
 7cm = confusion_matrix(y_true, y_pred)
 8print("混淆矩阵:\n", cm)
 9# 结果解析:
10# TN = 5 (6个正常邮件中,5个预测正确,1个误报)
11# FP = 1 (把1个正常邮件误判为垃圾邮件)
12# FN = 1 (漏报了1个垃圾邮件)
13# TP = 3 (成功拦截了3个垃圾邮件)
14
15print("\n评估报告:\n", classification_report(y_true, y_pred, target_names=['正常', '垃圾邮件']))
16# 结论:垃圾邮件的 Precision = 3/(3+1) = 75%,Recall = 3/(3+1) = 75%

📝 五、 课堂小结(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

📮 六、 课后作业与拓展

📮 课后作业…

1. 基础巩固题(共 5 题,含完整测试数据集)

【题目 1:宿舍违纪风险二分类评估】

  • 背景:宿管系统对 8 名学生进行了风险预测。已知真实结果与预测结果如下:
1y_true1 = [0, 0, 0, 0, 1, 1, 1, 1]  # 0:正常, 1:存在风险
2y_pred1 = [0, 0, 0, 1, 0, 1, 1, 1]
  • 任务:编写代码输出混淆矩阵,打印其 Precision(精确率)Recall(召回率),并指出发生了几次“漏报(FN)”。

【题目 2:中职学生升学/就业预测模型评价】

  • 背景:招办系统对 10 名毕业生的升学倾向(1代表升学,0代表就业)进行了预测:
1y_true2 = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
2y_pred2 = [1, 1, 1, 0, 1, 0, 0, 1, 0, 0]
  • 任务:输出 classification_report 评估报告,找出针对“升学类(标签1)”的 F1-Score 得分。

【题目 3:SQL 注入恶意攻击防火墙测试】

  • 背景:Web 防火墙对 10 个网络请求进行了安全检测(1为恶意攻击,0为正常请求):
1y_true3 = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
2y_pred3 = [0, 0, 1, 0, 0, 0, 1, 1, 1, 1]
  • 任务:请问该防火墙是将“正常请求误判为攻击”了(FP),还是把“恶意攻击漏过去了”(FN)?计算其精确率 Precision。

【题目 4:二手手机质检分类器效果评估】

  • 背景:评估二手平台对 8 台手机的质检结果(1为瑕疵机,0为优质机):
1y_true4 = [0, 0, 0, 0, 1, 1, 1, 1]
2y_pred4 = [0, 0, 0, 0, 0, 0, 1, 1]
  • 任务:计算该模型的 Recall(召回率),分析这个质检模型在商业运营中存在什么隐患(提示:瑕疵机漏检率)。

【题目 5:金融风控信用卡违约预测】

  • 背景:风控模型预测了 10 位客户的违约风险(1为违约,0为履约良好):
1y_true5 = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
2y_pred5 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  # 极端情况:模型预测全为 0
  • 任务
  1. 计算该模型的 Accuracy(准确率) 是多少?
  2. 计算针对“违约客户(标签1)”的 Recall(召回率) 是多少?
  3. 用一句话解释为什么在这个案例中准确率失效了?

2. 拓展思考题

  • 在医疗诊断系统中,误诊(把健康人预测为患病,FP)和漏诊(把患病者预测为健康,FN),哪种后果更严重?因此在医疗 AI 中,我们应该优先追求更高的 Precision(精确率) 还是更高的 Recall(召回率)

📋 七、 板书设计

🛠️ 板书设计…
 19-2 逻辑回归模型评估(分类指标)
 2
 3一、混淆矩阵 (2x2)                     三、四大核心指标
 4             预测 1      预测 0         1. Accuracy  = (TP + TN) / Total
 5  实际 1       TP          FN           2. Precision = TP / (TP + FP)  [抓得准]
 6  实际 0       FP          TN           3. Recall    = TP / (TP + FN)  [找得全]
 7                                        4. F1-Score  = 2*P*R / (P + R)
 8二、极简口诀
 9· TP (True Positive)  : 预测对了,确实是正例   四、代码 API
10· FP (False Positive) : 预测错了,假报警 (误报)  from sklearn.metrics import
11· FN (False Negative) : 预测错了,漏掉了 (漏报)      confusion_matrix,
12· TN (True Negative)  : 预测对了,确实是负例      classification_report