Lepsza klasyfikacja domyślna w regresji logistycznej

12

Pełne ujawnienie: To zadanie domowe. Zamieściłem link do zestawu danych ( http://www.bertelsen.ca/R/logistic-regression.sav )

Moim celem jest zmaksymalizowanie prognozy osób spłacających zaległości kredytowe w tym zbiorze danych.

Każdy model, który do tej pory wymyśliłem, przewiduje> 90% domyślnych, ale <40% domyślnych, co daje ogólną skuteczność klasyfikacji ~ 80%. Zastanawiam się więc, czy między zmiennymi występują efekty interakcji? Czy w ramach regresji logistycznej oprócz testowania każdej możliwej kombinacji istnieje sposób na zidentyfikowanie potencjalnych efektów interakcji? Lub alternatywnie sposób na zwiększenie efektywności klasyfikacji osób naruszających prawo.

Utknąłem, wszelkie zalecenia byłyby pomocne w wyborze słów, kodu R lub składni SPSS.

Moje podstawowe zmienne są przedstawione na poniższym histogramie i wykresie rozrzutu (z wyjątkiem zmiennej dychotomicznej)

Opis podstawowych zmiennych:

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)

Dodatkowe zmienne są tylko przekształceniami powyższego. Próbowałem także przekonwertować kilka zmiennych ciągłych na zmienne kategorialne i zaimplementować je w modelu, ale nie ma tam szczęścia.

Jeśli chcesz szybko wstawić go do R, oto on:

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

alternatywny tekst alternatywny tekst

Brandon Bertelsen
źródło
Surowy odsetek domyślnych wynosi najwyraźniej 1 przypadek na 4, ale wygląda na to, że masz wiele zmiennych. Czy wypróbowałeś je wszystkie, czy masz jakiś zestaw podstawowych zmiennych będących przedmiotem zainteresowania?
chl
Oryginalne zmienne znajdują się na początku pliku. Reszta to transformacje tego samego oznaczone x_ (gdzie x = log, ln, inv, sqrt). Próbowałem ich kombinacji. Ale jestem trochę zdziwiony, jak interpretować lub tworzyć wykresy resztkowe, w których predyktorem jest 0,1
Brandon Bertelsen
Jeśli chodzi o zmienne będące przedmiotem zainteresowania, wypróbowałem wszystkie z nich podstawowe i szereg różnych kombinacji zmiennych transformowanych, a także mieszane modele, które zawierają efekty interakcji. Nadal nic nie przekracza 81,7% ogólnej wydajności.
Brandon Bertelsen,

Odpowiedzi:

8

W niezrównoważonych zestawach danych, takich jak ten, zwykle można poprawić wydajność klasyfikacji, odchodząc od stosowania dopasowanego prawdopodobieństwa 0,5 jako punktu odcięcia do klasyfikowania spraw do sprawców niewykonania zobowiązania i sprawców niewykonujących zobowiązania. Na przykład otrzymuję prawidłowe współczynniki klasyfikacji 0,88 i 0,58 z punktem odcięcia 0,4 dla glm ze wszystkimi interakcjami drugiego rzędu. (Co prawdopodobnie prowadzi do przeregulowania i wydaje się mieć pewne problemy z rangą, ale to inna historia.)

Kod:

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)

częściowa wydajność:

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 
fabianie
źródło
Dzięki za próbę, grałem również z progiem i niewiele poprawiło klasyfikację.
Brandon Bertelsen
1
Chociaż lepiej poradził sobie z domyślnymi osobami.
Brandon Bertelsen
4

Nie jestem ekspertem od regresji logistycznej, ale czy nie jest to tylko problem niezrównoważonych danych? Prawdopodobnie masz znacznie więcej osób, które nie wykonują domyślnie, niż domyślnie, co może zmienić przewidywanie, by lepiej sobie radzić z większą klasą. Spróbuj wykopać niektórych użytkowników, którzy nie wywiązują się ze zobowiązań, i zobacz, co się stanie.


źródło
Wypróbowałem to, nie pokazałem żadnych znaczących wzrostów ani spadków ogólnej wydajności (efektywność to to, jak dobrze przewidywała domyślnych / nie-domyślnych przy braku fałszywych trafień, fałszywych negatywów)
Brandon Bertelsen
1
@Brandon Wypróbowałem kilka innych pomysłów i wydaje się, że to nie pomaga. Sugeruje to, że ten zestaw jest wystarczająco trudny, aby tak się stało (być może domyślnym jest po prostu kilka nieprzewidywalnych czynników losowych).
@mbq, dzięki za poświęcenie czasu! Bardzo mile widziane.
Brandon Bertelsen,
1
Osobiście uważam, że są to dane na żywo, za które mój profes otrzymuje wynagrodzenie za model w jednym ze swoich zadań doradczych ... ale to zupełnie inna kwestia
Brandon Bertelsen
1
rozwiązaniem problemu w analizie danych nigdy nie powinno być „wyrzucenie prawidłowych punktów danych” - możesz spróbować użyć zrównoważonych zestawów danych treningowych, aby uniknąć tych efektów, ale nadal powinieneś oceniać prognozy dla wszystkich danych (tj. wszystkich zestawu sprawdzania poprawności).
fabians
4

W regresji logistycznej, bardzo wypaczone rozkłady zmiennych wynikowych (w przypadku znacznie większej liczby nie-zdarzeń dla zdarzeń lub odwrotnie), punkt odcięcia lub wyzwalacz prawdopodobieństwa muszą zostać dostosowane, ale nie będzie to miało większego wpływu na ogólną klasyfikację efektownie. To zawsze pozostanie mniej więcej takie samo, ale obecnie nie doceniasz zdarzeń, ponieważ prawdopodobieństwo „szansy” w takim zbiorze danych zawsze zwiększa prawdopodobieństwo zaklasyfikowania do zdarzeń niebędących zdarzeniami. Należy to dostosować. W rzeczywistości w takiej sytuacji nierzadko obserwuje się spadek ogólnej wydajności klasyfikacji, ponieważ wcześniej była ona zawyżona przez błędne obliczenia z powodu przypadku.

Pomyśl o tym w ten sposób, jeśli masz wydarzenie, w którym 90% tego nie robi, a 10% to robi, to jeśli umieścisz wszystkich w grupie „nie rób tego”, automatycznie otrzymujesz 90% racji, i że było nawet bez próby, po prostu czysty przypadek, napompowany skośnością jego dystrybucji.

Kwestia interakcji nie ma związku z tym wypaczaniem i powinna być napędzana teorią. Najprawdopodobniej zawsze poprawisz klasyfikację, dodając dodatkowe warunki, w tym po prostu dodając interakcje, ale robisz to, często przerabiając model. Następnie musisz wrócić i móc to zinterpretować.

Matt P Data Analyst, University of Illinois Urbana Champaign


źródło
2

Możesz po prostu spróbować dołączyć wszystkie efekty interakcji. Następnie można użyć regresji logistycznej z regulacją L1 / L2, aby zminimalizować nadmierne dopasowanie i skorzystać z wszelkich przydatnych funkcji. Naprawdę podoba mi się pakiet glmnet Hastie / Tibshirani (http://cran.r-project.org/web/packages/glmnet/index.html).

IanS
źródło
Jedynym problemem jest to, że muszę być w stanie odtworzyć to z wyjściem SPSS. :( Nadal będę tego próbował!
Brandon Bertelsen
Wypróbowałem to, ale nie wydaje się, aby można było przewidzieć predykcję.glmnet (). Czy jest jakaś magia, która musi się dziać po ustawieniu Newxa?
Brandon Bertelsen
2

Wiem, że twoje pytanie dotyczy regresji logistycznej i ponieważ jest to zadanie domowe, więc twoje podejście może być ograniczone. Jeśli jednak interesują Cię interakcje i dokładność klasyfikacji, może być interesujące użycie czegoś takiego jak KOSZYK do modelowania tego.

Oto kod R do zrobienia podstawowego drzewa. Tutaj ustawiłem rpart na całą ramkę danych. Być może nie jest to najlepsze podejście bez wcześniejszej wiedzy i metody krzyżowej walidacji:

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)

Nie jestem pewien od razu, jak stworzyć tabelę klasyfikacji. Nie powinno być zbyt trudne z przewidywanych wartości z obiektu modelu i oryginalnych wartości. Czy ktoś ma tu jakieś wskazówki?

Brett
źródło
Drzewa klasyfikacji i regresji? To właściwie druga część zadania. Po zmaksymalizowaniu klasyfikacji muszę klasyfikować na podstawie decyli prawdopodobieństwa.
Brandon Bertelsen
Właściwie ktoś pomógł mi przy tworzeniu tabeli klasyfikacyjnej w tym powiązanym pytaniu: stats.stackexchange.com/questions/4832/... Dzięki za przykład z R, bardzo doceniony, znalazłem podobne instrukcje na stronie Quick-R. Chociaż w tym celu jestem zmuszony zastosować CHAID w SPSS.
Brandon Bertelsen
predictmetoda prognozowania, table(originalClasses,predictedClasses)do konstrukcji tabeli. Próbowałem RF (zwykle ma dokładność jak w przypadku zbyt mocnego CART, ale nie ma overfit) i wynik nie był dużo lepszy niż glm.