分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC

ROC

上回我们提到,ROC曲线就是不同的阈值下,以下两个变量的组合(如果对Sensitivity和Specificity两个术语没有概念,不妨返回,分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵,强烈建议读者对着看):

Sensitivity(覆盖率,True Positive Rate)

1-Specificity (Specificity, 负例的覆盖率,True Negative Rate)

二话不说,先把它画出来(以下脚本的主体是标红部分,数据集valid_roc,还是出自上面提到的那篇):

axis order=(0 to 1 by .1) label=none length=4in;

symbol i=join v=none c=black;

symbol2 i=join v=none c=black;

proc gplot data = valid_roc;

plot _SENSIT_*_1MSPEC_ _1MSPEC_*_1MSPEC_

/ overlay vaxis=axis haxis=axis;

run; quit;

roc

上图那条曲线就是ROC曲线,横轴是1-Specificity,纵轴是Sensitivity。以前提到过,随着阈值的减小(更多的客户就会被归为正例),Sensitivity和1-Specificity也相应增加(也即Specificity相应减少),所以ROC呈递增态势(至于ROC曲线凹向原点而非凸向原点,不知道有无直观的解释,不提)。那条45度线是作为参照(baseline model)出现的,就是说,ROC的好坏,乃是跟45度线相比的,怎么讲?

回到以前,我们分析valid数据,知道有36.5%的bad客户(Actual Positive )和63.5%的good客户(Actual Negative)。这两个概率是根据以往的数据计算出来的,可以叫做“先验概率”( prior probability)。后来,我们用logistic回归模型,再给每个客户算了一个bad的概率,这个概率是用模型加以修正的概率,叫做“后验概率”(Posterior Probability)。

预测
1 0
1 d, True Positive c, False Negative c+d, Actual Positive
0 b, False Positive a, True Negative a+b, Actual Negative
b+d, Predicted Positive a+c, Predicted Negative

如果不用模型,我们就根据原始数据的分布来指派,随机地把客户归为某个类别,那么,你得到的True Positive对False Positive之比,应该等于Actual Positive对Actual Negative之比(你做得跟样本分布一样好)——即,d/b=(c+d)/(a+b),可以有(d/c+d)/(b/a+b)=1,而这正好是Sensitivity/(1-Specificity)。在不使用模型的情况下,Sensitivity和1-Specificity之比恒等于1,这就是45度线的来历。一个模型要有所提升,首先就应该比这个baseline表现要好。ROC曲线就是来评估模型比baseline好坏的一个著名图例。这个可能不够直观,但可以想想线性回归的baseline model:

clip_image003

如果不用模型,对因变量的最好估计就是样本的均值(上图水平红线)。绿线是回归线(模型),回归线与水平线之间的偏离,称作Explained Variability, 就是由模型解释了的变动,这个变动(在方差分析里,又称作model sum of squares, SSM)越大,模型表现就越好了(决定系数R-square标准)。同样的类比,ROC曲线与45度线偏离越大,模型的效果就越好。最好好到什么程度呢?

在最好的情况下,Sensitivity为1(正确预测到的正例就刚好等于实际的正例总数),同时Specificity为1(正确预测到的负例个数就刚好等于实际的负例数),在上图中,就是左上方的点(0,1)。因此,ROC曲线越往左上方靠拢,Sensitivity和Specificity就越大,模型的预测效果就越好。同样的思路,你还可以解释为什么ROC曲线经过点(0,0)和(1.1),不提。

AUC, Area Under the ROC Curve

ROC曲线是根据与45度线的偏离来判断模型好坏。图示的好处是直观,不足就是不够精确。到底好在哪里,好了多少?这就要涉及另一个术语,AUC(Area Under the ROC Curve,ROC曲线下的面积),不过也不是新东西,只是ROC的一个派生而已。

回到先前那张ROC曲线图。45度线下的面积是0.5,ROC曲线与它偏离越大,ROC曲线就越向左上方靠拢,它下面的面积(AUC)也就应该越大。我们就可以根据AUC的值与0.5相比,来评估一个分类模型的预测效果。

SAS的Logistic回归能够后直接生成AUC值。跑完上面的模型,你可以在结果报告的Association Statistics找到一个叫c的指标,它就是AUC(本例中,c=AUC=0.803,45度线的c=0.5)。

/*注:以上提到的c不是AUC里面那个’C’。这个c是一个叫Wilcoxon-Mann-Whitney 检验的统计量。这个说来话长,不过这个c却等价于ROC曲线下的面积(AUC)。*/

ROC、AUC:SAS9.2一步到位

SAS9.2有个非常好的新功能,叫ODS Statistical Graphics,有兴趣可以去它主页看看。在SAS9.2平台提交以下代码,Logistic回归参数估计和ROC曲线、AUC值等结果就能一起出来(有了上面的铺垫,就不惧这个黑箱了):

ods graphics on;

proc logistic data=train plots(only)=roc;

model good_bad=checking history duration savings property;

run;

ods graphics off;

ROCCurve

这个ROC图貌似还漂亮些,眼神好能看见标出来的AUC是0.8029。 最后提一句,ROC全称是Receiver Operating Characteristic Curve,中文叫“接受者操作特性曲线”,江湖黑话了(有朋友能不能出来解释一下,谁是Receiver,为什么Operating,何谓Characteristic——这个看着好像是Sensitivity和Specificity),不过并不妨碍我们使用ROC作为模型评估的工具。

下期预告:Lift和Gain

不多说,只提一句,跟ROC类似,Lift(提升)和Gain(增益)也一样能简单地从以前的Confusion Matrix以及Sensitivity、Specificity等信息中推导而来,也有跟一个baseline model的比较,然后也是很容易画出来,很容易解释。

参考资料

  1. Mithat Gonen. 2007. Analyzing Receiver Operating Characteristic Curves with SAS. Cary, NC: SAS Institute Inc.
  2. Mike Patetta. 2008. Categorical Data Analysis Using Logistic Regression Course Notes. Cary, NC: SAS Institute Inc.
  3. Dan Kelly, etc. 2007. Predictive Modeling Using Logistic Regression Course Notes. Cary, NC: SAS Institute Inc.
  4. Receiver operating characteristic, see http://en.wikipedia.org/wiki/Receiver_operating_characteristic
  5. The magnificent ROC, see http://www.anaesthetist.com/mnm/stats/roc/Findex.htm

分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC》有18个想法

  1. 很好的文章,多谢多谢啊。
    不知关于Lift(提升)和Gain(增益)的文章出来了没有?我找了很长时间,没有找到,呵呵

  2. to simon,多谢捧场哈。Lift和Gains,计划是在下一篇,但时间不定,不妨先看看这里,http://johnthu.spaces.live.com/blog/cns!2053CD511E6D5B1E!308.entry,关于lift的,前年做的一个读书笔记,但愿有用。

  3. 所谓的ROC曲线,是不是可以这么理解:
    假定对于一个两类分类问题,根据预测模型,可以得出一个预测概率,选取不同的阈值,判定为正例或副例,得到不同的Sensitivity和Specificity。选取不同的阈值,画出Sensitivity和1-Specificity的关系曲线,就是ROC曲线了。
    还有些问题不清楚:
    (1)是不是所有的分类器都可以作出ROC曲线,如决策树、SVM。有些分类器没有这样的预测概率表达式,例如k近邻分类器,是根据紧邻样本占多数的类别判决的,怎样转化出ROC曲线?

    (2)ROC曲线对最佳阈值选定有没有参考作用,应该如何考虑?

  4. 总的不错,只是LZ对医学诊断试验不清楚,有些名词就译的不够专业,如Sensitivity是灵敏度、Specificity是特异度。
    ROC曲线纵轴是真阳性率(即灵敏度),横轴是假阳性率(1-特异度);
    AUC(曲线下的面积)反映了诊断试验效率好坏的重要指标,其可以计算标准误(反映抽样误差),两个诊断试验的比较就是比较两个AUC。

  5. 现在正在研究ROC曲线,有一个问题想请教博主,就是两条ROC曲线如何绘制在同一个坐标图里面呢?用STATA操作的话,程序怎样写?或者用sas或者R怎样实现呢?非常感谢。

  6. 《医学研究中的logistic回归分析及sas实现》,书中第7章“诊断试验中的logistic回归”,详细介绍了如何用sas 的proc logistic做诊断试验,包括ROC曲线,包括多个指标的联合诊断方法,不同诊断方法的比较等等。有兴趣的不妨一看。

  7. “我们用logistic回归模型,再给每个客户算了一个bad的概率,这个概率是用模型加以修正的概率,叫做“后验概率”(Posterior Probability)。”这里,好像讲错了。后验概率是一个条件概率,但是这里的预测概率并非条件概率,不能称为后验概率。

  8. SAS一步到位给出的ROC曲线及AUC统计量是根据训练样本重代入模型预测得出的,那要求解验证样本的ROC曲线和AUC统计量,怎么求?或者引入ROC曲线和AUC统计量的本意只是针对训练集精度进一步补充描述?另外,SAS建立LOGISTIC回归后如何用验证样本进行验证,这一块很少提及,哪位高手可以详解?在建模时验证样本与训练样本放在同一数据集但验证样本的因变量设置为缺失是一个方法,但是后续的数据集处理麻烦。有没有一步到位的方法呢?

    1. 如果像这一系列的《混淆矩阵》一文介绍的方法——把模型求解出来再用data步求验证结果,这样针对属性为多类别的自变量数据,貌似不可行(针对这种数据,在建模时,logistic过程步会自动引入哑变量)。

  9. 如果像这一系列的《混淆矩阵》一文介绍的方法——把模型求解出来再用data步求验证结果,这样针对属性为多类别的自变量数据,貌似不可行(针对这种数据,在建模时,logistic过程步会自动引入哑变量)。

发表评论

邮箱地址不会被公开。 必填项已用*标注