Migliore classificazione del default nella regressione logistica


12

Divulgazione completa: si tratta di compiti a casa. Ho incluso un collegamento al set di dati ( http://www.bertelsen.ca/R/logistic-regression.sav )

Il mio obiettivo è massimizzare la previsione dei inadempienti sui prestiti in questo set di dati.

Ogni modello che ho escogitato finora prevede> 90% dei non inadempienti, ma <40% dei inadempienti rende l'efficienza della classificazione complessivamente ~ 80%. Quindi, mi chiedo se ci sono effetti di interazione tra le variabili? All'interno di una regressione logistica, oltre a testare ogni possibile combinazione esiste un modo per identificare potenziali effetti di interazione? O in alternativa un modo per aumentare l'efficienza della classificazione dei inadempienti.

Sono bloccato, qualsiasi consiglio sarebbe utile nella tua scelta di parole, codice R o sintassi SPSS.

Le mie variabili primarie sono descritte nel seguente istogramma e grafico a dispersione (ad eccezione della variabile dicotomica)

Una descrizione delle variabili primarie:

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)

Le variabili aggiuntive sono solo trasformazioni di quanto sopra. Ho anche provato a convertire alcune variabili continue in variabili categoriali e ad implementarle nel modello, senza fortuna lì.

Se vuoi inserirlo in R, rapidamente, eccolo qui:

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

testo alternativo testo alternativo



La proporzione grezza di valori predefiniti è apparentemente 1 caso su 4, ma sembra che tu abbia anche molte variabili. Li hai provati tutti, hai qualche insieme di variabili primarie di interesse?
chl

Le variabili originali sono all'inizio del file. Il resto sono trasformazioni dello stesso identificate da x_ (dove x = log, ln, inv, sqrt). Ho provato una miscela di questi. Ma sono un po 'seccato su come interpretare o creare grafici residui in cui il predittore è 0,1
Brandon Bertelsen,

In termini di variabili di interesse, ho provato tutte queste primarie e una serie di diverse combinazioni delle variabili trasformate, nonché modelli misti che includono effetti di interazione. Tuttavia, niente di più elevato dell'81,7% di efficienza complessiva.
Brandon Bertelsen,

Risposte:


8

In insiemi di dati non bilanciati come questo, di solito è possibile migliorare le prestazioni di classificazione allontanandosi dall'utilizzare una probabilità adattata di 0,5 come punto di divisione per classificare i casi in inadempienti e non inadempienti. Ad esempio, ottengo tassi di classificazione corretti di .88 e .58 con un punto di taglio di .4 per un glm con tutte le interazioni del 2 ° ordine. (Il che probabilmente porta a un overfitting e sembra avere alcuni problemi di rango, ma questa è un'altra storia.)

Codice:

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)

uscita parziale:

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 

Grazie per aver provato, ho giocato anche con la soglia e questo ha dato un piccolo impulso alla classifica.
Brandon Bertelsen,

1
Tuttavia, ha fatto un lavoro migliore nel predire i inadempienti.
Brandon Bertelsen,

4

Non sono un esperto di regressione logistica, ma non è solo un problema di dati non bilanciati? Probabilmente hai molti più non-default rispetto ai default che potrebbero spostare la previsione per affrontare meglio la classe più ampia. Prova a eliminare alcuni non inadempienti e guarda cosa succede.


L'ho provato, non ho presentato aumenti o diminuzioni sostanziali dell'efficienza complessiva (l'efficienza è quanto ha predetto inadempienti / non inadempienti in assenza di falsi positivi, falsi negativi)
Brandon Bertelsen,

1
@Brandon Ho provato alcune altre idee e non sembra aiutare. Ciò suggerisce che questo set è abbastanza difficile da far sì che ciò accada (forse il default è guidato solo da alcuni fattori casuali imprevedibili).

@mbq, grazie per aver dedicato del tempo! Molto apprezzato.
Brandon Bertelsen,

1
Personalmente, penso che si tratti di dati in tempo reale che il mio prof viene pagato per modellare in uno dei suoi lavori di consulenza ... ma questo è un altro problema
Brandon Bertelsen,

1
la soluzione a un problema nell'analisi dei dati non dovrebbe mai essere "buttare via punti di dati validi" - si potrebbe provare a utilizzare set di dati di allenamento bilanciati per evitare questi effetti, ma è comunque necessario valutare le previsioni su tutti i dati (ovvero tutti del set di convalida).
fabians

4

Nella regressione logistica, le distribuzioni altamente distorte delle variabili di risultato (dove ci sono molti più non eventi a eventi o viceversa), il punto di taglio o il trigger di probabilità deve essere regolato, ma non avrà molto effetto sulla classificazione generale efficieny. Questo rimarrà sempre più o meno lo stesso, ma al momento stai classificando gli eventi in modo insufficiente poiché la probabilità di "possibilità" in un set di dati di questo tipo ti renderà sempre più probabile classificarti in non eventi. Questo deve essere adattato per. In effetti, in una situazione del genere non è raro vedere l'efficacia generale della classificazione ridursi, poiché in precedenza era stata gonfiata dal calcolo errato a causa del caso.

Pensa in questo modo, se hai un evento in cui il 90% non lo fa e il 10% lo fa, quindi se metti tutti nel gruppo "non farlo", ottieni automaticamente il 90% giusto, e che era senza nemmeno provarci, solo per puro caso, gonfiato dall'incertezza della sua distribuzione.

La questione delle interazioni non è correlata a questa inclinazione e dovrebbe essere guidata dalla teoria. Molto probabilmente migliorerai sempre la classificazione aggiungendo termini aggiuntivi, incluso semplicemente aggiungendo interazioni, ma lo fai spesso sovrastimando il modello. Devi quindi tornare indietro ed essere in grado di interpretarlo.

Analista dati Matt P, Campionato Urbana dell'Università dell'Illinois


2

Potresti semplicemente provare a includere tutti gli effetti di interazione. È quindi possibile utilizzare la regressione logistica regolarizzata L1 / L2 per ridurre al minimo l'adattamento eccessivo e sfruttare tutte le funzionalità utili. Mi piace molto il pacchetto glmnet di Hastie / Tibshirani (http://cran.r-project.org/web/packages/glmnet/index.html).


L'unico problema è che devo essere in grado di riprodurlo con output SPSS. :( Ci proverò comunque!
Brandon Bertelsen il

Provato, non riesco a far funzionare predict.glmnet (). C'è qualche magia che deve accadere quando imposti newx?
Brandon Bertelsen,

2

So che la tua domanda riguarda la regressione logistica e poiché si tratta di un compito a casa, quindi il tuo approccio potrebbe essere limitato. Tuttavia, se il tuo interesse è per le interazioni e l'accuratezza della classificazione, potrebbe essere interessante utilizzare qualcosa come CART per modellarlo.

Ecco del codice R per produrre l'albero di base. Ho lasciato libero rpart sul frame di dati enire qui. Forse non è l'approccio migliore senza una conoscenza preliminare e un metodo di convalida incrociata:

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)

Non sono sicuro di come produrre la tabella di classificazione. Non dovrebbe essere troppo difficile dai valori previsti dall'oggetto modello e dai valori originali. Qualcuno ha qualche consiglio qui?


Alberi di classificazione e regressione? Questa è in realtà una seconda parte dell'incarico. Dopo aver massimizzato la classificazione, devo classificarlo in base ai decili di probabilità.
Brandon Bertelsen,

In realtà, qualcuno mi ha aiutato a produrre la tabella di classificazione in questa domanda correlata: stats.stackexchange.com/questions/4832/… Grazie per l'esempio con R, molto apprezzato, ho trovato istruzioni simili sul sito web di quick-r. Anche se, per questo studente, sono costretto ad applicare CHAID in SPSS.
Brandon Bertelsen,

predictmetodo di previsione, table(originalClasses,predictedClasses)per la costruzione di tavoli. Ho provato la RF (di solito ha la precisione come nel CART sovralimentato, ma non in eccesso) e il risultato non è stato molto migliore di glm.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.