Melhor classificação do padrão na regressão logística

12

Divulgação completa: Este é o dever de casa. Incluí um link para o conjunto de dados ( http://www.bertelsen.ca/R/logistic-regression.sav )

Meu objetivo é maximizar a previsão de inadimplentes neste conjunto de dados.

Todos os modelos apresentados até agora prevêem> 90% dos não-infratores, mas <40% dos inadimplentes, tornando a eficiência da classificação geral ~ 80%. Então, eu me pergunto se existem efeitos de interação entre as variáveis. Dentro de uma regressão logística, além de testar cada combinação possível, existe uma maneira de identificar possíveis efeitos de interação? Ou, alternativamente, uma maneira de aumentar a eficiência da classificação dos inadimplentes.

Estou empacado, qualquer recomendação seria útil na sua escolha de palavras, código R ou sintaxe SPSS.

Minhas variáveis ​​primárias são descritas no seguinte histograma e gráfico de dispersão (com exceção da variável dicotômica)

Uma descrição das variáveis ​​primárias:

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)

Variáveis ​​adicionais são apenas transformações dos itens acima. Também tentei converter algumas das variáveis ​​contínuas em variáveis ​​categóricas e implementá-las no modelo, sem sorte lá.

Se você deseja colocá-lo no R, rapidamente, aqui está:

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

texto alternativo texto alternativo

Brandon Bertelsen
fonte
A proporção bruta de inadimplentes é aparentemente 1 em cada 4, mas parece que você também tem muitas variáveis. Você experimentou todas elas, possui algum conjunto de variáveis ​​primárias de interesse?
chl
As variáveis ​​originais estão na frente do arquivo. O restante são transformações dos mesmos identificados por x_ (onde x = log, ln, inv, sqrt). Eu tentei uma mistura destes. Mas estou um pouco ofendido sobre a forma de interpretar ou criar gráficos de resíduos, onde o indicador é de 0,1
Brandon Bertelsen
Em termos de variáveis ​​de interesse, tentei todas elas primárias e várias combinações diferentes das variáveis ​​transformadas, bem como modelos mistos que incluem efeitos de interação. Ainda assim, nada superior a 81,7% de eficiência geral.
precisa

Respostas:

8

Em conjuntos de dados desequilibrados como esse, geralmente é possível melhorar o desempenho da classificação, deixando de usar uma probabilidade ajustada de 0,5 como ponto de corte para classificar os casos em inadimplentes e não inadimplentes. Por exemplo, recebo taxas de classificação corretas de 0,88 e 0,88 com um ponto de corte de 0,4 para um glm com todas as interações de segunda ordem. (O que provavelmente leva ao excesso de ajustes e parece ter alguns problemas de classificação, mas isso é outra história.)

Código:

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)

saída parcial:

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 
fabianos
fonte
Obrigado por tentar, eu joguei com o limiar também e isso deu pouco impulso à classificação.
Brandon Bertelsen
1
Embora, ele fez um trabalho melhor na previsão de inadimplentes.
precisa
4

Não sou especialista em regressão logística, mas não é apenas um problema de dados desequilibrados? Provavelmente você tem muito mais não-inadimplentes do que inadimplentes, o que pode mudar a previsão para lidar melhor com a classe maior. Tente expulsar alguns não-infratores e ver o que acontece.


fonte
Eu tentei sair, não apresentaram aumentos substanciais ou diminuições na eficiência global (eficiência sendo o quão bem ele previu inadimplentes / não inadimplentes na ausência de falso-positivos, falso-negativos)
Brandon Bertelsen
1
@Brandon Eu tentei algumas outras idéias e isso não parece ajudar. Isso sugere que esse conjunto é suficientemente difícil para que isso aconteça (possivelmente o padrão é motivado por alguns fatores aleatórios imprevisíveis).
@mbq, obrigado por dedicar um tempo! Muito apreciado.
precisa
1
Pessoalmente, penso que este é dados ao vivo que meu prof está sendo pago para modelo em um de seus trabalhos de consultoria ... mas isso é outra questão inteiramente
Brandon Bertelsen
1
a solução para um problema na análise de dados nunca deve ser "descartar pontos de dados válidos" - você pode tentar usar conjuntos de dados de treinamento balanceados para evitar esses efeitos, mas ainda assim deve avaliar as previsões de todos os dados (ou seja, todos do conjunto de validação).
Fabian
4

Na regressão logística, distribuições altamente distorcidas de variáveis ​​de resultado (onde há muito mais eventos a eventos ou vice-versa), o ponto de corte ou o gatilho de probabilidade precisam ser ajustados, mas não terão muito efeito na classificação geral eficácia. Isso sempre permanecerá aproximadamente o mesmo, mas atualmente você está subclassificando eventos, pois a probabilidade de "chance" nesse conjunto de dados sempre aumentará a probabilidade de classificação em não-eventos. Isso precisa ser ajustado para. De fato, em tal situação, não é incomum ver a eficiência geral da classificação diminuir, pois ela foi inflada anteriormente por erros de cálculo devido ao acaso.

Pense desta maneira: se você tiver um evento em que 90% não o faça e 10% o faça, se você colocar todos no grupo "não faça", você automaticamente acertará 90%, e isso foi sem sequer tentar, apenas puro acaso, inflado pela distorção de sua distribuição.

A questão das interações não está relacionada a essa distorção e deve ser impulsionada pela teoria. Provavelmente, você sempre melhorará a classificação adicionando termos adicionais, incluindo simplesmente a adição de interações, mas isso é feito com excesso de ajuste no modelo. Você precisa voltar e ser capaz de interpretar isso.

Matt P Analista de dados, Universidade de Illinois Urbana Champaign


fonte
2

Você pode apenas tentar incluir todos os efeitos de interação. Você pode usar a regressão logística regularizada L1 / L2 para minimizar o excesso de ajuste e tirar proveito de quaisquer recursos úteis. Eu realmente gosto do pacote glmnet de Hastie / Tibshirani (http://cran.r-project.org/web/packages/glmnet/index.html).

IanS
fonte
O único problema é que tenho que conseguir reproduzir isso com a saída SPSS. :( Ainda vou tentar!
Brandon Bertelsen
Tentei, parece que não consigo fazer o forecast.glmnet () funcionar. Existe alguma mágica que precisa estar acontecendo quando você define o newx?
precisa
2

Sei que sua pergunta é sobre regressão logística e, como é uma tarefa de casa, sua abordagem pode ser restrita. No entanto, se o seu interesse estiver nas interações e na precisão da classificação, pode ser interessante usar algo como CART para modelar isso.

Aqui está um código R para produzir a árvore básica. Soltei o rpart no quadro de dados completo aqui. Talvez não seja a melhor abordagem sem conhecimento prévio e um método de validação cruzada:

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)

Não sei ao certo como produzir a tabela de classificação. Não deve ser muito difícil dos valores previstos do objeto de modelo e dos valores originais. Alguém tem alguma dica aqui?

Brett
fonte
Árvores de classificação e regressão? Essa é realmente uma segunda parte da tarefa. Depois de maximizar a classificação, tenho que classificá-lo com base em decis de probabilidade.
precisa
Na verdade, alguém me ajudou a produzir a tabela de classificação nesta pergunta relacionada: stats.stackexchange.com/questions/4832/… Obrigado pelo exemplo com R, muito apreciado, encontrei instruções semelhantes no site quick-r. Embora, para esse propósito, sou forçado a aplicar o CHAID no SPSS.
Brandon Bertelsen
predictmétodo de previsão, table(originalClasses,predictedClasses)para construção de tabela. Eu tentei RF (geralmente tem precisão, como no CART com excesso de equipamento, mas sem excesso de ajuste) e o resultado não foi muito melhor do que glm.