9-1 逻辑回归与二分类算法

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    • 理解“回归”与“分类”任务的核心区别(连续值预测 vs 离散类别预测)。
    • 理解 Sigmoid 函数的数学形式与物理意义(将任意实数映射到 $0 \sim 1$ 的概率区间)。
    • 掌握逻辑回归(Logistic Regression)的算法原理与决策边界概念。
  • ⚙️ 能力目标
    • 能够熟练使用 sklearn.linear_model.LogisticRegression 搭建二分类模型。
    • 能够使用 .predict() 获取分类结果,以及使用 .predict_proba() 获取概率值。
  • 💡 素养目标
    • 建立概率思维,理解现实生活中“风险预测与决策分类”的数学本质。

【重点与难点】

  • 🟢 教学重点:Sigmoid 激活函数的作用、逻辑回归代码实现及概率输出(predict_proba)。
  • 🟡 教学难点:为什么线性模型加上 Sigmoid 后就能做分类?概率阈值(0.5)与决策边界的理解。

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

在前两节课中,我们学习了线性回归,用来预测连续的数值(如房价、月薪)。

抛出新场景与问题: 假设我们学校的宿舍管理系统要新增一个“学生违纪风险预警”功能,或者电商平台要预测“用户是否会购买商品”:

  1. 输出的结果不再是一个具体数值,而是 “是/否”、“合格/不合格”、“违纪/正常”
  2. 能不能直接用线性回归线(例如 $y = wx + b$)来输出这种“非 0 即 1”的结果?

核心矛盾: 线性回归的输出区间是 $(-\infty, +\infty)$,直接用来做分类会出现预测值超过 1 或小于 0 的不合理现象。因此,我们需要一个**“概率转换器”**,把任意数值压缩到 $0 \sim 1$ 之间的概率区间。

  • 👨‍🏫 教师活动:在黑板或 PPT 上展示“预测房价(连续值)”与“预测考试是否及格(0/1)”的对比图,引导学生思考两者的区别。
  • 🧑‍🎓 学生活动:对比分析两种业务场景,指出分类问题的输出只有固定的几个类别。

从连续数值预测引出离散类别预测,揭示线性回归处理分类问题时的局限,顺理成章地引出逻辑回归与 Sigmoid 函数。


📖 二、 解决问题过程(一):逻辑回归原理与 Sigmoid 函数(25分钟)

1. 从线性回归到逻辑回归

逻辑回归的核心逻辑是:先用线性模型算出一个得分,再用 Sigmoid 函数把得分转成概率

$$\text{线性得分 } z = w_1 x_1 + w_2 x_2 + \dots + b$$

2. Sigmoid 激活函数

$$\sigma(z) = \frac{1}{1 + e^{-z}}$$
  • Sigmoid 函数两大特性
    • 定义域:$(-\infty, +\infty)$,值域:$(0, 1)$。完美对应“概率”概念!
    • 当 $z = 0$ 时,$\sigma(z) = 0.5$。
    • 当 $z > 0$ 时,$\sigma(z) > 0.5$ $\rightarrow$ 判定为类别 1;
    • 当 $z < 0$ 时,$\sigma(z) < 0.5$ $\rightarrow$ 判定为类别 0。

3. 决策边界与分类规则

默认以 $0.5$ 作为临界阈值:

$$P(y=1\vert{}x) \ge 0.5 \implies \text{预测为类别 1}$$

$$P(y=1\vert{}x) < 0.5 \implies \text{预测为类别 0}$$
  • 👨‍🏫 教师活动:绘制 Sigmoid 函数的 S 型曲线图,重点演示当输入值 $z$ 变大或变小时,输出概率如何在 $(0, 1)$ 之间变化。
  • 🧑‍🎓 学生活动:手算简单数值(如 $z=0$ 时概率为 $0.5$),理解 Sigmoid 的映射机制。

突破教学难点,让学生明白“逻辑回归本质上还是线性模型,只是外包了一层 Sigmoid 映射”,消除对分类算法的恐惧感。


💻 三、 解决问题过程(二):使用 Scikit-Learn 实现逻辑回归(25分钟)

在 Python 中,使用 sklearn.linear_model.LogisticRegression 即可完成分类模型的搭建与预测。

 1import numpy as np
 2from sklearn.linear_model import LogisticRegression
 3
 4# 1. 准备示例数据(学习时长 vs 是否通过考试)
 5# 特征 X:[每周学习时长(小时), 期中成绩]
 6X = np.array([
 7    [1, 45],
 8    [2, 50],
 9    [3, 55],
10    [6, 70],
11    [7, 85],
12    [8, 90]
13])
14
15# 标签 y:0 表示未通过,1 表示通过
16y = np.array([0, 0, 0, 1, 1, 1])
17
18# 2. 创建并训练逻辑回归模型
19model = LogisticRegression()
20model.fit(X, y)
21
22# 3. 准备新数据进行预测(例如:学习 5 小时,期中 65 分的学生)
23X_new = np.array([[5, 65]])
24
25# 4. 获取预测结果
26pred_class = model.predict(X_new)         # 输出分类标签 (0 或 1)
27pred_prob = model.predict_proba(X_new)     # 输出预测概率 [概率0, 概率1]
28
29print("--- 🤖 逻辑回归分类预测报告 ---")
30print(f"预测分类标签: {pred_class[0]} ('1'代表通过, '0'代表未通过)")
31print(f"预测属于类别 0 的概率: {pred_prob[0][0]:.4f} ({pred_prob[0][0]*100:.2f}%)")
32print(f"预测属于类别 1 的概率: {pred_prob[0][1]:.4f} ({pred_prob[0][1]*100:.2f}%)")
  • 👨‍🏫 教师活动:在 Notebook 中演示代码,强调 .predict().predict_proba() 的输出差异,展示概率之和恒等于 1 的特性。
  • 🧑‍🎓 学生活动:编写并运行代码,尝试修改 X_new 的数值(如改为学习 0.5 小时),观察预测概率的变化。

通过真实贴近学生生活的“考试及格预测”案例,让学生掌握工业级二分类 API 的调用,重点区分标签预测与概率预测的区别。


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

📝 任务一:垃圾邮件二分类预测…

背景与题目: 某邮箱系统提取了 5 封邮件的特征数据,包含 [邮件字数, 包含敏感词个数]

  • 特征数据集 X = [[50, 0], [120, 0], [30, 5], [40, 8], [200, 6]]
  • 类别标签 y = [0, 0, 1, 1, 1]1 代表垃圾邮件,0 代表正常邮件)

任务要求

  1. 构建 LogisticRegression 模型并完成拟合。
  2. 预测一封新邮件(字数 80,敏感词个数 4)是否为垃圾邮件,并打印出该邮件是垃圾邮件的概率。
🔍 查看参考代码与解析…
 1import numpy as np
 2from sklearn.linear_model import LogisticRegression
 3
 4# 1. 构建数据集
 5X = np.array([[50, 0], [120, 0], [30, 5], [40, 8], [200, 6]])
 6y = np.array([0, 0, 1, 1, 1])
 7
 8# 2. 训练模型
 9model = LogisticRegression()
10model.fit(X, y)
11
12# 3. 预测新邮件
13X_test = np.array([[80, 4]])
14result = model.predict(X_test)[0]
15probabilities = model.predict_proba(X_test)[0]
16
17print(f"新邮件分类结果: {'垃圾邮件' if result == 1 else '正常邮件'}")
18print(f"属于垃圾邮件的概率: {probabilities[1]*100:.2f}%")

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

flowchart LR
    root["📊 9-1 逻辑回归与二分类"]

    subgraph C1["💡 核心概念"]
        direction TB
        A1["任务类型:二分类(0/1)"]
        A2["核心思想:线性得分 + 概率转换"]
    end

    subgraph C2["📐 Sigmoid 函数"]
        direction TB
        B1["公式:1 / (1 + e^-z)"]
        B2["值域:0 到 1 之间(映射概率)"]
        B3["决策阈值:默认 0.5 分界"]
    end

    subgraph C3["💻 Sklearn 实现"]
        direction TB
        C1_node["LogisticRegression 模块"]
        C2_node["predict:输出类别 0 或 1"]
        C3_node["predict_proba:输出具体概率"]
    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:宿舍违纪风险二分类预测】

  • 背景:宿舍管理系统提取了 6 名学生的宿规表现数据。特征为 [夜不归宿次数, 卫生扣分次数],标签 y0(正常)或 1(存在违纪风险)。
  • 数据集
1X1 = [[0, 1], [0, 2], [1, 0], [2, 5], [3, 4], [4, 6]]
2y1 = [0, 0, 0, 1, 1, 1]
  • 任务:训练逻辑回归模型,预测一名 [夜不归宿 1 次, 卫生扣分 4 次] 的学生的违纪风险类别,并打印其违纪概率。

【题目 2:中职学生升学/就业倾向分类】

  • 背景:根据高年级学生的成绩与实训表现预测其毕业选择。特征为 [文化课平均分, 技能实训得分],标签 y0(直接就业)或 1(参加单招/对口升学)。
  • 数据集
1X2 = [[60, 85], [55, 90], [65, 80], [85, 70], [90, 75], [92, 85]]
2y2 = [0, 0, 0, 1, 1, 1]
  • 任务:编写代码训练模型,预测一名 [文化课 78 分, 技能实训 82 分] 的学生的分类标签及概率。

【题目 3:网络安全——SQL 注入恶意请求拦截】

  • 背景:Web 防火墙通过请求特征识别网络攻击。特征为 [请求字符串长度, 特殊符号(如 quotes引号/semicolon分号)个数],标签 y0(正常请求)或 1(恶意攻击)。
  • 数据集
1X3 = [[15, 0], [22, 1], [18, 0], [120, 8], [95, 6], [110, 7]]
2y3 = [0, 0, 0, 1, 1, 1]
  • 任务:构建模型并测试一个 [长度 85, 特殊符号 5 个] 的 HTTP 请求,输出该请求是否会被系统判定为恶意攻击。

【题目 4:二手手机回收质量评估】

  • 背景:二手回收平台评估手机检测报告。特征为 [使用年限(年), 屏幕划痕数(处)],标签 y0(优质机/高价回收)或 1(瑕疵机/低价回收)。
  • 数据集
1X4 = [[0.5, 0], [1.0, 1], [0.8, 2], [3.0, 5], [2.5, 8], [4.0, 6]]
2y4 = [0, 0, 0, 1, 1, 1]
  • 任务:拟合逻辑回归模型,预测一台 [使用 1.5 年, 屏幕划痕 4 处] 的二手手机属于“瑕疵机(标签1)”的概率。

【题目 5:客户信用卡违约风险预测】

  • 背景:金融风控系统评估用户信贷风险。特征为 [月收入(千元), 逾期次数],标签 y0(履约良好)或 1(存在违约风险)。
  • 数据集
1X5 = [[8.5, 0], [12.0, 0], [6.0, 1], [3.2, 3], [4.0, 2], [2.5, 4]]
2y5 = [0, 0, 0, 1, 1, 1]
  • 任务:训练模型,比较并打印出两位新客户的违约概率:
  • 客户 A:[月收入 5.5 千元, 逾期 1 次]
  • 客户 B:[月收入 3.0 千元, 逾期 3 次]

2. 拓展思考题

  • 逻辑回归默认以 $0.5$ 作为判定分类的临界阈值($P \ge 0.5$ 判定为风险)。如果在一个医疗诊断系统中(预测病人是否有重大疾病),为了防止漏诊,我们应该把判定阈值调高还是调低?为什么?

📋 七、 板书设计

🛠️ 板书设计…
 19-1 逻辑回归与二分类算法
 2
 3一、回归 vs 分类                     三、Sklearn 关键 API
 4· 回归:预测连续值 (例: 房价)          1. model = LogisticRegression()
 5· 分类:预测离散类别 (例: 是/否)        2. model.fit(X, y)
 6                                      3. model.predict(X_new)       -> 返回 0 或 1
 7二、Sigmoid 激活函数                   4. model.predict_proba(X_new) -> 返回 [P(0), P(1)]
 8· 公式: σ(z) = 1 / (1 + e^-z)
 9· 作用: 将任意实数映射到 (0, 1) 区间   四、分类规则
10· 阈值: P >= 0.5 判定为 1; P < 0.5 判定为 0