逻辑回归(Logistic Regression)培训课件

逻辑回归(Logistic Regression)培训课件

逻辑回归(Logistic Regression)培训课件

目录

  1. 案例引导:从“考试通过预测”说起
  2. 逻辑回归的概念与原理
  3. 逻辑回归的完整实现流程
  4. 手动演算:一个完整的案例
  5. Python代码验证
  6. 分类评估:ROC曲线与AUC指标
  7. 常见的生产应用场景
  8. 逻辑回归的优缺点
  9. 常见面试题
  10. 总结
  11. 课后作业

一、案例引导:从“考试通过预测”说起

1.1 一个生活中的问题

假设你是一位老师,手里有一组学生的数据:

学习时长(小时)是否通过考试(1=通过,0=未通过)
20
50
81
121
151

问题:如果一个学生学习时长为10小时,他通过考试的概率是多少?

1.2 为什么不能用线性回归?

如果直接用线性回归去拟合这些数据,会得到一个直线方程。但这条直线会带来一个严重的问题:

  • 当学习时长为20小时时,线性回归可能预测出概率为1.8(180%)
  • 当学习时长为0小时时,可能预测出概率为-0.3(-30%)

概率怎么可能超过100%或小于0%呢?

这就引出了逻辑回归的核心使命:把任意实数范围的输出,压缩到 [0, 1] 这个概率区间内。

二、逻辑回归的概念与原理

2.1 什么是逻辑回归?

逻辑回归(Logistic Regression)虽然名字里带“回归”,但它实际上是一种分类算法,专门用于解决二分类问题

一句话定义:逻辑回归 = 线性回归的输出 + Sigmoid激活函数 + 概率判断

2.2 核心思想:三步走

第一步:线性回归算分

先把特征(比如学习时长)做一个线性组合,算出一个“综合得分”:

[
z = w_1x_1 + w_2x_2 + \dots + w_nx_n + b
]

这个 ( z ) 可以是任何实数(从负无穷到正无穷)。

第二步:Sigmoid函数“挤压”成概率

把 ( z ) 扔进 Sigmoid 函数(也叫逻辑函数),它就像一台“挤压机”:

[
p = \sigma(z) = \frac{1}{1 + e^{-z}}
]

Sigmoid函数的神奇之处在于:

  • 输入:任意实数((-\infty, +\infty))
  • 输出:被压缩到 (0, 1) 之间
  • 中心点:(\sigma(0) = 0.5)

第三步:设定阈值做决策

通常以0.5为分水岭:

  • 若 ( p \ge 0.5 ),预测为类别 1(通过考试)
  • 若 ( p < 0.5 ),预测为类别 0(未通过考试)

2.3 一张图理解整个流程

输入特征(学习时长) ↓ 线性回归:z = w × x + b (算出任意实数) ↓ Sigmoid函数:p = 1/(1+e^(-z)) (挤压成0~1的概率) ↓ 设定阈值0.5 ↓ p ≥ 0.5 → 预测“通过” | p < 0.5 → 预测“未通过”

三、逻辑回归的完整实现流程

3.1 流程总览

逻辑回归的完整实现包含以下7个步骤:

  1. 数据准备:收集特征和标签
  2. 前向传播:计算线性组合 → Sigmoid → 得到预测概率
  3. 计算损失:用对数似然损失(交叉熵)衡量预测与真实的差距
  4. 计算梯度:求损失函数对每个参数的偏导数
  5. 更新参数:用梯度下降法更新权重和偏置
  6. 迭代训练:重复步骤2-5,直到损失收敛
  7. 预测输出:用训练好的模型对新样本做预测

3.2 损失函数(对数似然损失/交叉熵)

对于单个样本,损失函数为:

[
L = -\left[ y \cdot \log§ + (1 - y) \cdot \log(1 - p) \right]
]

其中 ( y ) 是真实标签(0或1),( p ) 是模型预测的概率。

为什么这个损失函数设计得妙?

分两种情况看:

  • 当 ( y = 1 )(真实是正例):( L = -\log§ )

    • 如果 ( p = 0.9 ),损失 ( = -\log(0.9) \approx 0.105 )(很小 ✓)
    • 如果 ( p = 0.1 ),损失 ( = -\log(0.1) \approx 2.302 )(极大 ✗)
  • 当 ( y = 0 )(真实是反例):( L = -\log(1-p) )

    • 如果 ( p = 0.1 ),损失 ( = -\log(0.9) \approx 0.105 )(很小 ✓)
    • 如果 ( p = 0.9 ),损失 ( = -\log(0.1) \approx 2.302 )(极大 ✗)

核心思想:预测越离谱(离真实值越远),惩罚越狠。这就是“对数”惩罚的威力。

对于 ( m ) 个样本,总损失(成本函数)为:

[
J = -\frac{1}{m} \sum_{i=1}^{m} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]
]

3.3 梯度计算(关键推导)

我们的目标是求出损失函数 ( J ) 对权重 ( w ) 的偏导数,这样才知道参数该往哪个方向调。

利用链式法则:

[
\frac{\partial J}{\partial w} = \frac{\partial J}{\partial p} \cdot \frac{\partial p}{\partial z} \cdot \frac{\partial z}{\partial w}
]

三部曲

① ( \frac{\partial J}{\partial p} = \frac{p - y}{p(1-p)} )

② Sigmoid的导数有一个神仙性质:( \frac{\partial p}{\partial z} = p(1-p) )

③ ( \frac{\partial z}{\partial w} = x )

三者相乘,( p(1-p) ) 完美约掉,得到极其简洁的结果:

[
\boxed{\frac{\partial J}{\partial w} = (p - y) \cdot x}
]

对于 ( m ) 个样本:

[
\boxed{\frac{\partial J}{\partial w} = \frac{1}{m} \sum_{i=1}^{m} (p_i - y_i) \cdot x_i}
]

物理意义:梯度的方向 =(预测概率 - 真实标签)× 输入特征。预测高了就调低,预测低了就调高。

3.4 梯度更新(参数优化)

有了梯度,就可以用梯度下降法更新参数:

[
w_{new} = w_{old} - \alpha \cdot \frac{\partial J}{\partial w}
]

[
b_{new} = b_{old} - \alpha \cdot \frac{\partial J}{\partial b}
]

其中 ( \alpha ) 是学习率,控制每一步迈多大。

为什么是“减号”?

  • 梯度是上升最陡的方向,我们要下山,所以要反向
  • 如果梯度为正(上坡),减去正数 = 参数变小,往山下走 ✓
  • 如果梯度为负(下坡),减去负数 = 参数变大,往山下走 ✓

四、手动演算:一个完整的案例

4.1 案例设定

我们用最简单的场景:只有一个特征(学习时长 ( x )),预测是否通过考试(( y ))。

数据:只有一个样本,( x = 1 ),( y = 1 )(学习1小时,通过了)

初始参数:( w = 0.5 ),( b = 0 )

学习率:( \alpha = 0.1 )

4.2 第一步:前向传播(计算预测概率)

[
z = w \cdot x + b = 0.5 \times 1 + 0 = 0.5
]

[
p = \frac{1}{1 + e^{-0.5}} = \frac{1}{1 + 0.6065} \approx 0.622
]

模型认为:62.2% 的概率通过考试。

4.3 第二步:计算损失

因为 ( y = 1 ):

[
L = -\log§ = -\log(0.622) \approx 0.474
]

4.4 第三步:计算梯度

[
\frac{\partial J}{\partial w} = (p - y) \cdot x = (0.622 - 1) \times 1 = -0.378
]

梯度为负数,说明预测偏低了(0.622 < 1),需要把 ( w )调大

4.5 第四步:更新参数

[
w_{new} = w_{old} - \alpha \cdot \frac{\partial J}{\partial w} = 0.5 - 0.1 \times (-0.378) = 0.5 + 0.0378 = \mathbf{0.5378}
]

4.6 第五步:验证效果

更新后用新参数重新预测:

[
z_{new} = 0.5378 \times 1 = 0.5378
]

[
p_{new} = \frac{1}{1 + e^{-0.5378}} = \frac{1}{1 + 0.584} \approx 0.631
]

概率从 0.622 提升到了 0.631,离真实的“1”更近了!

新损失:( L_{new} = -\log(0.631) \approx 0.460 ),比原来的 0.474 降低了。

这就是一次完整的梯度下降迭代。重复这个过程,模型会越来越准。

五、Python代码验证

下面我们用 Python 的sklearn库来实现逻辑回归,并验证上面的手动演算。

5.1 完整代码

# 1. 导入必要的库importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,confusion_matrix,classification_report,roc_curve,roc_auc_score# 2. 准备数据:学习时长(小时)与是否通过考试(1=通过,0=未通过)X=np.array([[2],[5],[8],[12],[15],[3],[6],[10],[13],[18]])# 学习时长y=np.array([0,0,1,1,1,0,0,1,1,1])# 是否通过print("="*50)print("【数据预览】")print("学习时长:",X.flatten())print("是否通过:",y)print("="*50)# 3. 划分训练集和测试集(80%训练,20%测试)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)print("\n【数据划分】")print(f"训练集样本数:{len(X_train)}")print(f"测试集样本数:{len(X_test)}")# 4. 创建逻辑回归模型# - C=1.0 是正则化强度的倒数(默认值)# - max_iter=1000 确保收敛model=LogisticRegression(C=1.0,max_iter=1000,random_state=42)# 5. 训练模型(这就是梯度下降在后台自动完成的过程!)model.fit(X_train,y_train)print("\n【模型训练完成】")print(f"权重 w:{model.coef_[0][0]:.4f}")print(f"偏置 b:{model.intercept_[0]:.4f}")# 6. 在测试集上预测y_pred=model.predict(X_test)# 预测类别(0或1)y_pred_proba=model.predict_proba(X_test)# 预测概率(0~1之间的值)print("\n【测试集预测结果】")print("真实标签: ",y_test)print("预测类别: ",y_pred)print("预测概率: ",[f"{p[1]:.2%}"forpiny_pred_proba])# 取类别1的概率# 7. 评估模型accuracy=accuracy_score(y_test,y_pred)print(f"\n【模型评估】")print(f"准确率:{accuracy:.2%}")# 混淆矩阵cm=confusion_matrix(y_test,y_pred)print("\n混淆矩阵:")print(" 预测为0 预测为1")print(f"真实为0{cm[0][0]:^8}{cm[0][1]:^8}")print(f"真实为1{cm[1][0]:^8}{cm[1][1]:^8}")# 分类报告print("\n分类报告:")print(classification_report(y_test,y_pred,target_names=["未通过","通过"]))# 8. ROC曲线与AUC(将在下一章详细讲解)y_proba=model.predict_proba(X)[:,1]# 所有样本的预测概率fpr,tpr,thresholds=roc_curve(y,y_proba)auc=roc_auc_score(y,y_proba)print(f"AUC值:{auc:.4f}")# 绘制ROC曲线plt.figure(figsize=(8,6))plt.plot(fpr,tpr,color='darkorange',lw=2,label=f'ROC曲线 (AUC ={auc:.4f})')plt.plot([0,1],[0,1],color='navy',lw=2,linestyle='--',label='随机猜测')plt.xlim([0.0,1.0])plt.ylim([0.0,1.05])plt.xlabel('假正率 (FPR)')plt.ylabel('真正率 (TPR)')plt.title('ROC曲线')plt.legend(loc="lower right")plt.grid(True)plt.show()

5.2 代码执行流程分析

步骤代码行说明
1导入库引入 numpy、sklearn 等必要工具
2准备数据创建特征 X 和标签 y
3划分数据train_test_split将数据分为训练集和测试集
4创建模型LogisticRegression()实例化模型对象
5训练模型model.fit()内部执行梯度下降,自动优化参数
6预测predict()输出类别,predict_proba()输出概率
7评估计算准确率、混淆矩阵、分类报告
8ROC/AUC绘制 ROC 曲线,计算 AUC 值

5.3 代码输出解读

运行上述代码,你会看到:

  1. 权重和偏置:模型学到的 ( w ) 和 ( b ) 值
  2. 预测结果:每个测试样本的预测类别和概率
  3. 准确率:模型在测试集上的正确率
  4. 混淆矩阵:直观展示哪些分对了、哪些分错了
  5. ROC曲线和AUC:模型整体性能的可视化评估

六、分类评估:ROC曲线与AUC指标

6.1 为什么需要ROC和AUC?

准确率(Accuracy)有时会“骗人”。比如:

  • 100个样本中,99个是负例,1个是正例
  • 如果模型把所有样本都预测为负例,准确率 = 99%
  • 但这个模型毫无意义,因为它一个正例都识别不出来

ROC曲线和AUC指标能更全面地评估模型性能。

6.2 混淆矩阵基础

在介绍ROC之前,先回顾混淆矩阵的四个基本概念:

预测为正例预测为反例
真实为正例TP(真正例)FN(假反例)
真实为反例FP(假正例)TN(真反例)

由此引出两个关键指标:

  • 真正率(TPR)= TP / (TP + FN):所有正例中,被正确预测的比例
  • 假正率(FPR)= FP / (FP + TN):所有反例中,被错误预测为正例的比例

6.3 ROC曲线

ROC曲线(受试者工作特征曲线)是将不同阈值下的FPR作为横轴、TPR作为纵轴绘制而成的曲线。

如何绘制ROC曲线?

  1. 将所有样本按模型预测的“正例概率”从大到小排序
  2. 从高到低依次设定阈值(如 90%、80%、70%…)
  3. 每个阈值下,计算对应的 FPR 和 TPR
  4. 将这些点连成曲线

曲线解读

  • 曲线越靠近左上角,模型性能越好
  • 对角线(45°线)代表随机猜测(AUC = 0.5)

6.4 AUC指标

AUC(Area Under Curve)就是 ROC 曲线下的面积。

AUC的概率意义

随机取一对正负样本,正样本的预测得分大于负样本预测得分的概率。

AUC值的判断标准

AUC值含义
AUC = 1.0完美分类器(现实中几乎不存在)
0.8 ≤ AUC < 1.0优秀,有很好的预测价值
0.7 ≤ AUC < 0.8良好,有一定预测价值
0.5 < AUC < 0.7一般,勉强可用
AUC = 0.5随机猜测,毫无预测能力
AUC < 0.5比随机还差(可能标签搞反了)

6.5 ROC和AUC的优势

  1. 不受阈值影响:综合评估模型在所有阈值下的表现
  2. 不受样本不平衡影响:在正负样本严重不平衡时依然可靠
  3. 便于模型比较:AUC 是一个数值,可以直接比较不同模型

七、常见的生产应用场景

逻辑回归因其简单、高效、可解释性强,在众多领域得到广泛应用。

7.1 金融风控(最经典的应用)

90%的信用评分卡使用逻辑回归

  • 信用评分:根据用户的收入、负债、历史还款记录等特征,预测违约概率
  • 欺诈检测:识别异常交易行为
  • 贷款审批:判断申请人是否具备还款能力

7.2 医疗健康

85%的疾病预测模型以逻辑回归为基础

  • 疾病诊断:根据体检指标预测是否患病(如糖尿病、心脏病)
  • 风险预测:分析基因、生活习惯等因素,预测患病风险
  • 药物疗效评估:判断某种治疗方案是否有效

7.3 市场营销

  • 用户转化预测:预测客户是否会购买产品或服务
  • 客户流失预警:识别可能流失的客户
  • 广告点击率(CTR)预测:判断用户是否会点击广告

7.4 互联网与推荐系统

  • 垃圾邮件识别:判断邮件是否为垃圾邮件
  • 推荐系统:分析用户偏好,预测可能感兴趣的内容
  • 文本分类:情感分析、主题分类等

7.5 其他领域

  • 生物信息学:基因表达数据分析
  • 社会科学:分析社会现象和人类行为
  • 搜索引擎:搜索结果排序优化

八、逻辑回归的优缺点

8.1 优点

优点说明
简单易懂模型形式清晰,数学原理优雅,容易理解和实现
可解释性强可以直接看到每个特征的权重,理解特征对结果的影响
输出概率不仅给出分类结果,还能给出概率值,便于风险决策
计算高效训练和预测速度快,适合大规模数据
鲁棒性好对异常值和缺失值相对稳健
易于更新可以方便地吸收新数据,更新模型

8.2 缺点

缺点说明
容易欠拟合模型相对简单,分类精度可能不如复杂模型
特征工程要求高对非线性关系处理能力有限,需要人工构造特征
对数据量有要求需要较大样本量才能得到可靠的参数估计
独立性假设假设所有观测独立,实际中可能不成立
对多重共线性敏感特征之间高度相关时,参数估计不稳定
适应性有限不如决策树等算法对数据和场景的适应能力强

8.3 如何克服缺点?

  • 欠拟合:通过特征工程(多项式特征、交叉特征)提升模型复杂度
  • 过拟合:引入正则化(L1/L2)控制模型复杂度
  • 非线性问题:可以结合核方法或集成学习

九、常见面试题

以下是逻辑回归面试中最高频的问题:

Q1:逻辑回归是回归算法还是分类算法?为什么名字里有“回归”?

:逻辑回归本质上是分类算法(主要用于二分类)。名字里带“回归”是因为它借用了线性回归的结构——先做线性组合(回归的部分),再用Sigmoid函数映射到概率空间。

Q2:逻辑回归与线性回归有什么区别?

对比维度线性回归逻辑回归
问题类型回归(预测连续值)分类(预测类别)
输出范围任意实数(0, 1) 概率
损失函数均方误差(MSE)交叉熵/对数似然损失
求解方法最小二乘法(有闭式解)梯度下降(无闭式解)

Q3:为什么逻辑回归的损失函数不用均方误差(MSE)?

:如果用MSE,加上Sigmoid函数后,损失函数会变成非凸函数(有多个局部最小值),梯度下降容易陷入局部最优。而交叉熵损失函数是凸函数,有唯一的全局最优解。

Q4:Sigmoid函数的导数是什么?有什么特殊性质?

:( \frac{\partial \sigma(z)}{\partial z} = \sigma(z)(1 - \sigma(z)) = p(1-p) )

这个性质使得逻辑回归的梯度推导极其简洁,( p(1-p) ) 会在链式法则中与损失函数的导数抵消。

Q5:什么是ROC曲线和AUC?为什么要用它们?

:ROC曲线是以假正率(FPR)为横轴、真正率(TPR)为纵轴绘制的曲线。AUC是曲线下的面积。它们能在不依赖阈值的情况下评估模型性能,且对样本不平衡不敏感。

Q6:逻辑回归如何处理多分类问题?

:两种常用策略:

  • 一对多(OvA):为每个类别训练一个二分类器
  • 一对一(OvO):为每对类别训练一个二分类器

Q7:L1正则化和L2正则化在逻辑回归中的作用是什么?

:正则化防止过拟合。

  • L1正则化:产生稀疏解,可用于特征选择
  • L2正则化:让权重尽可能小,但不产生稀疏解

十、总结

10.1 核心要点回顾

  1. 逻辑回归是分类算法,不是回归算法,专门解决二分类问题

  2. 核心流程:线性回归 → Sigmoid函数 → 阈值判断

  3. 损失函数:对数似然损失(交叉熵),对“离谱的错误”施以重罚

  4. 梯度公式:( \frac{\partial J}{\partial w} = (p - y) \cdot x ),简洁优美

  5. 优化方法:梯度下降,朝着损失减小的方向迭代更新参数

  6. 模型评估:ROC曲线 + AUC指标,全面评估分类性能

10.2 学习建议

  • 逻辑回归是机器学习的基石算法,务必吃透
  • 重点理解Sigmoid函数交叉熵损失的配合为什么如此巧妙
  • 掌握梯度推导的链式法则,一通百通
  • 在实际项目中,逻辑回归常作为基线模型(Baseline),之后再尝试更复杂的算法

十一、课后作业

作业1:概念理解(简答题)

  1. 为什么逻辑回归的名字里有“回归”,但实际上是分类算法?
  2. 解释Sigmoid函数的作用,并写出其数学表达式。
  3. 为什么逻辑回归的损失函数不用均方误差(MSE)?
  4. 解释ROC曲线和AUC的含义,AUC=0.8意味着什么?

作业2:手动计算(数值题)

给定一个样本:( x = 2 ),( y = 0 ),初始参数 ( w = 0.3 ),( b = 0.1 ),学习率 ( \alpha = 0.05 )。

请完成一次梯度下降迭代:

  1. 计算预测概率 ( p )
  2. 计算损失 ( L )
  3. 计算梯度 ( \frac{\partial L}{\partial w} ) 和 ( \frac{\partial L}{\partial b} )
  4. 更新 ( w ) 和 ( b )

作业3:编程实践(代码题)

使用 sklearn 的load_breast_cancer数据集(乳腺癌数据集),完成以下任务:

fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_score,roc_auc_score# 1. 加载数据data=load_breast_cancer()X,y=data.data,data.target# 2. 划分训练集和测试集(70%训练,30%测试)# 3. 创建并训练逻辑回归模型# 4. 在测试集上预测并计算准确率# 5. 计算AUC值# 6. 输出模型的权重,分析哪些特征对预测影响最大

作业4:思考题(开放题)

假设你在一个银行工作,需要用逻辑回归构建信用评分卡模型。申请人的特征包括:年龄、收入、负债率、信用卡数量、逾期次数等。

请思考:

  1. 哪些特征可能需要做特殊处理(如归一化、编码)?
  2. 模型训练完成后,如何向业务部门解释模型的预测结果?
  3. 如果模型的AUC只有0.62,你会从哪些方面尝试提升模型性能?

祝你学习愉快!逻辑回归是机器学习世界的“Hello World”,掌握它,你就迈出了成为数据科学家的第一步!🚀