Meilleure classification des défauts de régression logistique

12

Divulgation complète: ce sont des devoirs. J'ai inclus un lien vers l'ensemble de données ( http://www.bertelsen.ca/R/logistic-regression.sav )

Mon objectif est de maximiser la prédiction des défaillants dans cet ensemble de données.

Chaque modèle que j'ai trouvé jusqu'à présent prédit> 90% des non-défaillants, mais <40% des défaillants, ce qui rend l'efficacité de la classification globale ~ 80%. Je me demande donc s'il y a des effets d'interaction entre les variables? Dans une régression logistique, outre le test de chaque combinaison possible, existe-t-il un moyen d'identifier les effets d'interaction potentiels? Ou encore un moyen d'augmenter l'efficacité de la classification des défaillants.

Je suis coincé, toute recommandation serait utile dans votre choix de mots, de code R ou de syntaxe SPSS.

Mes variables principales sont décrites dans l'histogramme et le diagramme de dispersion suivants (à l'exception de la variable dichotomique)

Une description des variables primaires:

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)

Les variables supplémentaires ne sont que des transformations de ce qui précède. J'ai également essayé de convertir quelques-unes des variables continues en variables catégorielles et de les implémenter dans le modèle, pas de chance là-bas.

Si vous souhaitez l'insérer dans R, rapidement, le voici:

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

texte alternatif texte alternatif

Brandon Bertelsen
la source
La proportion brute de défaillants est apparemment de 1 cas sur 4, mais il semble que vous ayez également beaucoup de variables. Les avez-vous tous essayés, avez-vous un ensemble de variables principales d'intérêt?
chl
Les variables d'origine se trouvent au début du fichier. Les autres sont des transformations du même identifiées par x_ (où x = log, ln, inv, sqrt). J'ai essayé un mélange de ceux-ci. Mais je suis un peu vexé sur la façon d'interpréter ou de créer des tracés résiduels où le prédicteur est 0,1
Brandon Bertelsen
En termes de variables d'intérêt, j'ai essayé toutes ces variables primaires et un certain nombre de combinaisons différentes des variables transformées ainsi que des modèles mixtes qui incluent des effets d'interaction. Pourtant, rien de plus que 81,7% d'efficacité globale.
Brandon Bertelsen

Réponses:

8

Dans des ensembles de données non équilibrés tels que celui-ci, vous pouvez généralement améliorer les performances de classification en vous éloignant de l'utilisation d'une probabilité ajustée de 0,5 comme point de coupure pour classer les cas en défaillants et non-défaillants. Par exemple, j'obtiens des taux de classification corrects de 0,88 et 0,58 avec un point de coupure de 0,4 pour un glm avec toutes les interactions de second ordre. (Ce qui conduit probablement à un sur-ajustement et semble avoir des problèmes de classement, mais c'est une autre histoire.)

Code:

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)

sortie partielle:

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
la source
Merci d'avoir essayé, j'ai également joué avec le seuil et cela n'a donné que peu de boost au classement.
Brandon Bertelsen
1
Cependant, il a fait un meilleur travail de prédiction des défaillants.
Brandon Bertelsen
4

Je ne suis pas un expert en régression logistique, mais n'est-ce pas simplement un problème de données déséquilibrées? Vous avez probablement beaucoup plus de non-défaillants que de défaillants, ce qui peut modifier la prédiction pour mieux gérer une classe plus grande. Essayez d'éliminer certains non-défaillants et voyez ce qui se passe.


la source
Je l'ai essayé, je n'ai présenté aucune augmentation ou diminution substantielle de l'efficacité globale (l'efficacité étant la façon dont il a prédit les défaillants / non-défaillants en l'absence de faux positifs, de faux négatifs)
Brandon Bertelsen
1
@Brandon J'ai essayé quelques autres idées et cela ne semble pas aider. Cela suggère que cet ensemble est juste assez difficile pour y arriver (peut-être que la valeur par défaut est simplement motivée par certains facteurs aléatoires imprévisibles).
@mbq, merci d'avoir pris le temps! Très appréciée.
Brandon Bertelsen
1
Personnellement, je pense que ce sont des données en direct que mon prof est payé pour modéliser dans l'un de ses emplois de consultant ... mais c'est un autre problème entièrement
Brandon Bertelsen
1
la solution à un problème dans l'analyse des données ne doit jamais être de «jeter des points de données valides» - vous pouvez essayer d'utiliser des ensembles de données d'entraînement équilibrés afin d'éviter ces effets, mais vous devez toujours évaluer les prédictions sur toutes les données (c'est-à-dire toutes de l'ensemble de validation).
fabians
4

Dans la régression logistique, les distributions très asymétriques des variables de résultats (où il y a beaucoup plus de non-événements aux événements ou vice versa), le point de coupure ou le déclencheur de probabilité doit être ajusté, mais il n'aura pas beaucoup d'effet sur la classification globale efficacité. Cela restera toujours à peu près le même, mais vous sous-classifiez actuellement les événements, car la probabilité de «chance» dans un tel ensemble de données vous rendra toujours plus susceptible de classer en non-événements. Cela doit être ajusté. En fait, dans une telle situation, il n'est pas rare de voir l'efficacité globale de la classification diminuer, car elle était auparavant gonflée par un mauvais calcul dû au hasard.

Pensez-y de cette façon, si vous avez un événement où 90% ne le font pas et 10% le font, alors si vous mettez tout le monde dans le groupe "ne le faites pas", vous obtenez automatiquement 90% de raison, et que était sans même essayer, juste un pur hasard, gonflé par l'asymétrie de sa distribution.

La question des interactions n'est pas liée à cette asymétrie et devrait être motivée par la théorie. Vous améliorerez très probablement toujours la classification en ajoutant des termes supplémentaires, y compris en ajoutant simplement des interactions, mais vous le faites en sur-adaptant souvent le modèle. Il faut ensuite revenir en arrière et pouvoir interpréter cela.

Matt P Data Analyst, University of Illinois Urbana Champaign


la source
2

Vous pourriez simplement essayer d'inclure tous les effets d'interaction. Vous pouvez ensuite utiliser la régression logistique régularisée L1 / L2 pour minimiser le sur-ajustement et profiter de toutes les fonctionnalités utiles. J'aime vraiment le paquet glmnet de Hastie / Tibshirani (http://cran.r-project.org/web/packages/glmnet/index.html).

IanS
la source
Le seul problème est que je dois pouvoir reproduire cela avec une sortie SPSS. :( Je vais quand même l'essayer!
Brandon Bertelsen
Je l'ai essayé, je n'arrive pas à faire fonctionner Predict.glmnet (). Y a-t-il une magie qui doit se produire lorsque vous définissez newx?
Brandon Bertelsen
2

Je sais que votre question porte sur la régression logistique et comme il s'agit d'une affectation aux devoirs, votre approche peut être limitée. Cependant, si vous vous intéressez aux interactions et à l'exactitude de la classification, il peut être intéressant d'utiliser quelque chose comme CART pour modéliser cela.

Voici du code R pour produire l'arborescence de base. J'ai mis rpart en vrac sur le cadre de données enire ici. Peut-être pas la meilleure approche sans quelques connaissances préalables et une méthode de validation croisée:

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)

Je ne sais pas exactement comment produire la table de classification. Cela ne devrait pas être trop difficile à partir des valeurs prédites de l'objet modèle et des valeurs d'origine. Quelqu'un a des conseils ici?

Brett
la source
Arbres de classification et de régression? Il s'agit en fait d'une deuxième partie de la mission. Après avoir maximisé la classification, je dois classer en fonction des déciles de probabilité.
Brandon Bertelsen
En fait, quelqu'un m'a aidé à produire le tableau de classification dans cette question connexe: stats.stackexchange.com/questions/4832/… Merci pour l'exemple avec R, très apprécié, j'ai trouvé des instructions similaires sur le site Web de quick-r. Bien que, pour ce but, je suis obligé d'appliquer CHAID dans SPSS.
Brandon Bertelsen,
predictméthode de prédiction, table(originalClasses,predictedClasses)de construction de table. J'ai essayé RF (généralement il a une précision comme dans un panier sur-équipé, mais pas de sur-ajustement) et le résultat n'était pas beaucoup mieux que glm.