逻辑回归中更好的默认分类


12

全面披露:这是家庭作业。我提供了指向数据集的链接(http://www.bertelsen.ca/R/logistic-regression.sav

我的目标是在此数据集中最大程度地预测违约贷款。

到目前为止,我提出的每个模型都预测> 90%的非默认者,但是<40%的默认者使分类效率总体达到80%。那么,我想知道变量之间是否存在交互作用?在逻辑回归中,除了测试每种可能的组合之外,还有没有办法确定潜在的交互作用?或者,一种提高违约者分类效率的方法。

我被困住了,任何建议都会对您选择单词,R代码或SPSS语法有所帮助。

下面的直方图和散点图概述了我的主要变量(二分变量除外)

主要变量的说明:

age: Age in years
employ: Years with current employer
address: Years at current address
income: Household income in thousands
debtinc: Debt to income ratio (x100)
creddebt: Credit card debt in thousands
othdebt: Other debt in thousands
default: Previously defaulted (dichotomous, yes/no, 0/1)
ed: Level of education (No HS, HS, Some College, College, Post-grad)

其他变量只是上述内容的转换。我还尝试了将一些连续变量转换为分类变量,并在模型中实现它们,但是没有运气。

如果您想将其快速弹出到R中,则为:

## R Code
df <- read.spss(file="http://www.bertelsen.ca/R/logistic-regression.sav", use.value.labels=T, to.data.frame=T)

替代文字 替代文字



违约者的原始比例显然是4分之一,但似乎您也有很多变量。您是否尝试了所有这些,是否有感兴趣的任何主要变量集?
chl 2010年

原始变量位于文件的开头。其余的是由x_标识的转换(其中x = log,ln,inv,sqrt)。我已经尝试过混合使用这些。但是,我对如何解释或创建预测变量为0.1的残差图感到有些困惑
Brandon Bertelsen

就感兴趣的变量而言,我已经尝试了所有这些变量的主变量,变换变量的多种不同组合以及包括交互作用的混合模型。总体效率仍未超过81.7%。
布兰登·贝特尔森

Answers:


8

在这样的不平衡数据集中,通常可以通过避免使用拟合概率.5作为切入点将案例分类为违约者和非违约者的方法来提高分类性能。例如,对于具有所有二阶交互的glm,我得到的正确分类率为.88和.58,切点为.4。(这可能会导致过拟合,并且似乎存在一些排名问题,但这是另一回事了。)

码:

m <- glm(default ~ (age + employ + address + income + debtinc + 
                    creddebt + othdebt + ed)^2,
   family=binomial(), data=df)
p <- predict(m, newdata=df, type="response")

getMisclass <- function(cutoff, p, labels){
   pred <- factor(1*(p > cutoff), labels=c("No Default", "Default")) 
   t <- table(pred, labels)
   cat("cutoff ", cutoff, ":\n")
   print(t)
   cat("correct    :", round(sum(t[c(1,4)])/sum(t), 2),"\n")
   cat("correct No :", round(t[1]/sum(t[,1]), 2),"\n")
   cat("correct Yes:", round(t[4]/sum(t[,2]), 2),"\n\n")
   invisible(t)
}
cutoffs <- seq(.1,.9,by=.1)
sapply(cutoffs, getMisclass, p=p, labels=df$default)

部分输出:

cutoff  0.3 :
            labels
pred           No  Yes
  No Default 3004  352
  Default     740  903
correct    : 0.78 
correct No : 0.8 
correct Yes: 0.72 

cutoff  0.4 :
            labels
pred           No  Yes
  No Default 3278  532
  Default     466  723
correct    : 0.8 
correct No : 0.88 
correct Yes: 0.58 

cutoff  0.5 :
        labels
pred           No  Yes
  No Default 3493  685
  Default     251  570
correct    : 0.81 
correct No : 0.93 
correct Yes: 0.45 

cutoff  0.6 :
            labels
pred           No  Yes
  No Default 3606  824
  Default     138  431
correct    : 0.81 
correct No : 0.96 
correct Yes: 0.34 

感谢您的尝试,我也使用了阈值,它对分类没有太大的帮助。
Brandon Bertelsen

1
虽然,它确实在预测违约者方面做得更好。
Brandon Bertelsen

4

我不是逻辑回归专家,但这不只是数据不平衡的问题吗?可能您的非违约者比违约者多得多,这可能会使预测发生变化,从而更好地应对更大的类别。尝试踢出一些非违约者,看看会发生什么。


我尝试了一下,总体效率没有实质性的提高或降低(效率是在没有假阳性,假阴性的情况下预测违约者/非违约者的能力)
布兰登·贝特尔森

1
@布兰登我尝试了其他一些想法,但似乎没有帮助。这表明该集合刚好足以做到这一点(可能默认值只是由一些不可预测的随机因素所驱动)。

@mbq,感谢您抽出宝贵的时间!非常感激。
布兰登·贝特尔森

1
就我个人而言,我认为这是现场数据,我的教授在他的一份咨询工作中获得酬劳以进行建模……但这完全是另一个问题
Brandon Bertelsen,2010年

1
数据分析问题的解决方案永远不应“丢掉有效的数据点”-您可以尝试使用平衡的训练数据集以避免这些影响,但仍应评估所有数据(即所有数据)的预测验证集)。

4

在逻辑回归中,结果变量的分布高度偏斜(在事件中非事件更多,反之亦然),切点或概率触发确实需要调整,但对总体分类没有太大影响效率。这将始终保持大致相同,但是您当前正在对事件进行分类,因为此类数据集中的“机会”概率将始终使您更有可能分类为非事件。这需要进行调整。实际上,在这种情况下,看到分类的整体效率下降并不少见,因为先前由于偶然性而因计算错误而夸大了分类的效率。

这样考虑一下,如果您有90%的人不这样做而10%的人这样做,那么如果您将每个人都放入“不做”组中,那么您会自动获得90%的权利,甚至没有尝试,只是纯粹的机会,就因为它的分布偏斜而膨胀。

相互作用的问题与这种歪斜无关,应该由理论​​来驱动。您很可能总是会通过添加其他术语(包括简单地添加交互)来改善分类,但是您通常会过度拟合模型来这样做。然后,您必须返回并能够解释这一点。

Matt P数据分析师,伊利诺伊大学厄巴纳-香槟分校


2

您可以尝试包括所有的交互作用。然后,您可以使用L1 / L2正则化logistic回归来最大程度地减少过度拟合并利用任何有用的功能。我真的很喜欢Hastie / Tibshirani的glmnet软件包(http://cran.r-project.org/web/packages/glmnet/index.html)。


唯一的问题是,我必须能够使用SPSS输出来重现此内容。:(尽管我仍要尝试!
Brandon Bertelsen

尝试了一下,似乎无法使预报.glmnet()工作。设置newx时是否需要发生任何魔术?
Brandon Bertelsen

2

我知道您的问题与逻辑回归有关,因为这是一项家庭作业,因此您的方法可能会受到限制。但是,如果您感兴趣的是交互作用和分类的准确性,那么使用诸如CART之类的模型进行建模可能会很有趣。

这是一些生成基本树的R代码。我在整个enire数据帧上设置了rpart。如果没有先验知识和交叉验证方法,可能不是最好的方法:

library(foreign)
df <- read.spss(file="http://www.bertelsen.ca/R/logistic-regression.sav", use.value.labels=T, to.data.frame=T) 
library(rpart) 
fit<-rpart(default~.,method="anova",data=df)
 pfit<- prune(fit, cp=   fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])

# plot the pruned tree 
 plot(pfit, uniform=TRUE, 
   main="Pruned Classification Tree for Loan Default")
text(pfit, use.n=TRUE, all=TRUE, cex=.8)

我不确定马上要如何生成分类表。从模型对象的预测值和原始值开始,应该不会太难。有人在这里有提示吗?


分类和回归树?这实际上是分配的第二部分。在最大化分类之后,我必须根据概率指标进行分类。
Brandon Bertelsen

实际上,有人帮助我生成了以下相关问题的分类表:stats.stackexchange.com/questions/4832/…感谢R的示例,非常感谢,我在quick-r网站上找到了类似的说明。尽管出于这个目的,我被迫在SPSS中应用CHAID。
Brandon Bertelsen

predict预测方法,table(originalClasses,predictedClasses)用于表格构建。我尝试了RF(通常具有与过拟合的CART一样的精度,但没有过拟合的效果),结果并没有比更好glm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.