本文结构:
- 什么是 ROC?
- 怎么解读 ROC 曲线?
- 如何画 ROC 曲线?
- 代码?
- 什么是 AUC?
- 代码?
ROC 曲线和 AUC 常被用来评价一个二值分类器的优劣。
先来看一下混淆矩阵中的各个元素,在后面会用到:

1. ROC :
纵轴为 TPR 真正例率,预测为正且实际为正的样本占所有正例样本的比例。
横轴为 FPR 假正例率,预测为正但实际为负的样本占所有负例样本的比例。

对角线对应的是 “随机猜想”

当一个学习器的 ROC 曲线被另一个学习器的包住,那么后者性能优于前者。
有交叉时,需要用 AUC 进行比较。
2. 先看图中的四个点和对角线:
- 第一个点,(0,1),即 FPR=0, TPR=1,这意味着 FN(false negative)=0,并且FP(false positive)=0。这意味着分类器很完美,因为它将所有的样本都正确分类。
- 第二个点,(1,0),即 FPR=1,TPR=0,这个分类器是最糟糕的,因为它成功避开了所有的正确答案。
- 第三个点,(0,0),即 FPR=TPR=0,即 FP(false positive)=TP(true positive)=0,此时分类器将所有的样本都预测为负样本(negative)。
- 第四个点(1,1),分类器将所有的样本都预测为正样本。
- 对角线上的点表示分类器将一半的样本猜测为正样本,另外一半的样本猜测为负样本。
因此,ROC 曲线越接近左上角,分类器的性能越好。
3. 如何画 ROC 曲线
例如有如下 20 个样本数据,Class 为真实分类,Score 为分类器预测此样本为正例的概率。

- 按 Score 从大到小排列
- 依次将每个 Score 设定为阈值,然后这 20 个样本的标签会变化,当它的 score 大于或等于当前阈值时,则为正样本,否则为负样本。
- 这样对每个阈值,可以计算一组 FPR 和 TPR,此例一共可以得到 20 组。
- 当阈值设置为 1 和 0 时, 可以得到 ROC 曲线上的 (0,0) 和 (1,1) 两个点。

4. 代码:
输入 y 的真实标签,还有 score,设定标签为 2 时是正例:
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
就会得到相应的 TPR, FPR, 截断点 :
fpr = array([ 0. , 0.5, 0.5, 1. ])
tpr = array([ 0.5, 0.5, 1. , 1. ])
thresholds = array([ 0.8 , 0.4 , 0.35, 0.1 ])#截断点
5. AUC:
是 ROC 曲线下的面积,它是一个数值,当仅仅看 ROC 曲线分辨不出哪个分类器的效果更好时,用这个数值来判断。

The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.
从上面定义可知,意思是随机挑选一个正样本和一个负样本,当前分类算法得到的 Score 将这个正样本排在负样本前面的概率就是 AUC 值。AUC 值是一个概率值,AUC 值越大,分类算法越好。
6. 代码:
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_scores)
0.75
学习资料:
《机器学习》,周志华
http://alexkong.net/2013/06/introduction-to-auc-and-roc/
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
判断分类器的工作效率需要使用召回率和准确率两个变量。
召回率:Recall,又称“查全率”,
准确率:Precision,又称“精度”、“正确率”。
以判断病人是否死亡的分类器为例,可以把分类情况用下表表示:
|
| 实际死亡 | 实际未死亡 |
| 分类为死亡 | A | B |
| 分类为未死亡 | C | D |
表5-2
A:正确分类,命中死亡
B:错误分类,判断为死亡实际未死亡
C:错误分类,判断为未亡实际死亡
D:正确分类,判断未死亡,实际也未死亡
如果我们希望这个分类器对于死亡的判断能力非常高,也就是追求判断为死亡的命中率越高越好。更一般的说法,对于特定临床结局的判断能力越强越好,评价这个分类器能力的指标被称为召回率,也被称为“查全率”,即Recall = A/(A+C),召回率当然越大越好。
如果我们希望分类器对于死亡的预测能力更高,也就是分类为死亡的人死亡的概率最大。或者更一般的说法,对于特定临床结局的预测能力越强越好,这是追求“准确率”,即Precise = A/(A+B),越大越好。
在上面那个表格当中,由于样本总数一定,因此A+B和C+D的总数也是一定的,我们把改变分类规则,让A+B逐渐增大叫做判断标准放宽。将C+D数量增大叫做判断标准收严。
很容易可以看出,召回率反映的是在实际死亡的样本当中,分类为死亡的人所占的比例。如果我们把分类标准放宽,A+B变得很大,c会减小,甚至c=0直到“宁可错杀一千,也不放过一个”,有点危险的人统统算成死亡的人,则很可能获得较高的召回率。但是此时,准确率会逐渐降低。
准确率则是在判断为死亡的样本中,真实死亡的人所占的比例,如果我们把分类标准定得很严,仅把哪些生命体征极为微弱,伤情特别严重的人纳入判断为可能死亡的组,在这种情况下,准确率会变得很高,分类器判断为死亡的人大多活不了,但是此时分类器的召回率就会小得不可接受。因此,要对分类器的工作效能进行判断,需要同时考察准确率和召回率。两者均高,则分类器更好。
在不改变分类器基本性能的情况下,仅仅改变纳入参数的标准,就可以在同一数据集里面多次检查统计率和召回率,最后获得准确率(P)和召回率(R)之间的曲线。这条曲线上的每一个点和坐标(1,1)之间的距离可以用来判断出分类器的性能,如果这条曲线当中某一个点通过了坐标(1,1)也就是准确率和召回率都达到100%,那么此时分类标准就被称为“完美分类标准”
一般来说,如果分类器的目的是进行死亡筛查,找出那些有可能死亡的患者重点关注,那么此时应当重视召回率(查全率),这样可以避免忽视那些有可能死亡的患者。而如果分类器的目的是为了做疾病诊断,那么则应该注意准确率,把太多的没有病死风险的患者判断为有风险则有可能影响用户对分类器的信心。
如果同时对召回率和准确率都有所要求,可以用经验测度值F来表示系统的工作效能。
F=2*P*R/(P+R)
F值越接近1,则系统的工作效能越高。
2.3.3ROC和AUC
回到ROC上来,ROC的全名叫做接收器工作特性曲线(Receiver Operating Characteristic)。
它由两个指标构成:
(一)真阳性率True Positive Rate ( TPR ) = A / A+C ,TPR代表能将正例分对的概率,也就是上面提到的查全率。
(二)假阳性率False Positive Rate( FPR ) = B /(B+D) ,FPR代表将负例错分为正例的概率。
在ROC 空间中,每个点的横坐标是假阳性率,纵坐标是真阳性率,这也就描绘了分类器在真阳性率和假阳性率之间的一个连续的权衡过程。ROC的主要分析工具是一个画在ROC空间的曲线——ROC curve。根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve。ROC 曲线起点是(0,0),意味着某种异常严格的标准,使得没有任何样本被判断为阳性。终点是(1,1)意味着某种异常宽松的标准,使得任何样本不管真假,都被判断为阳性。实际上(0, 0)和(1, 1)连线形成的ROC curve就是一个随机分类器。一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。
用ROC curve来表示分类器性能很直观好用。可是,人们总是希望能有一个数值来标志分类器的好坏。
于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的性能。如果AUC的值仅仅只有0.5,那么则意味着这个分类器的性能和随机抛硬币类似。
建立好上述预测分类器之后,需要评估它的预测工作效率,也就是对于给定的入院患者数据,我们建立起来的分类器在多大程度上能够正确预测临床结局。
对于分类器或者预测器进行功能评估由一个很重要的一个因素是要防止“过度分类”。没有任何两个病人的入院数据是完全相同的。如果在已知临床结局的情况下去建立起一个区别病人生存和死亡的模型,如果纳入足够多的入院数据,很可能建立起一套非常“完美”的分类器,把已有的数据代入这个分类器可以准确的判断是临床结局。但是如果一旦有新数据进入这套分类器,那么判断结果往往就有可能出错。造成这种现象的原因是因为分类器构建出来的目的不是对已经发生的事情进行分类,而是对未发生的事情进行预测。纳入过多的变量,通过“事后诸葛亮”似的过程来对样本进行分类很有可能把一些在统计学上和样本结局相关,但实际上只是巧合的变量计算入数据建模当中,从而使得分类器的判断准确率变得很高。
有两类方法可以防止过度分类,一类是将数据训练集和测试集彻底分开,用新获得的数据来进行区分模型的准确性检验。而另外一种方法则是在构建训练集的时候进行交叉验证。所谓交叉验证就是,用所有数据的一部分用作训练集。另外一小部分作为验证集。计算出分类器准确度。然后把原来作为验证集的数据纳入训练集,从训练集当中新画出一部分样本作为验证集。最后直到所有的样本都有机会纳入训练集和验证集当中。这样的一个过程就称为交叉验证(cross validation),交叉验证可以在样本有限的情况下获得尽可能稳定的分类结果。
ROC曲线在统计工具包当中是由perfcurve函数来决定的
典型的使用方法是:
[X,Y,T,AUC] = perfcurve(labels,scores,posclass)
输出部分X和Y表示的是ROC曲线的坐标,AUC表示曲线下面积,T表示thresholds,当T=1的时候表示存在一个分类标准,可以100%的将所有样本准确分类,特异度和敏感度都是100%。可以用plot(X,Y)来获得最简单的ROC曲线。
输入部分labels表示样本的真实分类,scores表示学习后的分类,posclass表示我们想要的研究对象的分类标记比如,当用于某个预测颅骨性别的模型进行ROC判断的时候,预测男性和女性的ROC判别曲线是不一样的,posclass可以设置为'male' or 'female'。

被折叠的 条评论
为什么被折叠?



