逻辑回归


1. 逻辑回归概述

1.1 理解逻辑回归的“回归”

逻辑回归(Logistic Regression)是一个监督学习中的分类算法,广泛应用于垃圾邮件检测、疾病预测、信用评估等场景。

注意:逻辑回归虽然名字中带有回归,但是是一种分类算法。

它之所以还带着“回归”二字,是因为内部核心依然是一条回归方程,只不过这条方程的输出被送进了一个“转换器”(激活函数),把连续的数值映射为类别的概率。

所以说"逻辑回归"这个名字,描述的是它的计算手段(回归),而不是它的目标(分类)。


1.2 核心思想

逻辑回归的核心思想:先用线性方程 z = X w + b z = Xw + b z=Xw+b 算出一个连续值,再通过一个激活函数把这个值压到 ( 0 , 1 ) (0, 1) (0,1) 之间,得到"属于正例的概率",最后设定一个阈值(默认 0.5),概率大于阈值判为正例,否则判为反例。

对比线性回归:

线性回归 逻辑回归
任务类型 回归(预测连续值) 分类(预测离散类别)
输出 任意实数 (0, 1) 之间的概率值
核心公式 y ^ = X w + b \hat{y} = Xw + b y^=Xw+b y ^ = σ ( X w + b ) \hat{y} = \sigma(Xw + b) y^=σ(Xw+b)
损失函数 均方误差 MSE 对数似然损失(交叉熵)
优化方法 正规方程 或 梯度下降 只能用梯度下降

通俗理解来说:逻辑回归 = 线性回归 + Sigmoid 激活函数 + 对数损失。线性回归的输出是逻辑回归的输入,前者负责"打分",后者负责把分数翻译成概率。
在这里插入图片描述

1.2.1 疑惑1:为什么不能直接用阈值划分线性回归的结果?

疑惑:既然线性回归已经能输出一个连续值,为什么不在上面直接划一条线(比如 z > 0 z > 0 z>0 就是正例, z < 0 z < 0 z<0 就是反例),非要套一层 Sigmoid?

第一,概率解释。 直接拿 z = X w + b z = Xw + b z=Xw+b 的值做阈值划分,这个值可以是 − ∞ -\infty + ∞ +\infty + 的任意实数,它本身不具备概率含义。Sigmoid 把它映射到 ( 0 , 1 ) (0, 1) (0,1),输出天然可以解读为"样本属于正例的概率",这对业务决策至关重要,比如风控场景下,你需要的是"这笔交易有 87% 的概率是欺诈",而不是一个无单位的"分数 3.2"。

第二,损失函数可导。 如果直接用阈值做硬判决(大于 0 是 1,小于 0 是 0),损失函数会变成阶梯状、不可导,梯度下降就没办法用了。Sigmoid 输出的是平滑的概率曲线,处处可导,可以与对数损失配合,形成凸函数,保证梯度下降能稳定收敛。

第三,多分类可扩展。 二分类用 Sigmoid,多分类把 Sigmoid 换成 Softmax,框架完全一致。直接阈值划分则难以扩展到多类场景。

1.2.2 疑惑2:一个阈值,那只能进行二分类?还是可以通过设定多阈值?

二分类只有一个阈值(默认 0.5)。要实现多分类,不能靠设多个阈值,因为 Sigmoid 输出的是"属于正例的概率",只有一个维度的信息。多分类的正确做法是:

  • 一对多(One-vs-Rest, OvR): 为每个类别训练一个二分类器(“是 A 还是非 A”),K 个类就训练 K 个,预测时选概率最高的那个。
  • Softmax 回归(多分类逻辑回归): 把 Sigmoid 换成 Softmax 函数,输出每个类别的概率向量,所有概率之和为 1。

2. 工作流程

逻辑回归和线性回归一样,遵循"训练-预测"两阶段流程。前半段(算线性分值)与线性回归一致,区别在于最后的输出映射和损失函数。

训练阶段(让机器自己总结规律)

  1. 接收训练数据
    给定 m个样本,每个样本有 n个特征,对应的真实标签 y∈{0,1}。

  2. 定义模型形式
    线性部分: z = X ⋅ w + b z = X \cdot w + b z=Xw+b
    分类映射: y ^ = σ ( z ) = 1 1 + e − z \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} y^=σ(z)=1+ez1
    其中 wb 是待学习的参数,σ 为 Sigmoid 函数。

  3. 初始化参数
    通常将所有权重 w 和偏置 b 初始化为随机值或零。

  4. 定义损失函数
    由于输出不再是连续值,使用 对数似然损失(Log Loss),也叫交叉熵损失,能保证损失函数是凸函数,方便优化。

  5. 选择优化算法
    损失函数没有解析解(不像线性回归有正规方程),因此只能用迭代优化算法,如 梯度下降

    为什么不选正规方程?因为 Sigmoid 函数的引入使损失函数变得复杂,正规方程要求损失函数对参数求导后等于零能直接求解,但对逻辑回归来说,这会变成一个超越方程,无法一步解出。因此必须采用梯度下降类方法逐步逼近最优解。

  6. 迭代更新参数

    • 计算损失函数关于 wb 的梯度;
    • 沿负梯度方向更新参数,学习率 η 控制步长;
    • 重复直到损失收敛或达到最大迭代次数。
  7. 输出训练好的模型:保存最终的 w 和 b,训练结束。

预测阶段

  1. 接收新样本 x new x_{\text{new}} xnew
  2. 计算线性得分 z = x new ⋅ w + b z = x_{\text{new}} \cdot w + b z=xneww+b
  3. 通过 Sigmoid 映射 p = 1 1 + e − z p = \frac{1}{1 + e^{-z}} p=1+ez1,得到正类概率
  4. 阈值判定:设定阈值为 0.5(默认值,可调整):
    • 若 ( p > 0.5 ),判定样本为正类;
    • 若 ( p < 0.5 ),判定样本为负类。

3. 激活函数

3.1 什么是激活函数?

激活函数的作用:给线性模型的输出做一次“非线性变换”。线性方程 z = X w + b z = Xw + b z=Xw+b 无论怎么组合,本质上都是输入的线性组合,表达能力有限。激活函数引入了非线性,让模型能拟合更复杂的决策边界。

在逻辑回归中,激活函数的具体职责是: ( − ∞ , + ∞ ) (-\infty, +\infty) (,+) 的线性分值映射到 ( 0 , 1 ) (0, 1) (0,1),输出概率。


3.2 Sigmoid(逻辑回归使用的激活函数)

公式:

σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1

在这里插入图片描述

理解:

  • z = 0 z = 0 z=0 时, σ ( 0 ) = 0.5 \sigma(0) = 0.5 σ(0)=0.5,正好是决策边界
  • z → + ∞ z \to +\infty z+ 时, σ ( z ) → 1 \sigma(z) \to 1 σ(z)1,模型非常确信是正例
  • z → − ∞ z \to -\infty z 时, σ ( z ) → 0 \sigma(z) \to 0 σ(z)0,模型非常确信是反例
  • 曲线在 z = 0 z = 0 z=0 附近变化最陡,越远越平缓

优缺点:

  • 优点:输出范围 ( 0 , 1 ) (0, 1) (0,1),适合做概率输出;处处光滑可导,导数可以用自身表示: σ ′ ( z ) = e − z ( 1 + e − z ) 2 = 1 1 + e − z ⋅ e − z 1 + e − z = σ ( z ) ( 1 − σ ( z ) ) \sigma'(z) = \frac{e^{-z}}{(1 + e^{-z})^2}= \frac{1}{1 + e^{-z}} \cdot \frac{e^{-z}}{1 + e^{-z}}= \sigma(z)(1 - \sigma(z)) σ(z)=(1+ez)2ez=1+ez11+ezez=σ(z)(1σ(z)),这个性质让梯度计算非常高效
  • 缺点:两端梯度趋近于 0(饱和区),在深层网络中会导致梯度消失,在深层网络中不推荐用于隐藏层,但在浅层的逻辑回归中这个问题不突出。

应用场景:

  • 逻辑回归的默认激活函数(实际上它就是为二分类概率输出而生的)
  • 二分类神经网络的输出层
  • 需要输出概率值的任何二分类问题

注意:逻辑回归的激活函数本质上只有 Sigmoid(或与其等价的 softmax 在多分类时)。Tanh 和 ReLU 多用于神经网络隐藏层,但了解它们的特性有助于构建完整的知识体系。这里一并对比,方便建立整体认知。


3.3 Tanh(双曲正切)函数

公式
tanh ⁡ ( z ) = e z − e − z e z + e − z \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} tanh(z)=ez+ezezez
在这里插入图片描述

理解:也是 S 型,但输出范围为 (-1, 1),以 0 为中心。与 Sigmoid 关系: tanh ⁡ ( z ) = 2 1 + e − 2 z − 1 + e − 2 z 1 + e − 2 z = 2 σ ( 2 z ) − 1 \tanh(z) = \frac{2}{1 + e^{-2z}} - \frac{1 + e^{-2z}}{1 + e^{-2z}} = 2\sigma(2z) - 1 tanh(z)=1+e2z21+e2z1+e2z=2σ(2z)1

特点

  • 零中心化:输出有正有负,均值是0,有利于下一层的梯度更新,使其收敛速度要比 Sigmoid 函数快,减少了迭代次数。
  • 仍然存在梯度饱和问题,当 (|z|) 很大时导数趋于 0。

应用场景

  • 常用于 RNN、LSTM 等循环神经网络的内部激活。
  • 当需要输出在 -1 到 1 之间(如某些回归任务的特征归一化)时使用。

3.4 ReLU(线性整流单元)

公式
ReLU ( z ) = max ⁡ ( 0 , z ) \text{ReLU}(z) = \max(0, z) ReLU(z)=max(0,z)
在这里插入图片描述

理解:当 (z > 0) 时为斜率为 1 的直线,(z < 0) 时恒为 0。

特点

  • 计算极快:没有指数运算,只涉及比较和取最大值。
  • 缓解梯度消失:在正区间导数恒为 1,不存在饱和。
  • 稀疏激活性:负半部分输出 0,网络中可以产生稀疏表示,有利于特征提取。
  • 缺陷Dead ReLU,如果某个神经元一直落入负区间,梯度永远为 0,权重再也无法更新。变种 Leaky ReLU 等可以改善。

应用场景

  • 深度神经网络隐藏层的首选激活函数

3.5 三种激活函数对比

Sigmoid Tanh ReLU
公式 1 1 + e − z \frac{1}{1 + e^{-z}} 1+ez1 e z − e − z e z + e − z \frac{e^z - e^{-z}}{e^z + e^{-z}} ez+ezezez max ⁡ ( 0 , z ) \max(0, z) max(0,z)
输出范围 ( 0 , 1 ) (0, 1) (0,1) ( − 1 , 1 ) (-1, 1) (1,1) [ 0 , + ∞ ) [0, +\infty) [0,+)
中心对称 否(以 0.5 为中心) 是(以 0 为中心)
梯度饱和 两端饱和 两端饱和 正半轴不饱和
主要用途 二分类输出层 RNN / LSTM 隐藏层(CNN/MLP)
是否用于逻辑回归

4. 损失函数

4.1 为什么 MSE 不合适?

在线性回归中我们使用均方误差(MSE)作为损失函数,因为线性回归的 y ^ \hat{y} y^ 是连续实数,MSE 衡量的是"预测值和真实值之间的欧氏距离"。

但在逻辑回归中,如果对 Sigmoid 输出用 MSE,损失函数会变成非凸函数,存在很多局部最小值,梯度下降容易卡在局部最优而出不来。所以需要一个与 Sigmoid 配合后能形成凸函数的损失函数,这就是对数似然损失。

直观解释

损失公式:
L MSE ( w ) = 1 2 [ ( σ ( w ⋅ 1 ) − 1 ) 2 + ( σ ( w ⋅ ( − 1 ) ) − 0 ) 2 ] L_{\text{MSE}}(w) = \frac{1}{2} \left[ (\sigma(w \cdot 1) - 1)^2 + (\sigma(w \cdot (-1)) - 0)^2 \right] LMSE(w)=21[(σ(w1)1)2+(σ(w(1))0)2]
即:
L MSE ( w ) = 1 2 [ ( σ ( w ) − 1 ) 2 + ( σ ( − w ) ) 2 ] L_{\text{MSE}}(w) = \frac{1}{2} \left[ (\sigma(w)-1)^2 + (\sigma(-w))^2 \right] LMSE(w)=21[(σ(w)1)2+(σ(w))2]

由于 Sigmoid 满足 σ ( − w ) = 1 − σ ( w ) \sigma(-w) = 1 - \sigma(w) σ(w)=1σ(w),代入上式可得:
L MSE ( w ) = 1 2 [ ( 1 − σ ( w ) ) 2 + ( 1 − σ ( w ) ) 2 ] = ( 1 − σ ( w ) ) 2 L_{\text{MSE}}(w) = \frac{1}{2} \left[ (1-\sigma(w))^2 + (1-\sigma(w))^2 \right] = (1-\sigma(w))^2 LMSE(w)=21[(1σ(w))2+(1σ(w))2]=(1σ(w))2

这个损失函数关于 (w) 的曲线大致如下(用文字模拟形状):

损失
 ^
 |           ___
 |          /   \
 |         /     \___________   ← 平坦区
 |        /
 |       / ← 一个急坡下去后迅速变平
 +----------------------------> w

它并非一个平滑的 U 形。当 (w) 很大时, σ ( w ) ≈ 1 \sigma(w) \approx 1 σ(w)1,损失接近 0;当 w w w 很小时(如 w → − ∞ w \to -\infty w), σ ( w ) ≈ 0 \sigma(w) \approx 0 σ(w)0,损失接近 1。但在 中间区域,损失下降得很快,而在两端几乎完全平坦。更重要的是,它可能呈现出 “高原 - 陡坡 - 高原” 的形状,梯度在大部分区域几乎为零。如果用梯度下降,初始点如果落在平坦区,就会因为梯度消失而无法更新;即便找到了一个谷底,也可能只是局部最小值。更复杂的真实数据下,由于梯度消失,优化器会感觉处处都是“平坦局部”,MSE 会呈现出大量局部极小值


4.2 对数似然损失(Log Loss / 交叉熵)

单个样本的损失

L ( y ^ , y ) = − [ y ⋅ ln ⁡ ( y ^ ) + ( 1 − y ) ⋅ ln ⁡ ( 1 − y ^ ) ] L(\hat{y}, y) = -[y \cdot \ln(\hat{y}) + (1 - y) \cdot \ln(1 - \hat{y})] L(y^,y)=[yln(y^)+(1y)ln(1y^)]

其中 y ^ = σ ( X w + b ) \hat{y} = \sigma(Xw + b) y^=σ(Xw+b) 是预测概率, y y y 是真实标签(0 或 1)。

全部 m 个样本的总损失(取平均)

J ( w , b ) = − 1 m ∑ i = 1 m [ y ( i ) ln ⁡ ( y ^ ( i ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − y ^ ( i ) ) ] J(w, b) = -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\ln(\hat{y}^{(i)}) + (1 - y^{(i)})\ln(1 - \hat{y}^{(i)})] J(w,b)=m1i=1m[y(i)ln(y^(i))+(1y(i))ln(1y^(i))]

请添加图片描述

拆开来看:

  • y = 1 y = 1 y=1(正例):损失只剩 − ln ⁡ ( y ^ ) -\ln(\hat{y}) ln(y^) 这一项。 y ^ \hat{y} y^ 越接近 1,损失越接近 0; y ^ \hat{y} y^ 越接近 0,损失越接近 + ∞ +\infty +
  • y = 0 y = 0 y=0(反例):损失只剩 − ln ⁡ ( 1 − y ^ ) -\ln(1 - \hat{y}) ln(1y^) 这一项。 y ^ \hat{y} y^ 越接近 0(即 1 − y ^ 1-\hat{y} 1y^ 越接近 1),损失越接近 0; y ^ \hat{y} y^ 越接近 1,损失越接近 + ∞ +\infty +

通俗理解: 这个损失函数做的事情就是,当你预测对了(正例给高概率、反例给低概率),惩罚接近 0;当你预测错了(正例给低概率、反例给高概率),给你一个巨大的惩罚。而且预测得越离谱,惩罚越大(对数函数的性质)。换句话说, y ^ \hat{y} y^ 越大表示模型越确信它是正例, − ln ⁡ ( y ^ ) -\ln(\hat{y}) ln(y^) 就越小,损失就越小。当 y ^ \hat{y} y^ 趋近于 1 时,损失趋近于 0,这就是我们追求的方向。


5. 优化方法

优化方法是梯度下降,思路和线性回归的梯度下降完全一致:沿着损失函数梯度的反方向(也就是下山最快的方向)一步步更新参数,直到走到谷底。详解请看线性回归梯度讲解

梯度下降法的核心迭代公式如下:
w new = w old − η ⋅ ∇ L ( w old ) \mathbf{w}{\text{new}} = \mathbf{w}{\text{old}} - \eta \cdot \nabla L(\mathbf{w}_{\text{old}}) wnew=woldηL(wold)

参数说明:

  • w old \mathbf{w}_{\text{old}} wold:当前
    迭代步的参数值,通常为向量形式。
  • w new \mathbf{w}_{\text{new}} wnew:更新后的参数值,用于下一次迭代。
  • ∇ L ( w old ) \nabla L(\mathbf{w}{\text{old}}) L(wold):损失函数 (L) 在参数 w old \mathbf{w}_{\text{old}} wold处的梯度,指向函数值上升最快的方向。
  • η \eta η:学习率(Learning Rate),为正标量,控制参数更新的步长。

按每次计算梯度使用的样本数量,分为三种:

类型 每次用的样本数 特点
批量梯度下降(BGD) 全部样本 梯度最准,但大数据集太慢
随机梯度下降(SGD) 1 个样本 快但不稳定,梯度波动大
小批量梯度下降(Mini-Batch GD) 一小批(如 32/64) 折中方案,最常用

6. 逻辑回归 API

6.1 导入与基本使用

# 模块:sklearn.linear_model(线性模型模块,逻辑回归在概念上继承自线性模型家族)
from sklearn.linear_model import LogisticRegression

# 创建模型
model = LogisticRegression(
    penalty='l2',      # 正则化类型:'l1'、'l2'、'elasticnet'、None
    C=1.0,             # 正则化强度的倒数(越小正则化越强,默认 1.0)
    solver='lbfgs',    # 优化求解器
    max_iter=100,      # 最大迭代次数
    multi_class='auto',# 多分类策略:'ovr'、'multinomial'、'auto'
    class_weight=None, # 类别权重,处理样本不均衡
    random_state=None  # 随机种子,保证结果可复现
)

# 训练
model.fit(X_train, y_train)

# 预测类别
y_pred = model.predict(X_test)

# 预测概率(返回每类概率,shape 为 (n_samples, n_classes))
y_proba = model.predict_proba(X_test)

# 预测对数概率
y_log_proba = model.predict_log_proba(X_test)

# 查看模型学到的参数
model.coef_      # 权重 w
model.intercept_ # 偏置 b

6.2 关键参数详解

  1. penalty(正则化类型)

逻辑回归支持三种正则化,和线性回归的正则化原理完全相同:

选项 含义 效果
'l2'(默认) L2 正则化(权重平方和) 缩小权重但不置零,防止过拟合
'l1' L1 正则化(权重绝对值和) 可将不重要特征的权重压到 0,附带特征选择
'elasticnet' L1 + L2 混合 两者折中,需配合 l1_ratio
None 不使用正则化 可能会过拟合
  1. C(正则化强度)

注意:C 是正则化强度的倒数,不是直接的正则化系数。它的含义是:

J t o t a l = C ⋅ J 原损失 + J 正则化项 J_{total} = C \cdot J_{原损失} + J_{正则化项} Jtotal=CJ原损失+J正则化项

  • C 越大 → 正则化越弱 → 模型越自由,可能过拟合
  • C 越小 → 正则化越强 → 模型越受约束,可能欠拟合

这和线性回归中的 λ \lambda λ(惩罚系数)正好是倒数关系。sklearn 的设计思路是"C = 置信度(Confidence)",你对原始数据越置信,正则化就越弱。

  1. solver(优化求解器)

不同 solver 在算法、速度和适用场景上有区别:

solver 支持的 penalty 适用场景
'lbfgs'(默认) L2 / None 中小数据集,多分类(multinomial),通用首选
'liblinear' L1 / L2 小数据集,二分类,支持 L1 正则化
'newton-cg' L2 / None 中大数据集,多分类
'sag' L2 / None 大数据集,比 lbfgs 更快但需要更多迭代
'saga' L1 / L2 / elasticnet / None 大数据集,支持所有正则化类型

选择建议:一般默认 'lbfgs' 就行;数据量超大(几十万以上)换成 'saga';需要用 L1 正则化且数据量小时用 'liblinear'

  1. multi_class(多分类策略)

    • 'ovr'(一对多):为每个类别训练一个二分类器,K 类 = K 个二分类器
    • 'multinomial'(多项):使用 Softmax,同时考虑所有类别,结果更准确但计算量大
    • 'auto'(默认):根据 solver 和数据自动选择

7. 分类评估标准

线性回归(回归任务)的评估用的是 MSE(均方误差)、MAE(平均绝对误差)、R²(决定系数),衡量的是"预测值和真实值差了多少"。

分类任务的评估与回归任务完全不同,预测是"对"或"错",关心的不是差值的大小,而是分类的准确性、漏判率、误判率等。核心工具是混淆矩阵

7.1 混淆矩阵

混淆矩阵是分类评估的起点,几乎所有分类指标都能从中推导出来。将预测结果与真实标签交叉统计,形成四个基础值:

预测正类 (Positive) 预测负类 (Negative)
真实正类 (1) TP (True Positive) FN (False Negative)
真实负类 (0) FP (False Positive) TN (True Negative)

请添加图片描述
四个格子的含义:

缩写 全称 含义
TP True Positive 预测为正例,实际也是正例(猜对了)
FP False Positive 预测为正例,实际是反例(错报/误报)
FN False Negative 预测为反例,实际是正例(漏报)
TN True Negative 预测为反例,实际也是反例(猜对了)

记忆技巧: 缩写的前半段 True/False 说的是"预测对了没",后半段 Positive/Negative 说的是"预测成了什么"。TP = 预测正确(True)且预测成正例(Positive);FP = 预测错误(False)但预测成正例(Positive)。读法是"T/F + P/N",不是"T + P/F + P"。


7.2 从混淆矩阵出发的四个核心指标

指标 公式 含义 关注点
准确率(Accuracy) T P + T N 全部 \frac{TP + TN}{全部} 全部TP+TN 所有样本中预测正确的比例 整体表现
精确率(Precision) T P T P + F P \frac{TP}{TP + FP} TP+FPTP 预测为正例的样本中,有多少真的是正例 宁缺毋滥,不要冤枉好人
召回率(Recall) T P T P + F N \frac{TP}{TP + FN} TP+FNTP 所有真实正例中,有多少被找到了 宁多勿漏,不要放走坏人
特异度(Specificity) T N T N + F P \frac{TN}{TN + FP} TN+FPTN 所有真实反例中,有多少被正确识别 真阴性率

精确率和召回率的取舍:

这两个指标通常是矛盾的,调高阈值提高精确率但降低召回率,调低阈值则反之。选择优先哪个取决于场景:

  • 宁缺毋滥(高精确率): 垃圾邮件过滤,宁可放过几封垃圾邮件,也不要把重要邮件误杀
    请添加图片描述

  • 宁多勿漏(高召回率): 癌症筛查,宁可让健康人做进一步检查,也不能漏掉一个潜在患者
    请添加图片描述

  • 两者兼顾: 用 F1-score


7.3 F1-score

F1 是精确率和召回率的调和平均

F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall} F1=2×Precision+RecallPrecision×Recall

为什么用调和平均而不是算术平均?假设 Precision = 1.0,Recall = 0.01,算术平均为 0.505,看着还行;但调和平均 ≈ 0.02,直接暴露了一端极差的事实。调和平均对极小值更敏感,只有当两者都不差时,F1 才高,这更符合"两者兼顾"的初衷。

还有一个带权重的变体 F β F_\beta Fβ
F β = ( 1 + β 2 ) × P r e c i s i o n × R e c a l l ( β 2 × P r e c i s i o n ) + R e c a l l F_\beta = (1 + \beta^2) \times \frac{Precision \times Recall}{(\beta^2 \times Precision) + Recall} Fβ=(1+β2)×(β2×Precision)+RecallPrecision×Recall

  • β = 1 \beta = 1 β=1 时就是标准 F1,两者同等重要
  • β > 1 \beta > 1 β>1 时召回率权重更大( β = 2 \beta = 2 β=2 即 F2-score)
  • β < 1 \beta < 1 β<1 时精确率权重更大( β = 0.5 \beta = 0.5 β=0.5 即 F0.5-score)

7.4 ROC 曲线与 AUC

ROC 曲线(Receiver Operating Characteristic):

假正例率(FPR = FP / (FP + TN))为横轴,真正例率(TPR = Recall = TP / (TP + FN))为纵轴,画出的曲线。

请添加图片描述

  • 横轴 FPR:所有负样本中被误判为正的比例(误报率)
  • 纵轴 TPR:所有正样本中被正确识别的比例(召回率)

曲线是怎么画出来的?逻辑回归输出的不是类别,而是概率。默认阈值 0.5,高于 0.5 判正。但阈值是可以变的,把阈值从 1 逐渐降到 0,每个阈值对应一组 (FPR, TPR),把这些点连起来就是 ROC 曲线。

  • 理想模型:ROC 曲线紧贴左上角(TPR 高、FPR 低)
  • 随机猜测:对角线

AUC(Area Under Curve): ROC 曲线下的面积,取值范围 0.5 ~ 1。

AUC 值 模型能力
0.5 和瞎猜一样
0.5 ~ 0.7 较差
0.7 ~ 0.85 一般
0.85 ~ 0.95 较好
0.95 ~ 1.0 非常好(但要警惕过拟合)

AUC 的直观意义: 随机抽取一个正例和一个负例,模型给正例的打分高于负例的概率。AUC = 0.9 意味着 90% 的情况下,正例的得分高于负例。这个解释比"曲线下面积"更直观。

ROC/AUC 的优点:不受类别不均衡的影响,即使正负样本比例 1:99,AUC 依然能客观反映模型的排序能力。因为这个定义只看正负样本得分的相对大小,完全不涉及“把概率大于 0.5 判为正类”这样的分类阈值。而 Accuracy 在这种情况下会失效(全判负也能 99% 准确率)。


7.5 分类评估 API(sklearn.metrics)

from sklearn.metrics import (
    confusion_matrix,          # 混淆矩阵
    accuracy_score,            # 准确率
    precision_score,           # 精确率
    recall_score,              # 召回率
    f1_score,                  # F1-score
    classification_report,     # 综合报告(一键输出以上所有)
    roc_auc_score,             # AUC 值
    roc_curve,                 # ROC 曲线数据
    log_loss                   # 对数损失
)

# 混淆矩阵
confusion_matrix(y_true, y_pred)
# 返回 shape (n_classes, n_classes) 的矩阵

# 综合分类报告(最常用,一锅出)
print(classification_report(y_true, y_pred, target_names=['负例', '正例']))
# 输出每类的 precision、recall、f1-score、support(样本数)

# AUC
roc_auc_score(y_true, y_proba)  # y_proba 是 predict_proba 输出的概率

以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。如果文章对你有帮助,别忘了点个赞、留个言,让更多的小伙伴看到~ 我们下篇再见!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐