对AUC的一些理解1.
AUC(Area Under ROC Curve)是对机器学习模型的一种性能度量,其直观的意义是ROC(Receiver Operating Characteristic)围成的面积,然而很多文章对AUC的计算公式与其直观意义“面积”的对应描述不甚明了,于是我花了一些时间研究了AUC的计算公式和几何意义,全是我个人理解,如有不对,还望指出。
本文代码在
https://github.com/luo3300612/MachineLearningPy/blob/master/Intuition/auc.ipynb
如果看不了,就复制上面这行到
https://nbviewer.jupyter.org/
代码上我参考了
https://www.zhihu.com/people/Enuok/activities
知乎的一个用户的写法,我也把他的代码放在我的仓库里用来对比。
要想理解AUC,得从混淆矩阵说起。
混淆矩阵
对于一个二分类问题,每个样例有自己的真实类别和模型给出的预测类别,真实类别和预测类别都分别有两种,定义标记为1的为正例,标记为0的为反例,当我们在测试集上使用模型分类时,会有以下四种情况。
标记为正例 | 标记为反例 | |
---|---|---|
实际为正例 | 真正例(True-Positive) | 假反例(False-Negative) |
实际为反例 | 假正例(False-Positive) | 真反例(True-Negative) |
下面我们用TP、FN、FP、TN分别表示四种结果的样本个数。
分类
在一个二分类问题中,往往我们的预测输出是一个0-1之间的数字,为了得到新的样本的类别,我们需要选择一个阈值来将这些预测结果进行分类,假设
xk
x
k
是待分类的样本,
f(x)
f
(
x
)
是模型对
x
x
的预测值,通过一个阈值(这里以0.5为例)将
x
x
区分为正例或反例。
ROC曲线
基本概念
当我们有了混淆矩阵的概念以及对测试集上样本分类的概念之后,我们就可以绘制ROC曲线,在测试集上,我们使用模型对测试集样本进行预测后,在某个阈值下进行分类得到TP、FN、FP、TN,计算真正例率 TPR T P R (True Positive Rate)和假正例率 FPR F P R (False Positive Rate)
TPR
T
P
R
的直观理解就是在所有正例中被模型预测为正例的样本所占比率,
FPR
F
P
R
就是在所有反例中被模型误判为正例的样本所占比率,例如在所有10个正例样本,4个被判定为正例,6个被判定为反例,于是有4个真正例,则
TPR=0.4
T
P
R
=
0.4
,在所有10个反例样本中,3个被判断为正例,7个被判断为反例,于是有3个假反例,则
FPR=0.3
F
P
R
=
0.3
。如果你知道召回率(Recall)的话,其实
TPR
T
P
R
就是召回率。注意到二者的分母对于同一个样本集是一个定值,分别是样本中真实标记为正例和真实标记为反例的个数。
现在,针对不同的阈值
k
k
,我们都有一个点,于是以
FPR
F
P
R
为横坐标,
TPR
T
P
R
为纵坐标,将所有的点画在坐标系上,我们就能得到ROC曲线。
ROC曲线的绘制
在绘制ROC曲线的时候,我们当然不会遍历所有的实数阈值 k k (事实上这也不可能),下面在有限样例的情况下绘制ROC曲线的实例,以样例数为例,10个样例的预测结果和真实类别如下。
样例 | x1 x 1 | x2 x 2 | x3 x 3 | x4 x 4 | x5 x 5 | x6 x 6 | x7 x 7 | x8 x 8 | x9 x 9 | x10 x 10 |
---|---|---|---|---|---|---|---|---|---|---|
预测结果 | 0.06 | 0.47 | 0.50 | 0.94 | 0.83 | 0.90 | 0.73 | 0.07 | 0.50 | 0.27 |
真实类别 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
举个例子,如果阈值 k=0.5 k = 0.5 ,则混淆矩阵为
标记为正例 | 标记为反例 | |
---|---|---|
实际为正例 | 3 | 3 |
实际为反例 | 3 | 1 |
假设我们设置
k
k
从1开始,从大到小搜索的值,我们发现,当我们取
k∈[0.08,0.26]
k
∈
[
0.08
,
0.26
]
时,混淆矩阵对于这个区间上的所有
k
k
是一样的,因为没有改变任何样本的预测类别,这是因为没有样本的预测结果在中。进而我们发现,只要我们
k
k
的变化没有使它从大于某个预测值到小于某个预测值时,我们的分类结果都不会发生改变,因此,只需要从大到小地遍历所有的预测值,就可以得到ROC曲线上的所有点了。
有一个问题是,为什么要从大到小遍历,不可以随机地在所有样本中取k吗?其实,从大到小遍历是为了作图的方便,也是一种作图的规定。下面我们就能看到。
为了从大到小遍历
k
k
,将样本按照预测值从大到小排序,重新编号(因为编号不影响结果),得到
样例 |
x2
x
2
x3
x
3
x4
x
4
x5
x
5
x6
x
6
x7
x
7
x8
x
8
x9
x
9
x10
x
10
预测结果 0.94 0.90 0.83 0.73 0.50 0.50 0.47 0.27 0.07 0.06 真实类别 0 0 1 0 1 1 1 1 0 1
记正样本个数为
m+
m
+
,负样本个数为
m−
m
−
,取
k=1
k
=
1
,此时所有样例都被分为反例,因此真正例和假正例的比率均为0,对应原点
(0,0)
(
0
,
0
)
,接下来,根据上表的预测结果,从左到右依次取
k=0.94,0.90,0.83....
k
=
0.94
,
0.90
,
0.83....
,过程等同于逐个地将样本判断为正例(
k=0.94
k
=
0.94
时,
x1
x
1
就是正例,其余都是反例,
k=0.90
k
=
0.90
时,
x1,x2
x
1
,
x
2
是正例,其余是反例,以此类推),若前一个标记点是
(x,y)
(
x
,
y
)
,若下一个加入到正例中的样本真实类别是正例,说明我们多了一个
TP
T
P
,回顾真正例率的计算公式,正例样本不变,多了一个正例,则正例率相应提高
1m+
1
m
+
,对应标记点为
(x,y+1m+)
(
x
,
y
+
1
m
+
)
,若下一个加入到正例中的样本真实类别是反例,则多了一个
FP
F
P
,假反利率相应提高
1m−
1
m
−
,则对应标记点为
(x+1m−,y)
(
x
+
1
m
−
,
y
)
,然后用线段连接相应的点即可得到ROC曲线。(在这里我强烈建议读者能自己在草稿纸上尝试着画一下,以便后续的理解) AUCAUC是ROC曲线与x轴围成的面积,越大说明分类器的效果越好,还是看上图,通常情况下,ROC曲线是覆盖红线的,因为一般机器学习得到的算法分类效果总会比瞎猜要好(好低的标准),蓝线是我随机生成的,在红线下面也情有可原。
AUC=1−1m+m−∑x+∈D+∑x−∈D−(W(f(x+)<f(x−))+12W(f(x+)=f(x−)))
A
U
C
=
1
−
1
m
+
m
−
∑
x
+
∈
D
+
∑
x
−
∈
D
−
(
W
(
f
(
x
+
)
<
f
(
x
−
)
)
+
1
2
W
(
f
(
x
+
)
=
f
(
x
−
)
)
)
这是周志华老师《机器学习》上的公式,其中
D+
D
+
为所有正例组成的集合,
x+
x
+
是其中的一个正例,
D−
D
−
为所有反例组成的集合,
x−
x
−
是其中的一个反例,
f(x)
f
(
x
)
是模型对样本
x
x
的预测结果,在0-1之间,仅在
x
x
为真时取1,否则取0。 第一个等号成立是因为三个 W W 有且仅有一个为1(不是大于就是小于就是等于,只有其一满足) 则 问题简化为了方便我们建立公式定义和图像定义之间对应的Intuition,我们先假设不存在正反例对使得
f(x+)=f(x−)
f
(
x
+
)
=
f
(
x
−
)
成立,从而
AUC=1m+m−∑x+∈D+∑x−∈D−(W(f(x+)>f(x−)))
A
U
C
=
1
m
+
m
−
∑
x
+
∈
D
+
∑
x
−
∈
D
−
(
W
(
f
(
x
+
)
>
f
(
x
−
)
)
)
现在我们要结合之前画ROC曲线的步骤,令
g(t)=当我们将第t个反例加入到判定为正例的集合中时,之前一共加入的样例数
g
(
t
)
=
当
我
们
将
第
t
个
反
例
加
入
到
判
定
为
正
例
的
集
合
中
时
,
之
前
一
共
加
入
的
样
例
数
这个定义稍先复杂,但是其实含义十分简单,比如我依次将正例、反例、反例、正例……加入到初始为空的正例集合中时,先加入正例,再加入反例,注意这是我们加入的第一个反例,但是却是我们加入的第二个样例,因此 g(1)=2 g ( 1 ) = 2 ,继续下去,加入反例,注意这是我们加入的第二个反例,却是我们加入的得3个样例,因此 g(2)=3 g ( 2 ) = 3 ,再加入正例……为什么要定义这样的一个奇怪的函数?再次看到我们之前画的ROC图, ![]() 为了求ROC曲线和x轴围城的面积,我们将目标区域沿着x轴划分为一个个宽为 1m− 1 m − 的矩形,注意到 1m− 1 m − 是我们在作图中在得到的下一个样例是反例时,横坐标 x x 向右移动的步长,划分后的矩形如图所示,因为在 [0,0.5] [ 0 , 0.5 ] 上恒为0,因此这部分的矩形的面积是0,这个时候我们确定了矩形的宽, 那么矩形的长呢? 通过思考矩形的生成过程,我们可以知道,横坐标 x x 每向右移动一次会生成一个矩形,而横坐标向右移动 1m− 1 m − ,当且仅当我们下一个样例是反例,因此,第 t t 个矩形是我们取到的第个反例时,横坐标向右移动形成的。此时,根据 g g 的定义,我们恰好取到了个正样例,因此对应的纵坐标就是 g(t)−tm+ g ( t ) − t m + ,从而ROC与x轴围城的面积是
AUC=∑t=1m−1m−g(t)−tm+=1m+m−∑t=1m−(g(t)−t)
A
U
C
=
∑
t
=
1
m
−
1
m
−
g
(
t
)
−
t
m
+
=
1
m
+
m
−
∑
t
=
1
m
−
(
g
(
t
)
−
t
)
因为这一共有 g(t)−t g ( t ) − t 个正例在第t个反例之前取到,因此这 g(t)−t g ( t ) − t 个正例的预测值均大于第t个反例的预测值,也即
g(t)−t=∑x+∈D+(W(f(x+)>f(xt)))
g
(
t
)
−
t
=
∑
x
+
∈
D
+
(
W
(
f
(
x
+
)
>
f
(
x
t
)
)
)
代入,得
AUC=1m+m−∑x+∈D+∑t=1m−(W(f(x+)>f(xt)))
A
U
C
=
1
m
+
m
−
∑
x
+
∈
D
+
∑
t
=
1
m
−
(
W
(
f
(
x
+
)
>
f
(
x
t
)
)
)
用面积定义计算出的结果和之前的公式一致。 原问题现在问题来了,那个二分之一的项究竟代表什么呢?为什么要乘二分之一,而不把它和某个不等式合并成小于等于或者大于等于呢?
AUC=1m+m−∑x+∈D+∑x−∈D−(W(f(x+)>f(x−))+12W(f(x+)=f(x−)))
A
U
C
=
1
m
+
m
−
∑
x
+
∈
D
+
∑
x
−
∈
D
−
(
W
(
f
(
x
+
)
>
f
(
x
−
)
)
+
1
2
W
(
f
(
x
+
)
=
f
(
x
−
)
)
)
当存在
x+
x
+
和
x−
x
−
满足
f(x+)=f(x−)
f
(
x
+
)
=
f
(
x
−
)
时,回到我们画ROC图的步骤,记得在画图之前,我们需要对样例进行排序吗,如果存在
f(x+)=f(x−)
f
(
x
+
)
=
f
(
x
−
)
,我们该把哪个排在前面呢?
也就是我们把正例排在反例前面,结果得到的ROC图如下,
画出的ROC曲线如下
08-19
评论 9
![]() ![]() ![]()
查看更多评论
![]()
添加红包
![]() ![]() |
---|