AUC指标深度理解

AUC 指标

直观意义

AUC 指标用于评价分类器对于正、负样例的辨别能力,对出结果的排序位置(按照预测为正例的概率)敏感。

为什么提出这个指标?

image-20200524222822650

一般来讲,精确率、召回率等指标,都需要设定一个阈值去判别是属于正类还是负类,例如预测分大于等于0.5判别为正类,小于0.5判别为负类。如何设定这个阈值,是个问题。而AUC这个指标则不需要设阈值。(或者说,每种阈值的情况都考虑了,下面介绍)

计算方式

利用ROC所围面积计算

ROC 如何计算

要计算ROC需要明确混淆矩阵的概念

首先,混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下:

  • 算法给出的,预测类别为1的为Positive(阳性),预测类别为0的为Negative(阴性)
  • 数据集中,真实类别为1的为True(真), 真实类别为0的为False(伪)

于是就有这个混淆矩阵图:

在这里插入图片描述

其次, ROC 使用的是True Positive Rate(真阳率)、False Positive(伪阳率)两个概念:

[TPR=frac{TP}{TP+FN}=frac{TP}{P} ]

[FPR=frac{FP}{FP+TN}=frac{FP}{N} ]

其中,(P) 是所有真实标签为1的数量,(N)是所有真实标签为0的数量

因此,

TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。

FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。

这两个指标均指出公式围绕预测类别为1进行讨论。

绘制ROC曲线:

曲线的起点和终点是(0,0)和(1,1)

如果(TPR=FPR) 即随机猜测,如图所示

image-20200322145656008

举个简单栗子:

img

通过上述混淆矩阵算法,我们可以得到

img

进而算得TPRate=3/4,FPRate=2/4,得到ROC曲线:

img

上述栗子是一个硬分类问题,也就是预测结果要么0,要么1. 如果给出预测概率的呢?下面的栗子:

img

这时候,我们只需要设置一个阈值,就可以把上面的预测概率转换为0,1这样的硬分类结果,然后套用上面的操作即可画出当前阈值的一个点。

利用ROC面积计算AUC

  • AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

上面提到当设置一个阈值就可以得到 ROC 曲线上的一个点,对于 AUC 计算,我们实际上就是要把所有阈值都考虑进去(也就是上文提出使用AUC指标的要解决的问题)。

如下图中,我们要设置阈值为0.8,0.6,0.5,0.3依次计算(TPR,FPR),进而绘制 ROC 曲线

在这里插入图片描述

上图给出了一个很简单的例子。四个样本,按预测分高到低排序,从上到下依次找到四个阈值(红线),每个阈值的情况下,分别计算出TPR和FPR(分子只统计红线上面的,因为红线下面在阈值以下,也就是说都是预测为阴性的结果,不在公式的计数范围内),并描点,再用线段相连,最后计算出曲线下面的面积(该例子AUC=0.75)。

注:

如果按照阈值排序后,有相同的阈值,那么也是重复计算,只需按照每次下移一行画红线即可

概率角度

一种本质的理解为: 随机给定一个正样本和一个负样本,分类器输出该正样本为正的那个概率值 比 分类器输出该负样本为正的那个概率值 要大的可能性。

暴力求解

按照上面提到的,我们需要统计随机抽取的一对样本,按照上述含义进行计算,即一下公式

举个栗子:

ID label probability
A 0 0.1
B 0 0.4
C 1 0.35
D 1 0.8

假设有4条样本。2个正样本,2个负样本,那么(M*N=4)。即总共有4个样本对。分别是:
((D,B),(D,A),(C,B),(C,A))
((D,B))样本对中,正样本(D)预测的概率大于负样本(B)预测的概率(也就是(D)的得分比(B)高),记为1
同理,对于((C,B))。正样本(C)预测的概率小于负样本(C)预测的概率,记为0.

最后可以算得,总共有3个符合正样本得分高于负样本得分,故$$AUC=frac{1+1+0+1}{4}=0.75$$

当得分(probability)有一样(0.4)的情况:

ID label probability
A 0 0.1
B 0 0.4
C 1 0.4
D 1 0.8

同样本是4个样本对,对于样本对((C,B))其I值为0.5。

[AUC=frac{1+1+0.5+1}{4}=0.875 ]

为什么说这个方法暴力呢?

因为,我们需要罗列出所有正例,负例的组合,相当于一个笛卡尔积,如果正例和负例都很多的情况下,那么这个笛卡尔积的集合很大,计算很费时间。

通过观察可以发现,(D,B),(D,A)统计过程中,由于 (D) 的得分很高,我们可以通过一次排序直接数出来比 (D)小的有多少个,并不需要全部罗列出来。因此,产生下面的计算方式。

计数统计

img

ID label probability Rank
D 1 0.8 4
B 0 0.4 3
C 1 0.35 2
A 0 0.1 1

按照公式计算:

(AUC=frac{4+2-frac{2(2+1)}{2}}{2 imes2}=frac{3}{4}=0.75)

与上面计算方法得到的结果一样,但是我们只需要排序一下,不需要笛卡尔积运算,排序的复杂度是 log 级别的

如果得分有相同的:

ID label probability Rank
G 0 0.3 1
F 1 0.5 2
E 1 0.5 3
D 0 0.5 4
C 0 0.5 5
B 1 0.7 6
A 1 0.8 7

这里需要注意的是:相等概率得分的样本,无论正负,谁在前,谁在后无所谓。

由于只考虑正样本的rank值:

对于正样本A,其rank值为7

对于正样本B,其rank值为6

对于正样本E,其rank值为(5+4+3+2)/4

对于正样本F,其rank值为(5+4+3+2)/4

上述公式简单推导

经过排序后,按照概念我们只需要找出 正例得分大于负例的(正,负)对的数量即可。

首先,排序后最大的rank就是全部样例的总数。

在所有正例中(P个),

排在第一(No1)的(D),统计比他小的所有负例个数,即 (rank-1-(P-No)=4-1-(2-1)=2)也就是 ((D,B),(D,A))

排在第二(No2)的(C), 统计比他小的所有负例个数,(rank-1-(P-No)=2-1-(2-2)=1)也就是((C,A))

所以$$AUC=frac{2+1}{4}=0.75$$

如果用一个公式来表示:

[AUC=frac{sum_{1}^{P}{rank-1-(P-no)}}{P imes N}=frac{sum_{1}^{P}{rank}-(P+(P-1)+(P-2)+...+1)}{P imes N}=frac{sum_{1}^{P}{rank}-frac{P(P+1)}{2}}{P imes N} ]

常数项就是一个等差数列

代码

import numpy as np
from sklearn.metrics import roc_auc_score

y_true = np.array([1, 1, 0, 0, 1, 1, 0])
y_scores = np.array([0.8, 0.7, 0.5, 0.5, 0.5, 0.5, 0.3])
print('y_true', y_true)
print('y_score', y_scores)
print(roc_auc_score(y_true, y_scores))

y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('y_true', y_true)
print('y_score', y_scores)
print(roc_auc_score(y_true, y_scores))

image-20200524214553915

参考

  1. https://blog.csdn.net/weixin_37683979/article/details/87882943
  2. https://www.zhihu.com/question/39840928
原文地址:https://www.cnblogs.com/TianyuSu/p/12953812.html