ROC曲线及AUC计算.docx
- 文档编号:8826899
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:25
- 大小:202.60KB
ROC曲线及AUC计算.docx
《ROC曲线及AUC计算.docx》由会员分享,可在线阅读,更多相关《ROC曲线及AUC计算.docx(25页珍藏版)》请在冰豆网上搜索。
ROC曲线及AUC计算
ROC曲线及AUC计算
(转帖)
(2012-03-2310:
04:
31)
▼
ref
让我们从头说起,首先AUC是一种用来度量分类模型好坏的一个标准。
这样的标准其实有很多,例如:
大约10年前在machinelearning文献中一统天下的标准:
分类精度;在信息检索(IR)领域中常用的recall和precision,等等。
其实,度量反应了人们对”好”的分类结果的追求,同一时期的不同的度量反映了人们对什么是”好”这个最根本问题的不同认识,而不同时期流行的度量则反映了人们认识事物的深度的变化。
近年来,随着machinelearning的相关技术从实验室走向实际应用,一些实际的问题对度量标准提出了新的需求。
特别的,现实中样本在不同类别上的不均衡分布(classdistributionimbalanceproblem)。
使得accuracy这样的传统的度量标准不能恰当的反应分类器的performance。
举个例子:
测试样本中有A类样本90个,B类样本10个。
分类器C1把所有的测试样本都分成了A类,分类器C2把A类的90个样本分对了70个,B类的10个样本分对了5个。
则C1的分类精度为90%,C2的分类精度为75%。
但是,显然C2更有用些。
另外,在一些分类问题中犯不同的错误代价是不同的(costsensitivelearning)。
这样,默认0.5为分类阈值的传统做法也显得不恰当了。
为了解决上述问题,人们从医疗分析领域引入了一种新的分类模型performance评判方法——ROC分析。
ROC分析本身就是一个很丰富的容,有兴趣的读者可以自行Google。
由于我自己对ROC分析的容了解还不深刻,所以这里只做些简单的概念性的介绍。
ROC的全名叫做ReceiverOperatingCharacteristic,其主要分析工具是一个画在二维平面上的曲线——ROCcurve。
平面的横坐标是falsepositiverate(FPR),纵坐标是truepositiverate(TPR)。
对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。
这样,此分类器就可以映射成ROC平面上的一个点。
调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0,0),(1,1)的曲线,这就是此分类器的ROC曲线。
一般情况下,这个曲线都应该处于(0,0)和(1,1)连线的上方。
因为(0,0)和(1,1)连线形成的ROC曲线实际上代表的是一个随机分类器。
如果很不幸,你得到一个位于此直线下方的分类器的话,一个直观的补救办法就是把所有的预测结果反向,即:
分类器输出结果为正类,则最终分类的结果为负类,反之,则为正类。
虽然,用ROCcurve来表示分类器的performance很直观好用。
可是,人们总是希望能有一个数值来标志分类器的好坏。
于是AreaUnderrocCurve(AUC)就出现了。
顾名思义,AUC的值就是处于ROCcurve下方的那部分面积的大小。
通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的performance。
好了,到此为止,所有的前续介绍部分结束,下面进入本篇帖子的主题:
AUC的计算方法总结。
最直观的,根据AUC这个名称,我们知道,计算出ROC曲线下面的面积,就是AUC的值。
事实上,这也是在早期MachineLearning文献中常见的AUC计算方法。
由于我们的测试样本是有限的。
我们得到的AUC曲线必然是一个阶梯状的。
因此,计算的AUC也就是这些阶梯下面的面积之和。
这样,我们先把score排序(假设score越大,此样本属于正类的概率越大),然后一边扫描就可以得到我们想要的AUC。
但是,这么做有个缺点,就是当多个测试样本的score相等的时候,我们调整一下阈值,得到的不是曲线一个阶梯往上或者往右的延展,而是斜着向上形成一个梯形。
此时,我们就需要计算这个梯形的面积。
由此,我们可以看到,用这种方法计算AUC实际上是比较麻烦的。
一个关于AUC的很有趣的性质是,它和Wilcoxon-Mann-WitneyTest是等价的。
这个等价关系的证明留在下篇帖子中给出。
而Wilcoxon-Mann-WitneyTest就是测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score。
有了这个定义,我们就得到了另外一中计算AUC的办法:
得到这个概率。
我们知道,在有限样本中我们常用的得到概率的办法就是通过频率来估计之。
这种估计随着样本规模的扩大而逐渐逼近真实值。
这和上面的方法中,样本数越多,计算的AUC越准确类似,也和计算积分的时候,小区间划分的越细,计算的越准确是同样的道理。
具体来说就是统计一下所有的M×N(M为正类样本的数目,N为负类样本的数目)个正负样本对中,有多少个组中的正样本的score大于负样本的score。
当二元组中正负样本的score相等的时候,按照0.5计算。
然后除以MN。
实现这个方法的复杂度为O(n^2)。
n为样本数(即n=M+N)
第三种方法实际上和上述第二种方法是一样的,但是复杂度减小了。
它也是首先对score从大到小排序,然后令最大score对应的sample的rank为n,第二大score对应sample的rank为n-1,以此类推。
然后把所有的正类样本的rank相加,再减去正类样本的score为最小的那M个值的情况。
得到的就是所有的样本中有多少对正类样本的score大于负类样本的score。
然后再除以M×N。
即
AUC=((所有的正例位置相加)-M*(M+1))/(M*N)
另外,特别需要注意的是,再存在score相等的情况时,对相等score的样本,需要赋予相同的rank(无论这个相等的score是出现在同类样本还是不同类的样本之间,都需要这样处理)。
具体操作就是再把所有这些score相等的样本的rank取平均。
然后再使用上述公式。
分类模型的性能评估——以SASLogistic回归为例
(1):
混淆矩阵
Postedon2008/12/25by胡江堂
跑完分类模型(Logistic回归、决策树、神经网络等),我们经常面对一大堆模型评估的报表和指标,如ConfusionMatrix、ROC、Lift、Gini、K-S之类(这个单子可以列很长),往往让很多在业务中需要解释它们的朋友头大:
“这个模型的Lift是4,表明模型运作良好。
——啊,怎么还要解释ROC,ROC如何如何,表明模型表现良好……”如果不明白这些评估指标的背后的直觉,就很可能陷入这样的机械解释中,不敢多说一句,就怕哪里说错。
本文就试图用一个统一的例子(SASLogistic回归),从实际应用而不是理论研究的角度,对以上提到的各个评估指标逐一点评,并力图表明:
1.这些评估指标,都是可以用白话(plainEnglish,普通话)解释清楚的;
2.它们是可以手算出来的,看到各种软件包输出结果,并不是一个无法探究的“黑箱”;
3.它们是相关的。
你了解一个,就很容易了解另外一个。
本文从混淆矩阵(ConfusionMatrix,或分类矩阵,ClassificationMatrix)开始,它最简单,而且是大多数指标的基础。
数据
本文使用一个在信用评分领域非常有名的免费数据集,GermanCreditDataset,你可以在UCIMachineLearningRepository找到(下载;数据描述)。
另外,你还可以在SAS系统的EnterpriseMiner的演示数据集中找到该数据的一个版本(dmagecr.sas7bdat)。
以下把这个数据分为两部分,训练数据train和验证数据valid,所有的评估指标都是在valid数据中计算(纯粹为了演示评估指标,在train数据里计算也未尝不可),我们感兴趣的二分变量是good_bad,取值为{good,bad}:
Traindata
good_bad Frequency Percent
-------------------------------------------
bad 154 25.67
good 446 74.33
Validdata
good_bad Frequency Percent
--------------------------------------------
bad 146 36.50
good 254 63.50
信用评分指帮助贷款机构发放消费信贷的一整套决策模型及其支持技术。
一般地,信用评分技术将客户分为好客户与坏客户两类,比如说,好客户(good)能够按期还本付息(履约),违约的就是坏客户(bad)。
具体做法是根据历史上每个类别(履约、违约)的若干样本,从已知的数据中考察借款人的哪些特征对其拖欠或违约行为有影响,从而测量借款人的违约风险,为信贷决策提供依据。
Logistic回归是信用评分领域运用最成熟最广泛的统计技术。
约定
在我们的示例数据中,要考察的二分变量是good_bad,我们把感兴趣的那个取值bad(我们想计算违约的概率),称作正例(Positive,1),另外那个取值(good)称作负例(Negative,0)。
在SAS的Logistic回归中,默认按二分类取值的升序排列取第一个为positive,所以默认的就是求bad的概率。
(若需要求good的概率,需要特别指定)。
模型
如果没有特别说明,以下所有的SAS代码都在SAS9.1.3SP4系统中调试并运行成功(在生成ROC曲线时,我还会提到SAS9.2的新功能)。
proclogisticdata=train;
modelgood_bad=checkinghistorydurationsavingsproperty;
run;
这个数据很整齐,能做出很漂亮的模型,以下就直接贴出参数估计的结果:
AnalysisofMaximumLikelihoodEstimates
Standard Wald
Parameter DF Estimate Error Chi-Square Pr>ChiSq
Intercept 1 0.6032 0.4466 1.8242 0.1768
checking 1 -0.6536 0.0931 49.3333 <.0001
history 1 -0.4083 0.0980 17.3597 <.0001
duration 1 0.0248 0.00907 7.4820 0.0062
savings 1 -0.2017 0.0745 7.3308 0.0068
property 1 0.3157 0.1052 9.0163 0.0027
回归方程就是:
logit[p(bad)]=log(p/1-p)
=0.6032-0.6536*checking-0.4083*history+0.0248*duration
-0.2017*savings+0.3157*property
用下面的公式就可以求出正例的概率(bad的概率):
p=exp(logit)/(exp(logit)+1)
上式求出的是概率值,如何根据概率值把各个客户归类,还需要一个阈值,比如,这里我们简单地规定,违约概率超过0.5的就归为bad,其余为good。
把上述公式代入valid数据中,
datavalid_p;
setvalid;
logit=0.6032-0.6536*checking-0.4083*history+0.0248*duration-0.2017*savings+0.3157*property;
p=exp(logit)/(exp(logit)+1);
ifp<0.5thengood_bad_predicted='good';
elsegood_bad_predicted='bad';
keepgood_badpgood_bad_predicted;
run;
从下面的局部的数据valid_p可以看到,一些实际上是good的客户,根据我们的模型(阈值p取0.5),却预测他为bad(套用我们假设检验的黑话,这就犯了“弃真”的错误),对一些原本是bad的客户,却预测他为good(“取伪”错误),当然,对更多的客户,good还预测成good,bad还预测成bad:
good_bad p good_bad_predicted
bad 0.61624 bad
bad 0.03607 good
good 0.12437 good
good 0.21680 good
good 0.34833 good
good 0.69602 bad
bad 0.68873 bad
good 0.48351 good
good 0.03288 good
good 0.06789 good
good 0.61195 bad
good 0.15306 good
ConfusionMatrix,混淆矩阵
一个完美的分类模型就是,如果一个客户实际上(Actual)属于类别good,也预测成(Predicted)good,处于类别bad,也就预测成bad。
但从上面我们看到,一些实际上是good的客户,根据我们的模型,却预测他为bad,对一些原本是bad的客户,却预测他为good。
我们需要知道,这个模型到底预测对了多少,预测错了多少,混淆矩阵就把所有这些信息,都归到一个表里:
预测
10
实1d,TruePositivec,FalseNegativec+d,ActualPositive
际0b,FalsePositivea,TrueNegativea+b,ActualNegative
b+d,PredictedPositivea+c,PredictedNegative
其中,
1.a是正确预测到的负例的数量,TrueNegative(TN,0->0)
2.b是把负例预测成正例的数量,FalsePositive(FP,0->1)
3.c是把正例预测成负例的数量,FalseNegative(FN,1->0)
4.d是正确预测到的正例的数量,TruePositive(TP,1->1)
5.a+b是实际上负例的数量,ActualNegative
6.c+d是实际上正例的个数,ActualPositive
7.a+c是预测的负例个数,PredictedNegative
8.b+d是预测的正例个数,PredictedPositive
以上似乎一下子引入了许多概念,其实不必像咋一看那么复杂,有必要过一下这里的概念。
实际的数据中,客户有两种可能{good,bad},模型预测同样这两种可能,可能匹配可能不匹配。
匹配的好说,0->0(读作,实际是Negative,预测成Negative),或者1->1(读作,实际是Positive,预测成Positive),这就是TrueNegative(其中Negative是指预测成Negative)和TruePositive(其中Positive是指预测成Positive)的情况。
同样,犯错也有两种情况。
实际是Positive,预测成Negative(1->0),这就是FalseNegative;实际是Negative,预测成Positive(0->1),这就是FalsePositive;
我们可以通过SAS的procfreq得到以上数字:
procfreqdata=valid_p;
tablesgood_bad*good_bad_predicted/nopercentnocolnorow;
run;
对照上表,结果如下:
预测
10
实1,badd,TruePositive,48c,FalseNegative,98c+d,ActualPositive,146
际0,goodb,FalsePositive,25a,TrueNegative,229a+b,ActualNegative,254
b+d,PredictedPositive,73a+c,PredictedNegative,327400
根据上表,以下就有几组常用的评估指标(每个指标分中英文两行):
1.准确(分类)率VS.误分类率
准确(分类)率=正确预测的正反例数/总数
Accuracy=truepositiveandtruenegative/totalcases=a+d/a+b+c+d=(48+229)/(48+98+25+229)=69.25%
误分类率=错误预测的正反例数/总数
Errorrate=falsepositiveandfalsenegative/totalcases=b+c/a+b+c+d=1-Accuracy=30.75%
2.(正例的)覆盖率VS.(正例的)命中率
覆盖率=正确预测到的正例数/实际正例总数,
Recall(TruePositiveRate,orSensitivity)=truepositive/totalactualpositive=d/c+d=48/(48+98)=32.88%
/*注:
覆盖率(Recall)这个词比较直观,在数据挖掘领域常用。
因为感兴趣的是正例(positive),比如在信用卡欺诈建模中,我们感兴趣的是有高欺诈倾向的客户,那么我们最高兴看到的就是,用模型正确预测出来的欺诈客户(TruePositive)cover到了大多数的实际上的欺诈客户,覆盖率,自然就是一个非常重要的指标。
这个覆盖率又称Sensitivity,这是生物统计学里的标准词汇,SAS系统也接受了(谁有直观解释?
)。
以后提到这个概念,就表示为,Sensitivity(覆盖率,TruePositiveRate)。
*/
命中率=正确预测到的正例数/预测正例总数
Precision(PositivePredictedValue,PV+)=truepositive/totalpredictedpositive=d/b+d=48/(48+25)=65.75%
/*注:
这是一个跟覆盖率相对应的指标。
对所有的客户,你的模型预测,有b+d个正例,其实只有其中的d个才击中了目标(命中率)。
在数据库营销里,你预测到b+d个客户是正例,就给他们邮寄传单发,但只有其中d个会给你反馈(这d个客户才是真正会响应的正例),这样,命中率就是一个非常有价值的指标。
以后提到这个概念,就表示为PV+(命中率,PositivePredictedValue)*。
/
3.SpecificityVS.PV-
负例的覆盖率=正确预测到的负例个数/实际负例总数
Specificity(TrueNegativeRate)=truenegative/totalactualnegative=a/a+b=229/(25+229)=90.16%
/*注:
Specificity跟Sensitivity(覆盖率,TruePositiveRate)类似,或者可以称为“负例的覆盖率”,也是生物统计用语。
以后提到这个概念,就表示为Specificity(负例的覆盖率,TrueNegativeRate)。
*/
负例的命中率=正确预测到的负例个数/预测负例总数
Negativepredictedvalue(PV-)=truenegative/totalpredictednegative=a/a+c=229/(98+229)=70.03%
/*注:
PV-跟PV+(命中率,PositivePredictedvalue)类似,或者可以称为“负例的命中率”。
以后提到这个概念,就表示为PV-(负例的命中率,NegativePredictedValue)。
*/
以上6个指标,可以方便地由上面的提到的procfreq得到:
procfreqdata=valid_p;
tablesgood_bad*good_bad_predicted;
run;
其中,准确率=12.00%+57.25%=69.25%,覆盖率=32.88%,命中率=65.75%,Specificity=90.16%,PV-=70.03%。
或者,我们可以通过SASlogistic回归的打分程序(score)得到一系列的Sensitivity和Specificity,
proclogisticdata=train;
modelgood_bad=checkinghistorydurationsavingsproperty;
scoredata=validoutroc=valid_roc;
run;
数据valid_roc中有几个我们感兴趣的变量:
▪_PROB_:
阈值,比如以上我们选定的0.5
▪_SENSIT_:
sensitivity(覆盖率,truepositiverate)
▪_1MSPEC_:
1-Specificity,为什么提供1-Specificity而不是Specificity,下文有讲究。
_PROB__SENSIT__1MSPEC_
0.548660.267120.07087
0.543900.273970.07874
0.539390.287670.08661
0.529370.301370.09055
0.516330.315070.09449
0.505830.328770.09843
0.483680.363010.10236
0.474450.369860.10630
如果阈值选定为0.50583,sensitivity(覆盖率,truepositiverate)就为0.32877,Specificity就是1-0.098425=0.901575,与以上我们通过列联表计算出来的差不多(阈值0.5)。
下期预告:
ROC
以上我们用列联表求覆盖率等指标,需要指定一个阈值(threshold)。
同样,我们在valid_roc数据中,看到针对不同的阈值,而产生的相应的覆盖率。
我们还可以看到,随着阈值的减小(更多的客户就会被归为正例),sensitivity和1-Specifici
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ROC 曲线 AUC 计算