机器学习基础:ROC曲线与AUC计算详解
AUC & ROCAUC是一个模型评价指标,只能用于二分类模型的评价,对于二分类模型,还有损失函数(logloss),正确率(accuracy),准确率(precision),但相比之下AUC和logloss要比accuracy和precision用的多,原因是因为很多的机器学习模型计算结果都是概率的形式,那么对于概率而言,我们就需要去设定一个阈值来判定分类,那么这个阈值的设定就会对我..
AUC & ROC
AUC是一个模型评价指标,只能用于二分类模型的评价,对于二分类模型,还有损失函数(logloss),正确率(accuracy),准确率(precision),但相比之下AUC和logloss要比accuracy和precision用的多,原因是因为很多的机器学习模型计算结果都是概率的形式,那么对于概率而言,我们就需要去设定一个阈值来判定分类,那么这个阈值的设定就会对我们的正确率和准确率造成一定成都的影响。
二元分类算法,通过AUC(Area under the Curve of ROC(receiver operating characteristic))进行评估
- 横坐标:1-Specificity,伪正类率(False positive rate, FPR),预测为正但实际为负的样本占所有负例样本 的比例;
- 纵坐标:Sensitivity,真正类率(True positive rate, TPR),预测为正且实际为正的样本占所有正例样本 的比例。
一 roc曲线
1、roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性。
横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例;(1-Specificity)
纵轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率)
2针对一个二分类问题,将实例分成正类(postive)或者负类(negative)。但是实际中分类时,会出现四种情况.
(1)若一个实例是正类并且被预测为正类,即为真正类(True Postive TP)
(2)若一个实例是正类,但是被预测成为负类,即为假负类(False Negative FN)
(3)若一个实例是负类,但是被预测成为正类,即为假正类(False Postive FP)
(4)若一个实例是负类,但是被预测成为负类,即为真负类(True Negative TN)
TP:正确的肯定数目
FN:漏报,没有找到正确匹配的数目
FP:误报,没有的匹配不正确
TN:正确拒绝的非匹配数目
列联表如下,1代表正类,0代表负类:
由上表可得出横,纵轴的计算公式:
(1)真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity
(2)负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity
(3)真负类率(True Negative Rate)TNR: TN/(FP+TN),代表分类器预测的负类中实际负实例占所有负实例的比例,TNR=1-FPR。Specificity
- 正确率(Precision):
- 真阳性率(True Positive Rate,TPR),灵敏度(Sensitivity),召回率(Recall):
- 真阴性率(True Negative Rate,TNR),特异度(Specificity):
- 假阴性率(False Negatice Rate,FNR),漏诊率( = 1 - 灵敏度):
- 假阳性率(False Positice Rate,FPR),误诊率( = 1 - 特异度):
- 阳性似然比(Positive Likelihood Ratio (LR+)):
- 阴性似然比(Negative Likelihood Ratio (LR−) ):
- Youden指数(Youden index):
Youden index = Sensitivity + Specificity −1= TPR−FPR
————————————————
其中,两列True matches和True non-match分别代表应该匹配上和不应该匹配上的
两行Pred matches和Pred non-match分别代表预测匹配上和预测不匹配上的
FPR = FP/(FP + TN) 负样本中的错判率(假警报率)
TPR = TP/(TP + FN) 判对样本中的正样本率(命中率)
ACC = (TP + TN) / (P+N) 判对准确率
——————示例——————————
混淆矩阵(Confusion matrix)
混淆矩阵是理解大多数评价指标的基础,毫无疑问也是理解AUC的基础。丰富的资料介绍着混淆矩阵的概念,下边用一个实例讲解什么是混淆矩阵
如有100个样本数据,这些数据分成2类,每类50个。分类结束后得到的混淆矩阵为:
说明:
40个为0类别的,预测正确,60个事实是0类别的给预测为1类别的
40个为1类别的,预测正确,60个事实是1类别的给预测为0类别的
其对应的混淆矩阵如下:
混淆矩阵包含四部分的信息:
True negative(TN),称为真阴率,表明实际是负样本预测成负样本的样本数
False positive(FP),称为假阳率,表明实际是负样本预测成正样本的样本数
False negative(FN),称为假阴率,表明实际是正样本预测成负样本的样本数
True positive(TP),称为真阳率,表明实际是正样本预测成正样本的样本数
从上边的图可以分析出,对角线带True的为判断对了,斜对角线带False的为判断错了。
像常见的准确率,精准率,召回率,F1-score,AUC都是建立在混淆矩阵上的。
准确率(Accuracy):
判断正确的占总的数目的比例【(TN+TP)/100=(40+40)/100=0.8】
精准率(precision):
判断正确的正类占进行判断的数目的比例(针对判别结果而言的,表示预测为正的数据中有多少是真的正确)【TP/(TP+FP) = 40/(40+60 )=0.4】
召回率(recall):
判断正确正类占应该应该判断正确的正类的比例(针对原样本而言,表示样本中的正例有多少被判断正确了)【TP/(TP+FN)=40/(40+60)=0.4】
F1-Measure:
精确值和召回率的调和均值【2RR/(P+R)=20.40.4/(0.4+0.4)=1】
————————————————
假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。
如下面这幅图,(a)图中实线为ROC曲线,线上每个点对应一个阈值。
横轴FPR:1-TNR,1-Specificity,FPR越大,预测正类中实际负类越多。
纵轴TPR:Sensitivity(正类覆盖率),TPR越大,预测正类中实际正类越多。
理想目标:TPR=1,FPR=0,即图中(0,1)点,故ROC曲线越靠拢(0,1)点,越偏离45度对角线越好,Sensitivity、Specificity越大效果越好。
(a)理想情况下,TPR应该接近1,FPR应该接近0。
ROC曲线上的每一个点对应于一个threshold,对于一个分类器,每个threshold下会有一个TPR和FPR。
比如Threshold最大时,TP=FP=0,对应于原点;Threshold最小时,TN=FN=0,对应于右上角的点(1,1)
(b)随着阈值theta增加,TP和FP都减小,TPR和FPR也减小,ROC点向左下移动;
————————————————
二 如何画roc曲线
假设已经得出一系列样本被划分为正类的概率,然后按照大小排序,下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。
接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:
AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。
首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。
三 为什么使用Roc和Auc评价分类器
既然已经这么多标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。下图是ROC曲线和Presision-Recall曲线的对比:
在上图中,(a)和(c)为Roc曲线,(b)和(d)为Precision-Recall曲线。
(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果,可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线变化较大。
实际场景:
在互联网广告的点击率模型中,逻辑回归的输出是一个[0,1]区间的连续值,这个值表示用户点击某广告的概率,这里就涉及一个取舍问题了,这个概率值大于多少归为正类。假如确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中,那么根据这个阈值0.6能算出一对TPR和FPR来。当然,正类样本是很重要的,因为是点击数据,所以ctr预估模型要求是大部分正类都要识别出来。
为了完成这样的工作,识别更多的正类,可以把阈值调低点,变成0.5,虽然能识别出更多的正类,也就是识别出更多的点击数据,但也带来了问题,把很多不点击的样本也识别成了正类,这样也是不行的,有可能亏钱。从上面可以看出阈值也是很难定的,但对于某些广告点击率系统来说,如搜索广告,并不需要定阈值,只需要知道排序,比如说预估的点击率最高的那个广告实际点击率也比它下面的高就行了,因为会有很多候选广告,只要出点击率最高的几个,同时把点击率最高的(最相关的搜索结果)放在第一个,其他的以此类推(按点击率从高到低排)就够了(当然为了赚钱,会考虑一下价格的因素,把收益最高的广告排在最前面)。
其实说白了,就是排序其实是很重要的,真正怎么定那个阈值就相对没那么重要。所以评价这个点击率模型的好坏也不一定对预估出来的那个概率特别在意,倒是这个概率排在第几个位置比较重要。那么评价某个点击率模型好坏就不能用ACC来评估了,因为那样对阈值有要求。
ROC绘制
分三种情况吧。
假设有6次展示记录,有两次被点击了,得到一个展示序列(1:1,2:0,3:1,4:0,5:0,6:0),前面的表示序号,后面的表示点击(1)或没有点击(0)。
然后在这6次展示的时候都通过model算出了点击的概率序列。
下面看三种情况。
一、如果概率的序列是(1:0.9,2:0.7,3:0.8,4:0.6,5:0.5,6:0.4)。
与原来的序列一起,得到序列(从概率从高到低排)
1 0.9
1 0.8
0 0.7
0 0.6
0 0.5
0 0.4
绘制的步骤是:
1)把概率序列从高到低排序,得到顺序(1:0.9,3:0.8,2:0.7,4:0.6,5:0.5,6:0.4);
2)从概率最大开始取一个点作为正类,取到点1,计算得到TPR=0.5,FPR=0.0;
3)从概率最大开始,再取一个点作为正类,取到点3,计算得到TPR=1.0,FPR=0.0;
4)再从最大开始取一个点作为正类,取到点2,计算得到TPR=1.0,FPR=0.25;
5)以此类推,得到6对TPR和FPR。
然后把这6对数据组成6个点(0,0.5),(0,1.0),(0.25,1),(0.5,1),(0.75,1),(1.0,1.0)。
这6个点在二维坐标系中能绘出来。
看看图中,那个就是ROC曲线。
二、如果概率的序列是(1:0.9,2:0.8,3:0.7,4:0.6,5:0.5,6:0.4)。
与原来的序列一起,得到序列(从概率从高到低排)
1 0.9
0 0.8
1 0.7
0 0.6
0 0.5
0 0.4
绘制的步骤是:
6)把概率序列从高到低排序,得到顺序(1:0.9,2:0.8,3:0.7,4:0.6,5:0.5,6:0.4);
7)从概率最大开始取一个点作为正类,取到点1,计算得到TPR=0.5,FPR=0.0;
8)从概率最大开始,再取一个点作为正类,取到点2,计算得到TPR=0.5,FPR=0.25;
9)再从最大开始取一个点作为正类,取到点3,计算得到TPR=1.0,FPR=0.25;
10) 以此类推,得到6对TPR和FPR。
然后把这6对数据组成6个点(0,0.5),(0.25,0.5),(0.25,1),(0.5,1),(0.75,1),(1.0,1.0)。
这6个点在二维坐标系中能绘出来。
看看图中,那个就是ROC曲线。
三、如果概率的序列是(1:0.4,2:0.6,3:0.5,4:0.7,5:0.8,6:0.9)。
与原来的序列一起,得到序列(从概率从高到低排)
0 0.9
0 0.8
0 0.7
0 0.6
1 0.5
1 0.4
绘制的步骤是:
11) 把概率序列从高到低排序,得到顺序(1:0.4,2:0.6,3:0.5,4:0.7,5:0.8,6:0.9);
12) 从概率最大开始取一个点作为正类,取到点6,计算得到TPR=0.0,FPR=0.25;
13) 从概率最大开始,再取一个点作为正类,取到点5,计算得到TPR=0.0,FPR=0.5;
14) 再从最大开始取一个点作为正类,取到点4,计算得到TPR=0.0,FPR=0.75;
15) 以此类推,得到6对TPR和FPR。
然后把这6对数据组成6个点(0.25,0.0),(0.5,0.0),(0.75,0.0),(1.0,0.0),(1.0,0.5),(1.0,1.0)。
这6个点在二维坐标系中能绘出来。
看看图中,那个就是ROC曲线。
2.3 什么意义
如上图的例子,总共6个点,2个正样本,4个负样本,取一个正样本和一个负样本的情况总共有8种。
上面的第一种情况,从上往下取,无论怎么取,正样本的概率总在负样本之上,所以分对的概率为1,AUC=1。再看那个ROC曲线,它的积分是什么?也是1,ROC曲线的积分与AUC相等。
上面第二种情况,如果取到了样本2和3,那就分错了,其他情况都分对了;所以分对的概率是0.875,AUC=0.875。再看那个ROC曲线,它的积分也是0.875,ROC曲线的积分与AUC相等。
上面的第三种情况,无论怎么取,都是分错的,所以分对的概率是0,AUC=0.0。再看ROC曲线,它的积分也是0.0,ROC曲线的积分与AUC相等。
其实AUC的意思是——Area Under roc Curve,就是ROC曲线的积分,也是ROC曲线下面的面积。
绘制ROC曲线的意义很明显,不断地把可能分错的情况扣除掉,从概率最高往下取的点,每有一个是负样本,就会导致分错排在它下面的所有正样本,所以要把它下面的正样本数扣除掉(1-TPR,剩下的正样本的比例)。总的ROC曲线绘制出来了,AUC就定了,分对的概率也能求出来了。
参考:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)