【机器学习|DAY05】逻辑回归(Logistic Regression)笔记
逻辑回归
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. 工作流程
逻辑回归和线性回归一样,遵循"训练-预测"两阶段流程。前半段(算线性分值)与线性回归一致,区别在于最后的输出映射和损失函数。
训练阶段(让机器自己总结规律)
-
接收训练数据
给定 m个样本,每个样本有 n个特征,对应的真实标签 y∈{0,1}。 -
定义模型形式
线性部分: z = X ⋅ w + b z = X \cdot w + b z=X⋅w+b
分类映射: y ^ = σ ( z ) = 1 1 + e − z \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} y^=σ(z)=1+e−z1
其中 w 和 b 是待学习的参数,σ 为 Sigmoid 函数。 -
初始化参数
通常将所有权重 w 和偏置 b 初始化为随机值或零。 -
定义损失函数
由于输出不再是连续值,使用 对数似然损失(Log Loss),也叫交叉熵损失,能保证损失函数是凸函数,方便优化。 -
选择优化算法
损失函数没有解析解(不像线性回归有正规方程),因此只能用迭代优化算法,如 梯度下降。为什么不选正规方程?因为 Sigmoid 函数的引入使损失函数变得复杂,正规方程要求损失函数对参数求导后等于零能直接求解,但对逻辑回归来说,这会变成一个超越方程,无法一步解出。因此必须采用梯度下降类方法逐步逼近最优解。
-
迭代更新参数
- 计算损失函数关于 w 和 b 的梯度;
- 沿负梯度方向更新参数,学习率 η 控制步长;
- 重复直到损失收敛或达到最大迭代次数。
-
输出训练好的模型:保存最终的 w 和 b,训练结束。
预测阶段
- 接收新样本: x new x_{\text{new}} xnew
- 计算线性得分: z = x new ⋅ w + b z = x_{\text{new}} \cdot w + b z=xnew⋅w+b
- 通过 Sigmoid 映射: p = 1 1 + e − z p = \frac{1}{1 + e^{-z}} p=1+e−z1,得到正类概率
- 阈值判定:设定阈值为 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+e−z1

理解:
- 当 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+e−z)2e−z=1+e−z1⋅1+e−ze−z=σ(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+e−zez−e−z
理解:也是 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+e−2z2−1+e−2z1+e−2z=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+e−z1 | e z − e − z e z + e − z \frac{e^z - e^{-z}}{e^z + e^{-z}} ez+e−zez−e−z | 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[(σ(w⋅1)−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)=−[y⋅ln(y^)+(1−y)⋅ln(1−y^)]
其中 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=1∑m[y(i)ln(y^(i))+(1−y(i))ln(1−y^(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(1−y^) 这一项。 y ^ \hat{y} y^ 越接近 0(即 1 − y ^ 1-\hat{y} 1−y^ 越接近 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 关键参数详解
- penalty(正则化类型)
逻辑回归支持三种正则化,和线性回归的正则化原理完全相同:
| 选项 | 含义 | 效果 |
|---|---|---|
'l2'(默认) |
L2 正则化(权重平方和) | 缩小权重但不置零,防止过拟合 |
'l1' |
L1 正则化(权重绝对值和) | 可将不重要特征的权重压到 0,附带特征选择 |
'elasticnet' |
L1 + L2 混合 | 两者折中,需配合 l1_ratio |
None |
不使用正则化 | 可能会过拟合 |
- C(正则化强度)
注意:C 是正则化强度的倒数,不是直接的正则化系数。它的含义是:
J t o t a l = C ⋅ J 原损失 + J 正则化项 J_{total} = C \cdot J_{原损失} + J_{正则化项} Jtotal=C⋅J原损失+J正则化项
C越大 → 正则化越弱 → 模型越自由,可能过拟合C越小 → 正则化越强 → 模型越受约束,可能欠拟合
这和线性回归中的 λ \lambda λ(惩罚系数)正好是倒数关系。sklearn 的设计思路是"C = 置信度(Confidence)",你对原始数据越置信,正则化就越弱。
- 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'。
-
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 输出的概率
以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。如果文章对你有帮助,别忘了点个赞、留个言,让更多的小伙伴看到~ 我们下篇再见!
更多推荐




所有评论(0)