Mejor clasificación de incumplimiento en regresión logística

12

Divulgación completa: esta es la tarea. He incluido un enlace al conjunto de datos ( http://www.bertelsen.ca/R/logistic-regression.sav )

Mi objetivo es maximizar la predicción de incumplimientos de préstamos en este conjunto de datos.

Todos los modelos que se me ocurrieron hasta ahora predicen> 90% de los no morosos, pero <40% de los morosos hacen que la eficiencia de clasificación sea general ~ 80%. Entonces, me pregunto si hay efectos de interacción entre las variables. Dentro de una regresión logística, aparte de probar cada combinación posible, ¿hay alguna manera de identificar posibles efectos de interacción? O, alternativamente, una forma de aumentar la eficiencia de la clasificación de los morosos.

Estoy atascado, cualquier recomendación sería útil en su elección de palabras, código R o sintaxis SPSS.

Mis variables principales se resumen en el siguiente histograma y diagrama de dispersión (con la excepción de la variable dicotómica)

Una descripción de las variables primarias:

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)

Las variables adicionales son solo transformaciones de lo anterior. También intenté convertir algunas de las variables continuas en variables categóricas e implementarlas en el modelo, no hubo suerte allí.

Si desea ingresarlo en R, rápidamente, aquí 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
fuente
La proporción bruta de morosos es aparentemente 1 de 4 casos, pero parece que también tiene muchas variables. ¿Los probaste todos? ¿Tienes algún conjunto de variables principales de interés?
chl
Las variables originales están al frente del archivo. El resto son transformaciones de lo mismo identificado por x_ (donde x = log, ln, inv, sqrt). He probado una mezcla de estos. Pero estoy un poco molesto sobre cómo interpretar o crear trazados residuales donde el predictor es 0,1
Brandon Bertelsen
En términos de variables de interés, he probado todas ellas primarias y varias combinaciones diferentes de las variables transformadas, así como modelos mixtos que incluyen efectos de interacción. Aún así, nada más que el 81.7% de eficiencia general.
Brandon Bertelsen

Respuestas:

8

En conjuntos de datos desequilibrados como este, generalmente puede mejorar el rendimiento de la clasificación alejándose del uso de una probabilidad ajustada de .5 como punto de corte para clasificar los casos en morosos y no morosos. Por ejemplo, obtengo tasas de clasificación correctas de .88 y .58 con un punto de corte de .4 para un glm con todas las interacciones de segundo orden. (Lo que probablemente conduce a un sobreajuste y parece tener algunos problemas de rango, pero esa es otra historia).

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)

salida 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 
fabians
fuente
Gracias por intentarlo, también jugué con el umbral y me dio un pequeño impulso a la clasificación.
Brandon Bertelsen
1
Sin embargo, hizo un mejor trabajo al predecir incumplidores.
Brandon Bertelsen
4

No soy un experto en regresión logística, pero ¿no es solo un problema de datos no balanceados? Probablemente tenga muchos más no incumplidores que incumplidores, lo que puede cambiar la predicción para tratar mejor con una clase más grande. Trate de echar a algunos no morosos y vea qué sucede.


fuente
Lo probé, no presenté aumentos o disminuciones sustanciales en la eficiencia general (la eficiencia es qué tan bien predijo los morosos / no morosos en ausencia de falsos positivos, falsos negativos)
Brandon Bertelsen
1
@ Brandon He probado algunas otras ideas y no parece ayudar. Esto sugiere que este conjunto es lo suficientemente difícil como para hacer que esto suceda (posiblemente el valor predeterminado sea impulsado por algunos factores aleatorios impredecibles).
@mbq, gracias por tomarse el tiempo! Muy apreciado.
Brandon Bertelsen
1
Personalmente, creo que estos son datos en vivo que a mi profesor se le paga para modelar en uno de sus trabajos de consultoría ... pero ese es otro problema por completo
Brandon Bertelsen el
1
La solución a un problema en el análisis de datos nunca debe ser "tirar puntos de datos válidos": puede intentar utilizar conjuntos de datos de entrenamiento equilibrados para evitar estos efectos, pero aún debe evaluar las predicciones en todos los datos (es decir, todos del conjunto de validación).
fabians
4

En la regresión logística, distribuciones muy sesgadas de las variables de resultado (donde hay muchos más eventos no relacionados con eventos o viceversa), es necesario ajustar el punto de corte o el disparador de probabilidad, pero no tendrá mucho efecto en la clasificación general eficiencia Esto siempre será más o menos el mismo, pero actualmente está subclasificando eventos ya que la probabilidad de "oportunidad" en dicho conjunto de datos siempre lo hará más propenso a clasificar en no eventos. Esto necesita ser ajustado para. De hecho, en tal situación, no es raro ver que la eficiencia general de la clasificación disminuya, ya que anteriormente se infló por error de cálculo debido al azar.

Piénselo de esta manera, si tiene un evento en el que el 90% no lo hace y el 10% lo hace, entonces si coloca a todos en el grupo "no lo haga", automáticamente obtendrá el 90% correcto, y eso fue sin siquiera intentarlo, solo pura casualidad, inflado por la asimetría de su distribución.

El tema de las interacciones no está relacionado con este sesgo, y debe ser impulsado por la teoría. Lo más probable es que siempre mejore la clasificación agregando términos adicionales, incluso simplemente agregando interacciones, pero lo hace a menudo sobreajustando el modelo. Luego debe regresar y ser capaz de interpretar esto.

Matt P Analista de datos, Universidad de Illinois Urbana Champaign


fuente
2

Puede intentar incluir todos los efectos de interacción. Luego puede usar la regresión logística regularizada L1 / L2 para minimizar el sobreajuste y aprovechar las características útiles. Realmente me gusta el paquete glmnet de Hastie / Tibshirani (http://cran.r-project.org/web/packages/glmnet/index.html).

IanS
fuente
El único problema es que tengo que poder reproducir esto con la salida de SPSS. :( ¡Todavía voy a probarlo!
Brandon Bertelsen
Lo probé, parece que no puedo hacer que predic.glmnet () funcione. ¿Hay alguna magia que deba estar sucediendo cuando configuras newx?
Brandon Bertelsen
2

Sé que su pregunta es acerca de la regresión logística y, como se trata de una tarea, su enfoque puede verse limitado. Sin embargo, si su interés está en las interacciones y la precisión de la clasificación, puede ser interesante usar algo como CART para modelar esto.

Aquí hay un código R para producir el árbol básico. He puesto rpart suelto en el marco de datos enire aquí. Quizás no sea el mejor enfoque sin un conocimiento previo y un método de validación 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)

No estoy seguro de cómo producir la tabla de clasificación. No debería ser demasiado difícil de los valores pronosticados del objeto modelo y los valores originales. ¿Alguien tiene algún consejo aquí?

Brett
fuente
¿Árboles de clasificación y regresión? Esa es en realidad una segunda parte de la tarea. Después de haber maximizado la clasificación, tengo que clasificar según los deciles de probabilidad.
Brandon Bertelsen
En realidad, alguien me ayudó a producir la tabla de clasificación en esta pregunta relacionada: stats.stackexchange.com/questions/4832/… Gracias por el ejemplo con R, muy apreciado, encontré instrucciones similares en el sitio web de quick-r. Aunque, para este propósito, me veo obligado a aplicar CHAID en SPSS.
Brandon Bertelsen
predictmétodo de predicción, table(originalClasses,predictedClasses)para la construcción de tablas. Intenté RF (generalmente tiene una precisión como en CART sobreajustado, pero no sobreajustado) y el resultado no fue mucho mejor que glm.