Краща класифікація за замовчуванням при логістичній регресії


12

Повне розкриття: це домашнє завдання. Я включив посилання на набір даних ( http://www.bertelsen.ca/R/logistic-regression.sav )

Моя мета - максимально спрогнозувати неплатників кредитів у цьому наборі даних.

Кожна модель, яку я придумав поки що, передбачає> 90% неплатників, але <40% неплатників, що робить ефективність класифікації загальною ~ 80%. Отже, мені цікаво, чи існують ефекти взаємодії між змінними? У рамках логістичної регресії, окрім тестування кожної можливої ​​комбінації, чи є спосіб виявити потенційні ефекти взаємодії? Або ж спосіб підвищення ефективності класифікації неплатників.

Я застряг, будь-які рекомендації будуть корисними у виборі слів, R-коду чи синтаксису SPSS.

Мої первинні змінні викладені в наступній гістограмі та розсіянні (за винятком дихотомічної змінної)

Опис первинних змінних:

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)

Додаткові змінні - це лише перетворення вищезазначеного. Я також спробував перетворити кілька безперервних змінних у категоричні змінні та реалізувати їх у моделі, не пощастило.

Якщо ви хочете швидко поставити його в R, ось це:

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

alt текст alt текст



Невитратна частка неплатників, мабуть, 1 випадок із 4, але, здається, у вас також багато змінних. Ви випробували їх усі, чи є у вас набір первинних змінних, що цікавлять вас?
chl

Оригінальні змінні знаходяться внизу файлу. Решта - це такі ж перетворення, що ідентифікуються x_ (де x = log, ln, inv, sqrt). Я спробував їх суміш. Але я трохи заплутаний, як інтерпретувати або створювати залишкові сюжети, де прогноктор 0,1
Брендон Бертельсен

Що стосується змінних, що цікавлять, я спробував усі праймери і ряд різних комбінацій перетворених змінних, а також змішані моделі, що включають ефекти взаємодії. І все-таки нічого вище 81,7% загальної ефективності.
Брендон Бертелсен

Відповіді:


8

У неврівноважених наборах даних, таких як цей, зазвичай можна покращити ефективність класифікації, відступивши від використання встановленої ймовірності .5 як вашої межі для класифікації випадків на неплатників та неплатників. Наприклад, я отримую правильні коефіцієнти класифікації .88 та .58 із точкою межі .4 для glm з усіма взаємодіями другого порядку. (Що, ймовірно, призводить до перевиконання і, здається, має деякі проблеми з рангом, але це вже інша історія.)

Код:

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)

частковий вихід:

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 

Дякую за спробу, я грав і з порогом, і це мало поштовх для класифікації.
Брендон Бертелсен

1
Хоча це зробило кращу роботу передбачення неплатників.
Брендон Бертелсен

4

Я не фахівець з логістичної регресії, але чи це не лише проблема незбалансованих даних? Напевно, у вас набагато більше неплатників, ніж у неплатників, що може змістити прогноз, щоб краще працювати з більшим класом. Спробуйте вигнати деяких неплатників і подивіться, що станеться.


Я спробував це, не представив суттєвих підвищення чи зниження загальної ефективності (ефективність настільки добре, наскільки вона спрогнозувала неплатників / неплатників за відсутності помилково позитивних, помилкових негативів)
Брендон Бертелсен

1
@Brandon Я спробував кілька інших ідей, і, схоже, це не допоможе. Це говорить про те, що цей набір досить важкий, щоб це сталося (можливо, за замовчуванням просто керуються деякими непередбачуваними випадковими факторами).

@mbq, дякую, що знайшли час! Цінується.
Брендон Бертелсен

1
Особисто я думаю, що це живі дані про те, що мій проф. Отримує зарплату для моделювання в одній із своїх консультаційних робіт ... але це зовсім інше питання
Брендон Бертелсен

1
вирішення проблеми в аналізі даних ніколи не повинно бути "викинути дійсні точки даних" - ви можете спробувати використовувати збалансовані набори навчальних даних, щоб уникнути цих ефектів, але все ж слід оцінити прогнози щодо всіх даних (тобто всіх набору перевірки).
фабі

4

У логістичній регресії, сильно перекошених розподілах змінних результатів (де набагато більше подій на події чи навпаки) точку відключення або тригер вірогідності потрібно коригувати, але це не матиме великого впливу на загальну класифікацію власність. Це завжди залишатиметься приблизно однаковим, але ви зараз не класифікуєте події, оскільки "ймовірність" імовірності в такому наборі даних завжди зробить вам більше шансів класифікуватись на не події. Це потрібно скоригувати. Насправді, у такій ситуації нечасто спостерігається зниження загальної ефективності класифікації, оскільки вона раніше була завищена прорахунком через випадковість.

Подумайте про це так, якщо у вас є подія, де 90% не роблять цього, а 10% роблять це, то якщо ви ставите всіх у групу "не робіть цього", ви автоматично отримуєте право на 90%, і це навіть не намагаючись, просто чистий шанс, завищений скутістю його розподілу.

Питання взаємодій не пов'язане з цим перекосом і повинно керуватися теорією. Ви, швидше за все, завжди вдосконалите класифікацію, додавши додаткові терміни, включаючи просто додавання взаємодій, але це робите, часто переставляючи модель. Тоді вам доведеться повернутися назад і мати можливість це інтерпретувати.

Метт П Аналітик даних, Університет Іллінойсу Урбана Шампейн


2

Ви можете просто спробувати включити всі ефекти взаємодії. Потім ви можете використовувати логістичну регресію, регульовану L1 / L2, щоб мінімізувати перевитрати та скористатися будь-якими корисними функціями. Мені дуже подобається пакет glmnet Hastie / Tibshirani (http://cran.r-project.org/web/packages/glmnet/index.html).


Єдина проблема полягає в тому, що я маю змогу відтворити це за допомогою SPSS-висновку. :( Я все ще збираюся спробувати це!
Брендон Бертелсен

Спробувавши це, здається, не може змусити predict.glmnet () працювати. Чи є якась магія, яка повинна відбуватися, коли ви встановлюєте newx?
Брендон Бертелсен

2

Я знаю, що ваше питання стосується логістичної регресії, а оскільки це домашнє завдання, тому ваш підхід може бути обмеженим. Однак, якщо ваш інтерес викликає взаємодія та точність класифікації, може бути цікавим використовувати щось подібне на CART для моделювання цього.

Ось декілька код R для створення базового дерева. Я встановив тут rpart loose на загадковому кадрі даних. Мабуть, не найкращий підхід без попередніх знань та методу перехресної перевірки:

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)

Я не впевнений, як створити таблицю класифікації. Це не повинно бути надто важким для прогнозованих значень об'єкта моделі та вихідних значень. У когось тут є якісь поради?


Класифікація та регресія дерев? Це насправді друга частина завдання. Після того, як я максимізував класифікацію, я маю класифікувати на основі децилів ймовірності.
Брендон Бертелсен

Насправді, хтось допоміг мені створити таблицю класифікації у цьому пов'язаному питанні: stats.stackexchange.com/questions/4832/… Спасибі за приклад з R, дуже вдячний, я знайшов подібну інструкцію на веб-сайті швидкого r. Хоча для цього я змушений застосовувати CHAID в SPSS.
Брендон Бертелсен

predictметод прогнозування, table(originalClasses,predictedClasses)для побудови столу. Я спробував RF (як правило, він має точність, як у навантаженій КАРТКІ, але без накладання), і результат виявився не набагато кращим, ніж glm.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.