做者:xiaoyupython
微信公众号:Python数据科学面试
知乎:python数据分析师算法
ROC/AUC做为机器学习的评估指标很是重要,也是面试中常常出现的问题(80%都会问到)。其实,理解它并非很是难,可是好多朋友都遇到了一个相同的问题,那就是:每次看书的时候都很明白,但回过头就忘了,常常容易将概念弄混。还有的朋友面试以前背下来了,可是一紧张大脑一片空白全忘了,致使回答的不好。微信
我在以前的面试过程当中也遇到过相似的问题,个人面试经验是:通常笔试题遇到选择题基本都会考这个率,那个率,或者给一个场景让你选用哪一个。面试过程当中也被问过不少次,好比什么是AUC/ROC?横轴纵轴都表明什么?有什么优势?为何要使用它?机器学习
我记得在我第一次回答的时候,我将准确率,精准率,召回率等概念混淆了,最后一团乱。回去之后我从头至尾梳理了一遍全部相关概念,后面的面试基本都回答地很好。如今想将本身的一些理解分享给你们,但愿读完本篇能够完全记住ROC/AUC的概念。wordpress
咱们都知道机器学习要建模,可是对于模型性能的好坏(即模型的泛化能力),咱们并不知道是怎样的,极可能这个模型就是一个差的模型,泛化能力弱,对测试集不能很好的预测或分类。那么如何知道这个模型是好是坏呢?咱们必须有个评判的标准。为了了解模型的泛化能力,咱们须要用某个指标来衡量,这就是性能度量的意义。有了一个指标,咱们就能够对比不一样模型了,从而知道哪一个模型相对好,那个模型相对差,并经过这个指标来进一步调参逐步优化咱们的模型。性能
固然,对于分类和回归两类监督学习,分别有各自的评判标准。本篇咱们主要讨论与分类相关的一些指标,由于AUC/ROC就是用于分类的性能度量标准。学习
在介绍各个率以前,先来介绍一下混淆矩阵。若是咱们用的是个二分类的模型,那么把预测状况与实际状况的全部结果两两混合,结果就会出现如下4种状况,就组成了混淆矩阵。测试
因为1和0是数字,阅读性很差,因此咱们分别用P和N表示1和0两种结果。变换以后为PP,PN,NP,NN,阅读性也不好,我并不能轻易地看出来预测的正确性与否。所以,为了可以更清楚地分辨各类预测状况是否正确,咱们将其中一个符号修改成T和F,以便于分辨出结果。优化
P(Positive):表明1
N(Negative):表明0
T(True):表明预测正确
F(False):表明错误
按照上面的字符表示从新分配矩阵,混淆矩阵就变成了下面这样:
将这种表示方法总结以下,可分为两部分:
所以对于这种表示方法能够这么简单的理解:先看 ①预测结果(P/N),再根据②实际表现对比预测结果,给出判断结果(T/F)。按这个顺序理解,这四种状况就很好记住了。
TP:预测为1,预测正确,即实际1
FP:预测为1,预测错误,即实际0
FN:预测为0,预测错确,即实际1
TN:预测为0,预测正确即,实际0
既然是个分类指标,咱们能够很天然的想到准确率,准确率的定义是预测正确的结果占总样本的百分比,其公式以下:
准确率=(TP+TN)/(TP+TN+FP+FN)
虽然准确率能够判断总的正确率,可是在样本不平衡的状况下,并不能做为很好的指标来衡量结果。举个简单的例子,好比在一个总样本中,正样本占90%,负样本占10%,样本是严重不平衡的。对于这种状况,咱们只须要将所有样本预测为正样本便可获得90%的高准确率,但实际上咱们并无很用心的分类,只是随便无脑一分而已。这就说明了:因为样本不平衡的问题,致使了获得的高准确率结果含有很大的水分。即若是样本不平衡,准确率就会失效。
正由于如此,也就衍生出了其它两种指标:精准率和召回率。
精准率(Precision)又叫查准率,它是针对预测结果而言的,它的含义是在全部被预测为正的样本中实际为正的样本的几率,意思就是在预测为正样本的结果中,咱们有多少把握能够预测正确,其公式以下:
精准率=TP/(TP+FP)
精准率和准确率看上去有些相似,可是彻底不一样的两个概念。精准率表明对正样本结果中的预测准确程度,而准确率则表明总体的预测准确程度,既包括正样本,也包括负样本。
召回率(Recall)又叫查全率,它是针对原样本而言的,它的含义是在实际为正的样本中被预测为正样本的几率,其公式以下:
召回率=TP/(TP+FN)
召回率的应用场景:好比拿网贷违约率为例,相对好用户,咱们更关心坏用户,不能错放过任何一个坏用户。由于若是咱们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,形成严重偿失。召回率越高,表明实际坏用户被预测出来的几率越高,它的含义相似:宁肯错杀一千,毫不放过一个。
经过上面的公式,咱们发现:精准率和召回率的分子是相同,都是TP,但分母是不一样的,一个是(TP+FP),一个是(TP+FN)。二者的关系能够用一个P-R图来展现:
如何理解P-R(查准率-查全率)这条曲线?
有的朋友疑惑:这条曲线是根据什么变化的?为何是这个形状的曲线?
其实这要从排序型模型提及。拿逻辑回归举例,逻辑回归的输出是一个0到1之间的几率数字,所以,若是咱们想要根据这个几率判断用户好坏的话,咱们就必须定义一个阈值。一般来说,逻辑回归的几率越大说明越接近1,也就能够说他是坏用户的可能性更大。好比,咱们定义了阈值为0.5,即几率小于0.5的咱们都认为是好用户,而大于0.5都认为是坏用户。所以,对于阈值为0.5的状况下,咱们能够获得相应的一对查准率和查全率。
但问题是:这个阈值是咱们随便定义的,咱们并不知道这个阈值是否符合咱们的要求。
所以,为了找到一个最合适的阈值知足咱们的要求,咱们就必须遍历0到1之间全部的阈值,而每一个阈值下都对应着一对查准率和查全率,从而咱们就获得了这条曲线。
有的朋友又问了:如何找到最好的阈值点呢?
首先,须要说明的是咱们对于这两个指标的要求:咱们但愿查准率和查全率同时都很是高。但实际上这两个指标是一对矛盾体,没法作到双高。图中明显看到,若是其中一个很是高,另外一个确定会很是低。选取合适的阈值点要根据实际需求,好比咱们想要高的查全率,那么咱们就会牺牲一些查准率,在保证查全率最高的状况下,查准率也不那么低。
F1分数
但一般,若是想要找到两者之间的一个平衡点,咱们就须要一个新的指标:F1分数。F1分数同时考虑了查准率和查全率,让两者同时达到最高,取一个平衡。F1分数的公式为 = 2查准率查全率 / (查准率 + 查全率)。咱们在图中看到的平衡点就是F1分数得来的结果。
在正式介绍ROC/AUC以前,咱们还要再介绍两个指标,这两个指标的选择也正是ROC和AUC能够无视样本不平衡的缘由。这两个指标分别是:灵敏度和(1-特异度),也叫作真正率(TPR)和假正率(FPR)。
灵敏度(Sensitivity) = TP/(TP+FN)
特异度(Specificity) = TN/(FP+TN)
其实咱们能够发现灵敏度和召回率是如出一辙的,只是名字换了而已。
因为咱们比较关心正样本,因此须要查看有多少负样本被错误地预测为正样本,因此使用(1-特异度),而不是特异度。
真正率(TPR) = 灵敏度 = TP/(TP+FN)
假正率(FPR) = 1- 特异度 = FP/(FP+TN)
下面是真正率和假正率的示意,咱们发现TPR和FPR分别是基于实际表现1和0出发的,也就是说它们分别在实际的正样本和负样本中来观察相关几率问题。正由于如此,因此不管样本是否平衡,都不会被影响。仍是拿以前的例子,总样本中,90%是正样本,10%是负样本。咱们知道用准确率是有水分的,可是用TPR和FPR不同。这里,TPR只关注90%正样本中有多少是被真正覆盖的,而与那10%毫无关系,同理,FPR只关注10%负样本中有多少是被错误覆盖的,也与那90%毫无关系,因此能够看出:若是咱们从实际表现的各个结果角度出发,就能够避免样本不平衡的问题了,这也是为何选用TPR和FPR做为ROC/AUC的指标的缘由。
或者咱们也能够从另外一个角度考虑:条件几率
。咱们假设X为预测值,Y为真实值。那么就能够将这些指标按条件几率表示:
精准率 = P(Y=1 | X=1)
召回率 = 灵敏度 = P(X=1 | Y=1)
特异度 = P(X=0 | Y=0)
从上面三个公式看到:若是咱们先以实际结果为条件(召回率,特异度),那么就只需考虑一种样本,而先以预测值为条件(精准率),那么咱们须要同时考虑正样本和负样本。因此先以实际结果为条件的指标都不受样本不平衡的影响,相反以预测结果为条件的就会受到影响。
ROC(Receiver Operating Characteristic)曲线,又称接受者操做特征曲线。该曲线最先应用于雷达信号检测领域,用于区分信号与噪声。后来人们将其用于评价模型的预测能力,ROC曲线是基于混淆矩阵得出的。
ROC曲线中的主要两个指标就是真正率和假正率,上面也解释了这么选择的好处所在。其中横坐标为假正率(FPR)
,纵坐标为真正率(TPR)
,下面就是一个标准的ROC曲线图。
ROC曲线的阈值问题
与前面的P-R曲线相似,ROC曲线也是经过遍历全部阈值来绘制整条曲线的。若是咱们不断的遍历全部阈值,预测的正样本和负样本是在不断变化的,相应的在ROC曲线图中也会沿着曲线滑动。
如何判断ROC曲线的好坏?
改变阈值只是不断地改变预测的正负样本数,即TPR和FPR,可是曲线自己是不会变的。那么如何判断一个模型的ROC曲线是好的呢?这个仍是要回归到咱们的目的:FPR表示模型虚报的响应程度,而TPR表示模型预测响应的覆盖程度。咱们所但愿的固然是:虚报的越少越好,覆盖的越多越好。因此总结一下就是TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。
参考以下动态图进行理解。
ROC曲线无视样本不平衡
前面已经对ROC曲线为何能够无视样本不平衡作了解释,下面咱们用动态图的形式再次展现一下它是如何工做的。咱们发现:不管红蓝色样本比例如何改变,ROC曲线都没有影响。
为了计算 ROC 曲线上的点,咱们可使用不一样的分类阈值屡次评估逻辑回归模型,但这样作效率很是低。幸运的是,有一种基于排序的高效算法能够为咱们提供此类信息,这种算法称为曲线下面积(Area Under Curve)
。
比较有意思的是,若是咱们链接对角线,它的面积正好是0.5。对角线的实际含义是:随机判断响应与不响应,正负样本覆盖率应该都是50%,表示随机效果。ROC曲线越陡越好,因此理想值就是1,一个正方形,而最差的随机判断都有0.5,因此通常AUC的值是介于0.5到1之间的。
AUC的通常判断标准
0.5 - 0.7:效果较低,但用于预测股票已经很不错了
0.7 - 0.85:效果通常
0.85 - 0.95:效果很好
0.95 - 1:效果很是好,但通常不太可能
AUC的物理意义
曲线下面积对全部可能的分类阈值的效果进行综合衡量。曲线下面积的一种解读方式是看做模型将某个随机正类别样本排列在某个随机负类别样本之上的几率。如下面的样本为例,逻辑回归预测从左到右以升序排列:
Python中咱们能够调用sklearn
机器学习库的metrics
进行ROC和AUC的实现,简单的代码实现部分以下:
from sklearn import metrics from sklearn.metrics import auc import numpy as np 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) metrics.auc(fpr, tpr) 0.75
以上就是全部关于ROC和AUC的讲解和实现,auc面积是0.75。现在的我再去面试,最但愿面试官问我这个问题了,但愿看过的朋友也能够完全理解和记住ROC/AUC,以及各类指标率的概念。
参考:
1.机器学习,周志华
2.Python数据科学技术详解与商业实践,常国珍
3. https://developers.google.com...
4. https://lukeoakdenrayner.word...
关注微信公众号:Python数据科学
,发现更多精彩内容。