05 逻辑斯蒂回归(Logistic Regression)
核心问题:如何用回归的思路解决分类问题?
逻辑回归虽然名字里有“回归”,但它是一种分类算法,尤其擅长二分类(如是否欺诈、是否患病)。
一、为什么不能用线性回归做分类?
1.1 线性回归的输出范围问题
线性回归:
,输出范围是 (−∞,+∞)。
分类问题需要输出概率,范围应该在 [0,1] 之间。
直接用线性回归,预测结果可能大于1或小于0,没有概率意义。
1.2 解决方案:套上一个“压缩函数”
我们需要一个函数,能把线性回归的输出(任意实数)映射到 (0,1)区间。
这个函数就是Sigmoid 函数(也叫逻辑斯蒂函数)。
逻辑斯蒂回归 = 线性回归 + Sigmoid 函数
二、Sigmoid 函数(核心)
2.1 公式与图像
形状:S 形曲线,关于点 (0, 0.5) 中心对称。
2.2 导数性质(重要)
这个性质在梯度下降推导中非常有用。
2.3 为什么用它?
输出天然是概率值
光滑可导,适合梯度下降优化
在 z=0附近变化最敏感,远离0时趋于饱和
三、逻辑斯蒂回归模型定义(二分类)
3.1 模型表达式
3.2 对数几率(Logit)
左边是“正类概率 / 负类概率”的对数,称为对数几率(log-odds)。
这揭示了逻辑回归的本质:对数几率是输入特征的线性函数。
3.3 预测规则
四、如何学习参数 w 和 b?—— 最大似然估计
五、梯度下降求解
5.1 梯度公式
5.2 参数更新(梯度下降)
5.3 学习率的选择
| 学习率 | 表现 | 问题 |
|---|---|---|
| 过小 | 收敛极慢 | 训练时间长 |
| 适中 | 稳定收敛 | — |
| 过大 | 震荡甚至发散 | 无法收敛 |
常用策略:学习率衰减、自适应优化器(Adam、RMSprop)。
六、决策边界
6.1 线性决策边界
由预测规则决定。
在二维空间中是一条直线,在高维空间中是一个超平面。
例子:0.5x1+0.8x2−1=0 是一条直线,一侧预测为 1,另一侧为 0。
6.2 局限性
逻辑回归的决策边界始终是线性的。如果数据本身是非线性可分的(如圆形、螺旋形),原始逻辑回归无法正确分类。
6.3 如何实现非线性决策边界?
七、模型评估(分类标准指标)
7.1 混淆矩阵
| 真实\预测 | 正类 (1) | 负类 (0) |
|---|---|---|
| 正类 (1) | TP | FN |
| 负类 (0) | FP | TN |
7.2 核心指标
准确率 (Accuracy)= (TP+TN) / 总样本 —— 整体正确率,但易受不平衡数据影响。
精确率 (Precision)= TP / (TP+FP) —— 预测为正的样本中实际为正的比例。
召回率 (Recall)= TP / (TP+FN) —— 实际为正的样本中被找出的比例。
F1 分数= 2 × (精确率×召回率) / (精确率+召回率) —— 两者的调和平均。
ROC 曲线与 AUC:
ROC 横轴 FPR = FP/(FP+TN),纵轴 TPR = TP/(TP+FN)
AUC 是 ROC 曲线下面积,值越大模型排序能力越强,且对不平衡数据鲁棒。
详情可参考前一章《ROC曲线与AUC手动计算》。
八、正则化(防止过拟合)
8.1 为什么需要正则化?
逻辑回归中,如果特征很多或数据线性可分,权重会变得非常大,导致模型对输入微小变化极其敏感(过拟合)。正则化通过对权重施加惩罚,控制模型复杂度。
8.2 L1 与 L2 正则化
带有正则化的损失函数:
8.3 参数 C(scikit-learn 中的用法)
sklearn 中使用C而不是 λ,关系为 C=1/λ:
C 很大→ 正则化弱 → 模型复杂 → 可能过拟合
C 很小→ 正则化强 → 模型简单 → 可能欠拟合
实践中通过交叉验证(LogisticRegressionCV)选择最优 C。
九、多分类扩展
9.1 一对其他(One-vs-Rest, OvR)
对 k 个类别训练 k 个二分类器。第 i 个分类器将类别 i 作为正类,其余所有类别作为负类。
预测时,选择概率最高的分类器对应的类别。
优点:只需 k 个分类器。
缺点:训练集不平衡(负类样本远多于正类)。
9.2 一对一(One-vs-One, OvO)
对每对类别训练一个二分类器,共 k(k−1)/2 个。
预测时,所有分类器投票,得票最多的类别获胜。
优点:每个分类器训练数据少,边界更精细。
缺点:分类器数量随 k 平方增长,存储和预测开销大。
9.3 Softmax 回归(多类别逻辑回归)
sklearn 逻辑回归默认使用 OvR,可通过
multi_class='multinomial'切换为 Softmax。
十、Python 实战(鸢尾花分类)
10.1 基本代码
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 三分类 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) # 创建模型(Softmax 多分类) model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=200) model.fit(X_train, y_train) # 预测与评估 y_pred = model.predict(X_test) print("准确率:", model.score(X_test, y_test)) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))10.2 重要参数说明
| 参数 | 说明 | 常用值 |
|---|---|---|
penalty | 正则化类型 | 'l2'(默认)、'l1'、'elasticnet' |
C | 正则化强度的倒数 | 正浮点数,默认 1.0,越小正则化越强 |
solver | 优化算法 | 'lbfgs'(小数据)、'liblinear'(大数据)、'saga'(支持 L1) |
multi_class | 多分类策略 | 'ovr'(默认)、'multinomial'(Softmax) |
max_iter | 最大迭代次数 | 默认 100,复杂问题需增大 |
class_weight | 类别权重 | 'balanced'自动平衡,或手动指定 |
十一、逻辑回归的优缺点总结
优点
简单、高效、训练速度快
输出具有概率意义,可解释性强(权重直接反映特征影响方向和大小)
配合正则化不容易过拟合
支持在线学习(增量更新)
缺点
决策边界是线性的,对非线性数据需要手动做特征工程
对异常值敏感
特征之间存在多重共线性时,系数估计不稳定
对类别不平衡数据敏感(需用
class_weight或采样方法)
