文章目录
1. 混淆矩阵
在了解ROC之前,我们首先来了解一下混淆矩阵。
对于给出的一个二分类问题,在混淆矩阵中:
-
横向表示样本对应的标签正例和负例的真实情况。
-
纵向表示样本对应的标签正例和负例的预测情况。
其中:
- TP: 表示predict为True, label为positive的情况。
- FP: 表示predict为False, label 为positive的情况。
- TN: 表示predict为True, label 为negativ的情况。
- FN: 表示predict为False, label 为negative的情况。
在此基础上衍生出来其他一些评价指标的计算包括:
- 准确率
表示在所有的样本中,我们预测正确的结果的概率。
a c c u r c y = T P + T N T N + T P + F N + F P accurcy = \frac{TP + TN}{TN + TP + FN + FP} accurcy=TN+TP+FN+FPTP+TN
- 召回率
表示在所有label为positive的样本中,被我们预测为postive的结果概率。
r e c a l l = T P T P + F N recall = \frac{TP}{TP + FN} recall=TP+FNTP
- 精确率
表示在所有predict为positive的样本中,被我们预测正确的结果的概率。
p
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
precision = \frac{TP}{TP + FP}
precision=TP+FPTP
2. ROC
2.1 什么是ROC
在维基百科中对ROC的解释:
A receiver operating characteristic curve, or ROC curve, is a graphical plot that illustrates the diagnostic ability of a binary classifier system as its discrimination threshold is varied.
接收器操作特性曲线(ROC曲线)是一个当二进制分类器系统的鉴别阈值变化时,用来说明这个系统判断能力的曲线。
其中横轴表示FPR,纵轴表示TPR,其对应的计算方式如下:
- T P R TPR TPR(Recall,Sensitivity)
表示在所有label为positive的样本中,预测为positive的概率
T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
Specificity
S p e c i f i c i t y = T N T N + F P Specificity=\frac{TN}{TN + FP} Specificity=TN+FPTN
- F P R FPR FPR(1-Specificity)
表示在所有label为negative的样本中,预测为positive的概率
F P R = F P T N + F P FPR = \frac{FP}{TN + FP} FPR=TN+FPFP
所以 T P R TPR TPR表示正例中正确率, F P R FPR FPR表示负例中错误率。
-
问题1: 对于测试集合而言,我们的计算得到 T P R TPR TPR和 F P R FPR FPR的结果应该是一个独立的点,为什么会是一条曲线?
-
问题2: 为什么通过ROC曲线可以评估模型,什么样的ROC曲线表示模型越好,什么样的ROC曲线表示模型越差劲?
带着这两个问题,我们开始进一步讨论ROC如何评估一个分类模型。
2.2 ROC和模型的评估
2.2.1 ROC曲线的绘制
在回答上面的两个问题之前,我们先来以二分类为例。
为什么对于一个模型我们可以得到一条曲线。
例如以LR为例,在最后的sigmoid
作为激活函数之后我们能够得到一个概率值。
对于这个模型输出的概率值,我们可以给定一个阈值。
当我们的输出值大于这个阈值的时候判断为正例,当我们的输出值小于这个阈值的时候判断为负例。
那么,对于同一个模型给定不同的阈值就可以得到不同的 T P R TPR TPR和 F P R FPR FPR绘制得到ROC曲线。
例如:我们给定多组阈值,然后就可以评估计算出不同阈值下的ROC曲线,具体图像如下。
2.2.2 ROC曲线的具体意义
还是以LR做二分类为例子,对于在给定样本上的预测结果。
- 用红色线条表示label为positive的结果,对应分类器输出值的分布。
- 用绿色线条表示label为negative的结果,对应分类器输出值的分布。
在 t h r e s h o l d = 0.5 threshold=0.5 threshold=0.5的情况下,阈值大于0.5全部预测为positive,阈值小于0.5全部预测为negative。
在此基础上我们考虑以下几种情况:
第一种情况:
在这种情况下我们
这种情况下分类器能够完全对区分positive和negative的样本。
这个时候得到的曲线ROC曲线为:
第二种情况
在这种情况下,以0.5作为阈值没有办法完全区分样本中label为positive和negative的样本。
交叉部分为 F N FN FN和 F P FP FP,这个时候对应的ROC曲线为如下:
第三种情况
在极端情况下,分类器对所有positive样本的输出值分布和negative样本输出的值的分布是相同的。
这个时候无法通过选取阈值对分类器做有效的分类,对应的ROC曲线如下。
这个时候,分类器对样本的分类效果是随机的。
3 AUC
细心的小朋友可能已经发现了,在上面的图中我们已经给定了不同的状况下AUC的值。
那么有两个问题:
第一个问题: AUC的值表示什么样含义?
第二个问题: AUC的值怎么进行计算?
3.1 AUC值的含义
auc(area under curve)表示ROC曲线下的面积。
在绘制ROC曲线的过程中,Sensitivity和Specificity的值成反比所以当Sensitivity的时候Specificity,反之也成立。
在这种情况下,以0.5作为阈值没有办法完全区分样本中label为positive和negative的样本。
交叉部分为 F N FN FN和 F P FP FP,这个时候对应的ROC曲线为如下:
如图当我们提高阈值的情况下,我们得到了更多的negative的值,这个时候Specificity(特异性)增加,但是Sensitivity(敏感度)减小。
我们的目的是希望得到一个分类器,在所有阈值的情况下都能够得到一个对于任何阈值具有比较高的Specificity和Sensitivity。
这个时候,我们通过ROC曲线覆盖的面积(AUC)来评估模型的效果。
那么这里存在一个疑问:为什么不用Specificity和Sensitivity的值直接绘制曲线然后计算AUC而是需要用1-Specificity来计算
3.2 AUC值的计算
根据上面的部分的描述,通过不同阈值我们可以绘制出ROC曲线,并且了解了AUC曲线那么在评估模型当中的含义。
那么怎么样计算AUC的值呢?
import numpy as np
a=[0.1, 0.2, 0.4]
b=[0.2, 0.4, 0.6]
print(np.trapz(a,b))
得到的结果为:
0.09
具体的计算方式:
auc = (0.4-0.2) * (0.1 + 0.2) / 2 + (0.6-0.4) * (0.2 + 0.4) / 2
= 0.03 + 0.06
= 0.09