ROC曲线及AUC计算Word文档下载推荐.docx
《ROC曲线及AUC计算Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ROC曲线及AUC计算Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
对某个分类器而言,我们可以根据其在测试样本上的表现得到一个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
--------------------------------------------
146
36.50
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
-0.6536
0.0931
49.3333
<
.0001
history
-0.4083
0.0980
17.3597
duration
0.0248
0.00907
7.4820
0.0062
savings
-0.2017
0.0745
7.3308
0.0068
property
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;
从下面的局部的数据valid_p可以看到,一些实际上是good的客户,根据我们的模型(阈值p取0.5),却预测他为bad(套用我们假设检验的黑话,这就犯了“弃真”的错误),对一些原本是bad的客户,却预测他为good(“取伪”错误),当然,对更多的客户,good还预测成good,bad还预测成bad:
p
good_bad_predicted
0.61624
bad
0.03607
good
0.12437
0.21680
0.34833
0.69602
0.68873
0.48351
0.03288
0.06789
0.61195
0.15306
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->
4.d是正确预测到的正例的数量,TruePositive(TP,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;
对照上表,结果如下:
预测
实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得到:
tablesgood_bad*good_bad_predicted;
其中,准确率=12.00%+57.25%=69.25%,覆盖率=32.88%,命中率=65.75%,Specificity=90.16%,PV-=70.03%。
或者,我们可以通过SASlogistic回归的打分程序(score)得到一系列的Sensitivity和Specificity,
scoredata=validoutroc=valid_roc;
数据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数据中,看到针对不同的阈值,而产生的相应的覆盖率。
我们还可以看到,随着阈值的减小(更多的客户就会被归为正例),sensitivi