登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

生活也是大事业

阿波的学习、工作和生活

 
 
 
 
 

日志

 
 
关于我

江浙沪,数学系,天蝎座O型,懒洋洋,傻乎乎

文章分类

二分类模型性能评价(R语言,logistic回归,ROC曲线,lift曲线,lorenz曲线)  

2010-05-26 04:22:43|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

看了胡江堂介绍logistic回归的文章,总觉得还是有点不理解,所以我自己也来写一下,看看到底是哪里搞不懂。

解决分类问题有多种思路,包括应用支持向量机、决策树等算法。还有一种较常规的做法是采用广义线性回归中的logistic回归或probit回归。广义线性回归是探索“响应变量的期望”与“自变量”的关系,以实现对非线性关系的某种拟合。这里面涉及到一个“连接函数”和一个“误差函数”,“响应变量的期望”经过连接函数作用后,与“自变量”存在线性关系。选取不同的“连接函数”与“误差函数”可以构造不同的广义回归模型。当误差函数取“二项分布”而连接函数取“logit函数”时,就是常见的“logistic回归模型”,在0-1响应的问题中得到了大量的应用。

logistic回归的公式可以表示为:

logistic回归在二分类问题中的应用 - 皮皮米菲兔 - 生活也是大事业

 其中P是响应变量取1的概率,在0-1变量的情形中,这个概率就等于响应变量的期望。

这个公式也可以写成:

logistic回归在二分类问题中的应用 - 皮皮米菲兔 - 生活也是大事业

 可以看出,logistic回归是对0-1响应变量的期望做logit变换,然后与自变量做线性回归。参数估计采用极大似然估计,显著性检验采用似然比检验。

建立模型并根据AIC准则选择模型后,可以对未知数据集进行预测,从而实现分类。模型预测的结果是得到每一个样本的响应变量取1的概率,为了得到分类结果,需要设定一个阈值p0——当p大于p0时,认为该样本的响应变量为1,否则为0。阈值大小对模型的预测效果有较大影响,需要进一步考虑。首先必须明确模型预测效果的评价指标。

对于0-1变量的二分类问题,分类的最终结果可以用表格表示为:

logistic回归在二分类问题中的应用 - 皮皮米菲兔 - 生活也是大事业

 其中,d是“实际为1而预测为1”的样本个数,c是“实际为1而预测为0”的样本个数,其余依此类推。

显然地,主对角线所占的比重越大,则预测效果越佳,这也是一个基本的评价指标——总体准确率(a+d)/(a+b+c+d)。

通常将上述矩阵称为“分类矩阵”。一般情况下,我们比较关注响应变量取1的情形,将其称为Positive(正例),而将响应变量取0的情形称为Negative(负例)。常见的例子包括生物实验的响应、营销推广的响应以及信用评分中的违约等等。针对不同的问题与目的,我们通常采用ROC曲线与lift曲线作为评价logistic回归模型的指标。

 

一、ROC曲线

正因为我们比较关注正例的情形,所以设置了两个相应的指标:TPR与FPR。

TPR:True Positive Rate,将实际的1正确地预测为1的概率,d/(c+d)。

FPR:False Positive Rate,将实际的0错误地预测为1的概率,b/(a+b)。

TPR也称为Sensitivity(即生物统计学中的敏感度),在这里也可以称为“正例的覆盖率”——将实际为1的样本数找出来的概率。覆盖率是重要的指标,例如若分类的目标是找出潜在的劣质客户(响应变量取值为1),则覆盖率越大表示越多的劣质客户被找出。

类似地,1-FPR其实就是“负例的覆盖率”,也就是把负例正确地识别为负例的概率。

TPR与FPR相互影响,而我们希望能够使TPR尽量地大,而FPR尽量地小。影响TPR与FPR的重要因素就是上文提到的“阈值”。当阈值为0时,所有的样本都被预测为正例,因此TPR=1,而FPR=1。此时的FPR过大,无法实现分类的效果。随着阈值逐渐增大,被预测为正例的样本数逐渐减少,TPR和FPR各自减小,当阈值增大至1时,没有样本被预测为正例,此时TPR=0,FPR=0。

由上述变化过程可以看出,TPR与FPR存在同方向变化的关系(这种关系一般是非线性的),即,为了提升TPR(通过降低阈值),意味着FPR也将得到提升,两者之间存在类似相互制约的关系。我们希望能够在牺牲较少FPR的基础上尽可能地提高TPR,由此画出了ROC曲线。

ROC曲线的全称为“接受者操作特性曲线”(receiver operating characteristic),其基本形式为:

logistic回归在二分类问题中的应用 - 皮皮米菲兔 - 生活也是大事业

当预测效果较好时,ROC曲线凸向左上角的顶点。平移图中对角线,与ROC曲线相切,可以得到TPR较大而FPR较小的点。模型效果越好,则ROC曲线越远离对角线,极端的情形是ROC曲线经过(0,1)点,即将正例全部预测为正例而将负例全部预测为负例。ROC曲线下的面积可以定量地评价模型的效果,记作AUC,AUC越大则模型效果越好。

由于ROC曲线描述了在TPR与FPR之间的取舍,因此我一般将其理解为投入产出曲线,receive of cost。(事实上我理解错了。相对而言lorenz曲线更适合这个名字。当然啦其实FPR可以理解为另一种cost。2010.10.15)

当我们分类的目标是将正例识别出来时(例如识别有违约倾向的信用卡客户),我们关注TPR,此时ROC曲线是评价模型效果的准绳。

 

二、lift曲线

在营销推广活动(例如DM信)中,我们的首要目标并不是尽可能多地找出那些潜在客户,而是提高客户的响应率。客户响应率是影响投入产出比的重要因素。此时,我们关注的不再是TPR(覆盖率),而是另一个指标:命中率。

回顾前面介绍的分类矩阵,正例的命中率是指预测为正例的样本中的真实正例的比例,即d/(b+d),一般记作PV。

在不使用模型的情况下,我们用先验概率估计正例的比例,即(c+d)/(a+b+c+d),可以记为k。

定义提升值lift=PV/k。

lift揭示了logistic模型的效果。例如,若经验告诉我们10000个消费者中有1000个是我们的潜在客户,则我们向这10000个消费者发放传单的效率是10%(即客户的响应率是10%),k=(c+d)/(a+b+c+d)=10%。通过对这10000个消费者进行研究,建立logistic回归模型进行分类,我们得到有可能比较积极的1000个消费者,b+d=1000。如果此时这1000个消费者中有300个是我们的潜在客户,d=300,则命中率PV为30%。

此时,我们的提升值lift=30%/10%=3,客户的响应率提升至原先的三倍,提高了投入产出比。

为了画lift图,需要定义一个新的概念depth深度,这是预测为正例的比例,(b+d)/(a+b+c+d)。

与ROC曲线中的TPR和FPR相同,lift和depth也都受到阈值的影响。

当阈值为0时,所有的样本都被预测为正例,因此depth=1,而PV=d/(b+d)=(0+d)/(0+b+0+d)=k,于是lift=1,模型未起提升作用。随着阈值逐渐增大,被预测为正例的样本数逐渐减少,depth减小,而较少的预测正例样本中的真实正例比例逐渐增大。当阈值增大至1时,没有样本被预测为正例,此时depth=0,而lift=0/0。

由此可见,lift与depth存在相反方向变化的关系。在此基础上作出lift图:

logistic回归在二分类问题中的应用 - 皮皮米菲兔 - 生活也是大事业

 与ROC曲线不同,lift曲线凸向(0,1)点。我们希望在尽量大的depth下得到尽量大的lift(当然要大于1),也就是说这条曲线的右半部分应该尽量陡峭。

 

至此,我们对ROC曲线和lift曲线进行了描述。这两个指标都能够评价logistic回归模型的效果,只是分别适用于不同的问题:

如果是类似信用评分的问题,希望能够尽可能完全地识别出那些有违约风险的客户(不使一人漏网),我们需要考虑尽量增大TPR(覆盖率),同时减小FPR(减少误杀),因此选择ROC曲线及相应的AUC作为指标;

如果是做类似数据库精确营销的项目,希望能够通过对全体消费者的分类而得到具有较高响应率的客户群,从而提高投入产出比,我们需要考虑尽量提高lift(提升度),同时depth不能太小(如果只给一个消费者发放传单,虽然响应率较大,却无法得到足够多的响应),因此选择lift曲线作为指标。

 

按照惯例,我们来做一个试验。试验的问题来自我的毕业论文,研究高炉铁水硅质量分数的波动情况。

简单地说,我们的响应变量是高炉铁水硅质量分数的波动方向,记作SI0,当其取1时,表示本炉铁水硅质量分数比上一炉小,当其取0时,表示本炉铁水硅质量分数比上一炉大。(之所以这样设定,是因为通常情况下更需要关注炉温向凉的情形。)自变量选取为前一炉硅质量分数、前一炉料速、前一炉风量、前两炉料速。

选取了350炉数据,分为两组,分别用于建模与预测

a=data[1:250,]

b=data[251:350,]

a[1:3,]

    SI0    SI1        LS1              FL1         LS2
1   1 0.5825 0.8998203 0.9494003 0.7821347
2   0 0.5000 0.7933116 0.9334815 0.8998203
3   0 0.5700 0.7205215 0.8978194 0.7933116

建立logistic回归模型

glm.logit=glm(SI0~.,data=a,family=binomial(link=logit))

summary(glm.logit)

计算预测值

p=predict(glm.logit,b)

p=exp(p)/(1+exp(p))

将阈值定为0.5,得到分类结果

b$SI0pred=1*(p>0.5)

计算频数

table(b[,c(1,6)])

         SI0pred
SI0    0     1
  0    28   18
  1    12   42
于是

TPR=77.8%

FPR=39.1%

PV=70%

k=54%

lift=1.3

绘制ROC曲线

TPR=rep(0,1000)

FPR=rep(0,1000)

for(i in 1:1000){

p0=i/1000;

SI0.true=b$SI0

SI0.pred=1*(p>p0)

TPR[i]=sum(SI0.pred*SI0.true)/sum(SI0.true)

FPR[i]=sum(SI0.pred*(1-SI0.true))/sum(1-SI0.true)}

plot(FPR,TPR,type="l",col=2)

points(c(0,1),c(0,1),type="l",lty=2)

logistic回归在二分类问题中的应用 - 皮皮米菲兔 - 生活也是大事业


  评论这张
 
阅读(36400)| 评论(4)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018