로지스틱 회귀 분석에서 더 나은 불이행 분류


12

전체 공개 : 이것은 숙제입니다. 데이터 세트에 대한 링크를 포함 시켰습니다 ( http://www.bertelsen.ca/R/logistic-regression.sav )

저의 목표는이 데이터 세트에서 대출 불이행자 예측을 최대화하는 것입니다.

지금까지 생각해 낸 모든 모델은 기본값이 아닌 사용자의> 90 %를 예측하지만 분류기의 전체 효율을 ~ 80 %로 만드는 기본값의 <40 %를 예측합니다. 변수 사이에 상호 작용 효과가 있는지 궁금합니다. 로지스틱 회귀 분석에서 가능한 각 조합을 테스트하는 것 외에 잠재적 인 상호 작용 효과를 식별 할 수있는 방법이 있습니까? 또는 기본 설정 분류의 효율성을 높이는 방법입니다.

나는 모든 추천이 당신이 선택한 단어, 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)

대체 텍스트 대체 텍스트



기본 설정의 기본 비율은 4 개 중 1 건이지만 분명히 많은 변수가있는 것 같습니다. 당신은 그들 모두를 시도 했습니까, 관심있는 주요 변수 세트가 있습니까?
chl

원래 변수는 파일의 앞에 있습니다. 나머지는 x_ (x = log, ln, inv, sqrt)로 식별 된 것과 동일한 변형입니다. 나는 이것들을 섞어 보았습니다. 하지만 약간의 해석이나 예측은 0.1입니다 잔차 그림 생성하는 방법에 관한 느냐고 묻는 해요
브랜든 Bertelsen을

관심있는 변수의 관점에서, 나는 그들 모두 1 차 및 변환 된 변수의 다양한 조합뿐만 아니라 상호 작용 효과를 포함하는 혼합 모델을 시도했습니다. 여전히 전체 효율은 81.7 %를 넘지 않습니다.
Brandon Bertelsen

답변:


8

이와 같은 불균형 데이터 집합에서는 일반적으로 사례를 기본 및 비 기본으로 분류하기위한 컷 포인트로 적합 확률 .5를 사용하지 않고 분류 성능을 향상시킬 수 있습니다. 예를 들어, 모든 2 차 상호 작용이있는 glm에 대해 컷 포인트가 .4 인 올바른 분류 율은 .88 및 .58입니다. (어쩌면 초과 피팅으로 이어지고 순위 문제가있는 것처럼 보이지만 다른 이야기입니다.)

암호:

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 

시도해 주셔서 감사합니다, 나는 임계 값을 가지고 놀았으며 분류에 약간의 향상을주었습니다.
Brandon Bertelsen

1
그러나 기본 설정을 더 잘 예측했습니다.
Brandon Bertelsen

4

나는 로지스틱 회귀 전문가가 아니지만 불균형 데이터의 문제가 아닌가? 아마도 더 큰 클래스를 더 잘 처리하기 위해 예측을 이동시킬 수있는 기본값보다 기본값이 아닌 기본값이 훨씬 많습니다. 기본이 아닌 사람들을 쫓아 내고 어떻게되는지보십시오.


나는 그것을 시도했고, 전반적인 효율성의 실질적인 증가 또는 감소를 나타내지 않았다 (효율은 거짓 양성, 거짓 부정이 없을 때 디폴트 / 비 디폴트를 얼마나 잘 예측했는지에 따라
다르다

1
@Brandon 나는 다른 아이디어를 거의 시도하지 않았지만 도움이되지 않는 것 같습니다. 이것은이 세트가 이것을 가능하게하기에 충분히 어렵다는 것을 암시합니다 (아마도 기본값은 예측할 수없는 임의의 요인에 의해 결정됩니다).

@mbq, 시간을 내 주셔서 감사합니다! 매우 감사.
Brandon Bertelsen

1
개인적으로, 이것은 내 교수가 컨설팅 작업 중 하나에서 모델로 지불하는 라이브 데이터라고 생각합니다. 그러나 그것은 또 다른 문제입니다
Brandon Bertelsen

1
데이터 분석의 문제에 대한 해결책은 절대로 "유효한 데이터 포인트를 버리지 않아야"합니다. 이러한 영향을 피하기 위해 균형 훈련 데이터 세트를 사용할 수는 있지만 모든 데이터에 대한 예측을 평가해야합니다 (예 : 모든 데이터) 유효성 검사 세트).
fabians

4

로지스틱 회귀 분석에서 결과 변수의 비대칭 분포 (사건에 대한 비 이벤트가 많거나 그 반대 인 경우), 컷 포인트 또는 확률 트리거를 조정해야하지만 전체 분류에 큰 영향을 미치지는 않습니다. 효율성. 이것은 항상 대략 동일하게 유지되지만 이러한 데이터 세트의 "기회"확률은 항상 비 이벤트로 분류 할 가능성이 높기 때문에 현재 이벤트를 분류하지 않습니다. 조정이 필요합니다. 실제로, 이러한 상황에서는 이전에 우연으로 인한 미스 캘 계산으로 인해 분류의 전반적인 효율성이 저하되는 것을 보는 것은 드문 일이 아닙니다.

이런 식으로 생각하십시오. 90 %가하지 않는 이벤트와 10 %가하는 이벤트가있는 경우, 모든 사람을 "하지 마십시오"그룹에 넣으면 자동으로 90 %가됩니다. 시도조차하지 않고 순수한 확률로 분포의 왜곡으로 팽창했습니다.

상호 작용 문제는이 왜곡과 관련이 없으며 이론에 의해 주도되어야합니다. 단순히 교호 작용 추가를 포함하여 추가 항을 추가하여 분류를 개선 할 가능성이 높지만 종종 모형을 과적 합하여 수행 할 수 있습니다. 그런 다음 돌아가서 이것을 해석 할 수 있어야합니다.

Matt P 데이터 분석가, 일리노이 대학교 어 바나 샴페인


2

모든 상호 작용 효과를 포함시켜보십시오. 그런 다음 L1 / L2 정규화 된 로지스틱 회귀를 사용하여 과적 합을 최소화하고 유용한 기능을 활용할 수 있습니다. 나는 Hastie / Tibshirani의 glmnet 패키지 (http://cran.r-project.org/web/packages/glmnet/index.html)를 정말 좋아합니다.


유일한 문제는 SPSS 출력으로 이것을 재현 할 수 있어야한다는 것입니다. :( 그래도 시도해 볼 것입니다!
Brandon Bertelsen

그것을 시도했지만 predict.glmnet ()이 작동하지 않는 것 같습니다. newx를 설정할 때 일어나야 할 마술이 있습니까?
Brandon Bertelsen 5

2

귀하의 질문은 로지스틱 회귀에 대한 것이며 숙제 할당이므로 접근 방식이 제한 될 수 있음을 알고 있습니다. 그러나 상호 작용 및 분류 정확도에 관심이있는 경우 CART와 같은 것을 사용하여 모델링하는 것이 흥미로울 수 있습니다.

기본 트리를 생성하는 몇 가지 R 코드가 있습니다. enire 데이터 프레임에서 rpart를 느슨하게 설정했습니다. 아마도 사전 지식과 교차 검증 방법이 없으면 최선의 접근 방식이 아닐 수도 있습니다.

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)

분류 표를 생성하는 방법을 잘 모르겠습니다. 모델 객체의 원래 값과 원래 값에서 너무 어렵지 않아야합니다. 여기에 팁이 있습니까?


분류 및 회귀 트리? 그것은 실제로 과제의 두 번째 부분입니다. 분류를 최대화 한 후 확률 십진법을 기준으로 분류해야합니다.
Brandon Bertelsen

사실, 사람이 관련 문제의 분류 표를 생산하는 나에게 도움이 : stats.stackexchange.com/questions/4832/... R와 예를 주셔서 감사합니다, 많은 감사, 나는 빠른-R 웹 사이트에서 유사한 명령을 발견했다. 그러나이 목적을 위해 SPSS에 CHAID를 적용해야합니다.
Brandon Bertelsen

predicttable(originalClasses,predictedClasses)테이블 구성을 위한 예측 방법 . 나는 RF를 시도했다 (보통 과적 응 CART에서와 같이 정확도는 있지만 과적 합은 없었 음) glm.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.