欢迎来到我的主页:【Echo-Nie】
本篇文章收录于专栏【机器学习】
1 ROC曲线基础
接收者操作特性曲线(Receiver Operating Characteristic Curve,简称ROC曲线)是机器学习领域中用于评估二分类模型性能的重要工具之一。它不仅能够展示模型在不同阈值下的表现,还能帮助我们找到最佳的决策点。
ROC曲线是一种坐标图式的分析工具,横轴表示假正类率(False Positive Rate, FPR),纵轴表示真正类率(True Positive Rate, TPR)。
-
TPR(True Positive Rate):也称为灵敏度(Sensitivity)或召回率(Recall),公式为:
TPR = TP TP + FN \text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}} TPR=TP+FNTP -
假正例率FPR:
FPR = FP FP + TN \text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}} FPR=FP+TNFP
2 使用SKLearn绘制ROC曲线
为了绘制ROC曲线,我们需要做以下几步:
- 对于给定的分类器和测试集,首先确定一个初始的阈值。
- 根据这个阈值对测试集进行分类,得到混淆矩阵,并据此计算TPR和FPR。
- 改变阈值,重复步骤2,直到遍历所有可能的阈值。
- 将所有的(FPR, TPR)点连成一条曲线,即为ROC曲线。
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
import numpy as np
# 假设真实标签
y_true = np.array([0] * 90 + [1] * 10) # 90个负类和10个正类
# 假设模型预测的概率得分
# 让正类的得分显著高于负类,以获得更好的区分能力
y_scores = np.concatenate([np.random.rand(80) * 0.1, np.random.rand(20) * 0.9 + 0.1])
# 计算ROC曲线上的点
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
# 计算AUC值
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
3 ROC与AUC
3.1 AUC的定义
AUC是指ROC曲线下方的面积,它的取值范围是从0到1。AUC的具体含义是:如果随机选择一个正样本和一个负样本,分类器将正样本排在负样本前面的概率。具体来说:
AUC = P ( y ^ + > y ^ − ) \text{AUC} = P(\hat{y}_+ > \hat{y}_-) AUC=P(y^+>y^−)
其中 y ^ + \hat{y}_+ y^+ 和 y ^ − \hat{y}_- y^− 分别是模型对正样本和负样本的预测得分。
因此,AUC实际上衡量了模型区分正负样本的能力。
3.2 AUC与ROC曲线的关系
-
ROC曲线上的点:
- ROC曲线上的每一个点代表了一组特定的 F P R FPR FPR 和 T P R TPR TPR 值,这组值是在某个特定的决策阈值下计算出来的。
- 当阈值从高到低变化时,我们得到一系列的 ( F P R , T P R ) (FPR, TPR) (FPR,TPR) 点,这些点连成一条曲线,即ROC曲线。
-
AUC作为ROC曲线下的面积:
- AUC是ROC曲线下方的面积,它综合反映了模型在不同阈值下的整体表现。
- 如果一个模型能够完美地分离正负样本,那么ROC曲线会尽可能靠近左上角,对应的AUC接近于1。
- 如果模型的表现相当于随机猜测,那么ROC曲线会是一条从 ( 0 , 0 ) (0,0) (0,0) 到 ( 1 , 1 ) (1,1) (1,1) 的对角线,AUC等于0.5。
-
AUC的计算方法:
可以通过数值积分的方法计算,也可以使用一些简化公式。使用sklearn.metrics.auc
函数来计算AUC。
为了更好地理解AUC的意义,我们可以从数学角度进行推导。
假设我们有两个样本 x + x_+ x+ 和 x − x_- x−,分别代表正样本和负样本。设模型对这两个样本的预测得分为 y ^ + \hat{y}_+ y^+ 和 y ^ − \hat{y}_- y^−。根据AUC的定义:
$ \text{AUC} = P(\hat{y}+ > \hat{y}-) $
这意味着我们需要计算所有可能的正负样本对中,正样本得分大于负样本得分的概率。
3.3 AUC计算步骤
- 假设有 N N N 个正样本和 M M M 个负样本,分别计算每个样本的预测得分。
- 将所有样本的得分按降序排列。
- 对于每一对正负样本,计算正样本得分大于负样本得分的概率。
- 这可以通过比较两个样本的排名来实现。如果正样本的排名高于负样本,则认为该对样本满足条件。
计算公式如下:
设正样本集合为 P P P,负样本集合为 N N N。对于任意一对正样本 p ∈ P p \in P p∈P 和负样本 n ∈ N n \in N n∈N,如果 p p p 的得分大于 n n n 的得分,则该对样本计数加1。
AUC = ∑ p ∈ P ∑ n ∈ N I ( y ^ p > y ^ n ) ∣ P ∣ ⋅ ∣ N ∣ \text{AUC} = \frac{\sum_{p \in P} \sum_{n \in N} I(\hat{y}_p > \hat{y}_n)}{|P| \cdot |N|} AUC=∣P∣⋅∣N∣∑p∈P∑n∈NI(y^p>y^n)
其中, I ( ⋅ ) I(\cdot) I(⋅) 是指示函数,当条件成立时返回1,否则返回0。
∑ p ∈ P ∑ n ∈ N \sum_{p \in P} \sum_{n \in N} ∑p∈P∑n∈N:这部分表示对所有可能的正样本 p p p 和负样本 n n n 对进行求和。换句话说,就是遍历每个正样本和每个负样本的所有组合。
I ( y ^ p > y ^ n ) I(\hat{y}_p > \hat{y}_n) I(y^p>y^n):这是指示函数,当条件 y ^ p > y ^ n \hat{y}_p > \hat{y}_n y^p>y^n 成立时(即正样本的预测得分大于负样本的预测得分),返回值为1;否则返回0。通过这个函数,我们能够量化有多少对正样本和负样本满足正样本得分高于负样本得分这一条件。
∣ P ∣ |P| ∣P∣ 和 ∣ N ∣ |N| ∣N∣:分别代表正样本集合 P P P 和负样本集合 N N N 中元素的数量,也就是正样本和负样本的总数。
∑ I ( y ^ p > y ^ n ) ∣ P ∣ ⋅ ∣ N ∣ \frac{\sum I(\hat{y}_p > \hat{y}_n)}{|P| \cdot |N|} ∣P∣⋅∣N∣∑I(y^p>y^n):整个分数部分计算的是所有正样本得分大于负样本得分的概率。分母 ∣ P ∣ ⋅ ∣ N ∣ |P| \cdot |N| ∣P∣⋅∣N∣ 表示总的比较次数,而分子则是这些比较中符合条件(正样本得分大于负样本得分)的次数总和。因此,AUC实际上给出了模型在所有可能的正负样本对中正确排序的比例。
4 ROC曲线与AUC的最差表现分析
为什么说最差是0.5,而不是0呢?
设分类模型对样本的预测得分为随机变量 S S S,真实标签为 Y ∈ { 0 , 1 } Y \in \{0,1\} Y∈{0,1}。对于任意阈值 t t t,定义:
- 真阳性率: TPR ( t ) = P ( S > t ∣ Y = 1 ) \text{TPR}(t) = P(S > t \mid Y=1) TPR(t)=P(S>t∣Y=1)
- 假阳性率: FPR ( t ) = P ( S > t ∣ Y = 0 ) \text{FPR}(t) = P(S > t \mid Y=0) FPR(t)=P(S>t∣Y=0)
ROC曲线是TPR关于FPR的参数曲线(参数为 t t t),AUC(Area Under Curve)是曲线下的面积。
4.1 最差情况:模型无区分能力
当模型完全随机(即预测得分
S
S
S 与标签
Y
Y
Y 独立)时,正例和负例的得分分布相同:
S
∣
Y
=
1
=
d
S
∣
Y
=
0
S \mid Y=1 \stackrel{d}{=} S \mid Y=0
S∣Y=1=dS∣Y=0
此时,对于任意阈值
t
t
t,有:
TPR
(
t
)
=
FPR
(
t
)
\text{TPR}(t) = \text{FPR}(t)
TPR(t)=FPR(t)
因此,ROC曲线退化为直线
TPR
=
FPR
\text{TPR} = \text{FPR}
TPR=FPR,即从
(
0
,
0
)
(0,0)
(0,0) 到
(
1
,
1
)
(1,1)
(1,1) 的对角线。该直线下的面积为:
AUC
=
∫
0
1
TPR
d
FPR
=
∫
0
1
x
d
x
=
1
2
\text{AUC} = \int_{0}^{1} \text{TPR} \, d\text{FPR} = \int_{0}^{1} x \, dx = \frac{1}{2}
AUC=∫01TPRdFPR=∫01xdx=21
4.2 为何AUC不能低于0.5?
若模型预测能力比随机更差(即 TPR ( t ) < FPR ( t ) \text{TPR}(t) < \text{FPR}(t) TPR(t)<FPR(t) 对所有 t t t 成立),则ROC曲线位于对角线下方,此时AUC < 0.5。然而,这种情况可通过反转模型的预测方向(如将正类预测为负类,负类预测为正类)转化为AUC > 0.5。
因此,实际应用中,AUC的取值范围被约束为 [ 0.5 , 1 ] [0.5, 1] [0.5,1],最差情况为0.5。
4.3 数学证明:AUC的期望值为0.5时模型随机
AUC的另一种定义是:随机选取一个正例和一个负例,模型对正例的预测得分高于负例的概率:
AUC = P ( S 1 > S 0 ∣ Y 1 = 1 , Y 0 = 0 ) \text{AUC} = P(S_1 > S_0 \mid Y_1=1, Y_0=0) AUC=P(S1>S0∣Y1=1,Y0=0)
这里, S 1 S_1 S1 是正例的预测得分, S 0 S_0 S0 是负例的预测得分, Y 1 = 1 Y_1=1 Y1=1 表示正例, Y 0 = 0 Y_0=0 Y0=0 表示负例。
当模型随机时, S 1 S_1 S1 和 S 0 S_0 S0 独立同分布,因此:
P
(
S
1
>
S
0
)
+
P
(
S
1
<
S
0
)
+
P
(
S
1
=
S
0
)
=
1
P(S_1 > S_0) + P(S_1 < S_0) + P(S_1 = S_0) = 1
P(S1>S0)+P(S1<S0)+P(S1=S0)=1
由于
S
1
S_1
S1 和
S
0
S_0
S0 连续分布时
P
(
S
1
=
S
0
)
=
0
P(S_1 = S_0) = 0
P(S1=S0)=0,故:
P ( S 1 > S 0 ) = P ( S 1 < S 0 ) = 1 2 P(S_1 > S_0) = P(S_1 < S_0) = \frac{1}{2} P(S1>S0)=P(S1<S0)=21
比如说现在有一个模型,它完全随机地给正例和负例打分。模型对正例和负例的预测没有任何区别,就像抛硬币一样,正反面出现的概率都是50%。在这种情况下,AUC的值就是0.5,因为模型没有任何区分能力。
小总结:
- 最差AUC为0.5:当模型无区分能力时,ROC曲线为对角线,AUC=0.5。
- AUC < 0.5的情况:仅当模型具有反向预测能力时出现,此时可通过反转预测方向使AUC > 0.5。
- 数学本质:AUC=0.5对应随机猜测,是分类器性能的理论下限。