ロジスティック回帰におけるデフォルトのより良い分類


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)

代替テキスト 代替テキスト



債務不履行者の生の割合は、明らかに4分の1ですが、多くの変数もあるようです。それらすべてを試してみましたか、興味のある主要な変数のセットはありますか?
chl

元の変数はファイルの先頭にあります。残りは、x_(x = log、ln、inv、sqrt)で識別される同じ変換です。これらの混合物を試しました。しかし、予測子が0,1である残差プロットをどのように解釈または作成するかについて、私は少し困惑しています。
ブランドンBertelsen

関心のある変数の観点から、私はそれらのすべてのプライマリーと、変換された変数のさまざまな組み合わせ、および相互作用効果を含む混合モデルを試しました。それでも、全体の効率は81.7%を超えません。
ブランドンバーテルセン

回答:


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 

試してみてありがとう、私もしきい値で遊んで、それは分類に少し後押しを提供しました。
ブランドンバーテルセン

1
とはいえ、債務不履行者を予測するのにより良い仕事をしました。
ブランドンバーテルセン

4

私はロジスティック回帰の専門家ではありませんが、不均衡なデータの問題ではありませんか?おそらく、より大きなクラスにうまく対処するために予測をシフトする可能性のある債務不履行者よりもはるかに多くの債務不履行者がいます。いくつかの非債務者を追い出して、何が起こるか見てみてください。


私はそれを試してみましたが、全体的な効率の大幅な増減はありませんでした(効率は、偽陽性、偽陰性がない場合の債務不履行者/非債務者の予測
精度です

1
@Brandon私は他のいくつかのアイデアを試しましたが、役に立たないようです。これは、このセットがこれを実現するのに十分なほど困難であることを示唆しています(おそらく、デフォルトは、いくつかの予測不可能なランダム要因によって駆動されます)。

@mbq、お時間をいただきありがとうございます!大変感謝いたします。
ブランドンバーテルセン

1
個人的に、私はこれが私の教授が彼のコンサルティングの仕事の一つにモデルに支払わなっていることをライブデータをだと思う...しかし、それは全く別の問題だ
ブランドンBertelsen

1
データ分析の問題の解決策は「有効なデータポイントを捨てる」ことではありません。これらの影響を回避するためにバランスの取れたトレーニングデータセットを使用できますが、すべてのデータ(つまり、すべての検証セットの)。
ファビアン

4

ロジスティック回帰、結果変数の非常に歪んだ分布(イベントへの非イベントがはるかに多い、またはその逆)では、カットポイントまたは確率トリガーを調整する必要がありますが、全体的な分類にはあまり影響しません効率的。これは常にほぼ同じままですが、そのようなデータセットの「チャンス」確率により常に非イベントに分類される可能性が高くなるため、現在イベントを分類していません。これは調整する必要があります。実際、このような状況では、以前は偶発的な計算ミスによって膨張していたため、分類の全体的な効率が低下することは珍しくありません。

このように考えると、90%がそれを行わず、10%がそれを行うイベントがある場合、全員を "do n't do"グループに入れると、自動的に90%が正しくなり、試してさえいなくても、純粋なチャンスであり、分布のゆがみによって膨らんでいました。

相互作用の問題はこのゆがみとは無関係であり、理論によって推進されるべきです。ほとんどの場合、単に相互作用を追加するなど、追加の用語を追加して分類を改善しますが、多くの場合、モデルを過剰適合させることで分類を改善します。その後、戻ってこれを解釈できるようにする必要があります。

イリノイ大学アーバナシャンペーン校、マットPデータアナリスト


2

すべての相互作用効果を含めてみてください。その後、L1 / L2正規化ロジスティック回帰を使用して、過剰適合を最小限に抑え、有用な機能を利用できます。私はHastie / Tibshiraniのglmnetパッケージ(http://cran.r-project.org/web/packages/glmnet/index.html)が本当に好きです。


唯一の問題は、SPSS出力でこれを再現できる必要があることです。:(私はまだそれを試してみるつもりです!
ブランドンバーテルセン

試してみましたが、predict.glmnet()が動作しないようです。newxを設定するときに発生する必要がある魔法はありますか?
ブランドンバーテルセン

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)

分類表をどのように作成すればよいかわかりません。モデルオブジェクトの予測値と元の値からそれほど難しくないはずです。誰かここにヒントがありますか?


分類と回帰ツリー?これは実際には割り当ての2番目の部分です。分類を最大化した後、確率の十分位に基づいて分類する必要があります。
ブランドンバーテルセン

実際、関連する質問stats.stackexchange.com/questions/4832 / ...で分類表の作成を手伝ってくれました。Rの例に感謝します。ただし、この目的のために、SPSSでCHAIDを適用する必要があります。
ブランドンバーテルセン

predicttable(originalClasses,predictedClasses)テーブル構築のための予測方法。RFを試してみました(通常、オーバーフィットCARTのように精度がありますが、オーバーフィットはありません)glm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.