【R】基於Logistic迴歸的初始信用評級

前言

    邏輯迴歸的因變量常爲二元分類變量(可爲多元),自變量可以是分類變量也可以是連續變量。他早就成爲各行業廣泛運用的分類模型之一。
    邏輯迴歸除了和其他模型一樣喜歡乾淨數據外,還特別喜歡因變量爲二分類變量的數據(多次重複,賊重要)。也就是當你的因變量是超二分類變量的時候,要盡最大的努力將其歸併爲二分類,如此甚好。

基本原理

    關於邏輯迴歸,360百科:https://baike.so.com/doc/6732765-6947090.html給出了小白化介紹。我不會再贅述,但對其中的關鍵點劃重點還是能做到。

Attention To Key

Key 1 前世今生

    邏輯迴歸長什麼樣?怎樣長成這個樣子的呢?
    這就要從線性迴歸模型說起。對於連續型變量來說,線性迴歸非常好解釋。由於其用普通最小二乘法(OLS Regression)擬合,預測區間從負無窮滾向正無窮,有些預測值在分類變量的實際問題中是不好解釋的。而且,普通最小二乘法的要求比較苛刻,要求變量分佈服從正太分佈。而二分類變量爲二項分佈,是非正太的。
    到此,引入線性概率模型(Linear Probability)就理所當然了。線性概率模型其實也有不足之處。概率取值在[0,1]上,Linear Probability 的預測值會很飄,飄出[0,1]範圍就不是我們喜歡的樣子了。So? 再將模型塑個型,邏輯迴歸模型也就順理成章的被用來解決因變量是分類變量的問題。

在這裏插入圖片描述

Key 2 輪迴審判

    輪迴審判?還不如說是數據分析師對所建模型優劣的靈魂拷問。
    模型優劣?在商業環境中,人們喜歡優益,也就要求模型“快”,“準”,“穩”。這個要求往往是理想主義者的夢中情人,現實點說,很難實現。當模型的評估不通過時,需要反複對數據與模型進行調修,這個過程是極度不舒適的。所以再強調一下:數據清洗一定到位,對模型的應用場景要熟悉,對業務要理解。不然,建立的模型泛化能力會很差,“審判”不通過,便只能將模型打入“輪迴”,直到模型的評估通過爲止。
    通過什麼來“審判”?ROC曲線(https://baike.so.com/doc/5499846-5737282.html)是非常好用的工具了!這裏直接上一盤偷拍:
0)

Logistic迴歸構建初始信用評級-R實戰

    上面介紹了Logistic迴歸,這裏通過R軟件來實現。做好準備,R相對於python來說更容易上手,只是需要添加很多第三方開源包(R的優勢)。

建模準備

    汽車違約貸款數據:

加載數據集及相關第三方包
accepts<-read.csv("F:\\R語言\\data\\accepts.csv",stringsAsFactors = F)
library(prettyR)
library(carData)
library(car)
library(ROCR)

在這裏插入圖片描述

數據探查與處理

    可以看到數據的各類變量類型及取值,以及是否有缺失值等!對於缺失值這裏採取直接刪除行記錄,分類變量做因子化處理。

str(accepts)

在這裏插入圖片描述

#分類變量因子化
accepts$bad_ind<-as.factor(accepts$bad_ind)
accepts$bankruptcy_ind<-as.factor(accepts$bankruptcy_ind)
##建立訓練集與測試集
accepts<-na.omit(accepts)#去掉Na行記錄
attach(accepts)
set.seed(100)
select<-sample(1:nrow(accepts),length(accepts$application_id)*0.7)
train=accepts[select,]
test=accepts[-select,]

模型建立

模型探索—變量篩選
    將意向變量放入多元logistic迴歸函數glm中,檢驗模型的效果:

##多元logistic迴歸
lg<-glm(bad_ind ~fico_score+bankruptcy_ind+tot_derog+age_oldest_tr+rev_util + 
            ltv+ veh_mileage,family=binomial(link='logit'))
summary(lg)

在這裏插入圖片描述
    veh_mileage變量的P值較大,不應融入模型。應該重新對模型進行篩選。線性迴歸中的向前迴歸和先後迴歸以及逐步迴歸篩選的方法在邏輯迴歸中依然有用。這裏用逐步迴歸篩選:

##進行逐步logsitic迴歸
lg_ms<-step(lg,direction = "both")
summary(lg_ms)
lg<-glm(bad_ind ~fico_score+bankruptcy_ind+age_oldest_tr+rev_util+ltv,
        family=binomial(link='logit'))
summary(lg)

在這裏插入圖片描述
    可以看到篩選出來的變量的P值都比較小,對模型是有幫助的優質變量。

多重共線性檢驗
    多重共線性用方差膨脹因子(Vif)來檢查。一般認爲Vif不大於10位非多重共線性變量。可知,逐步迴歸篩選出來的變量間的Vif都小於10.通過多重共線性檢查。如果檢查未通過的話,需要對變量進行處理,比如降維(PCA,因子分析),或者換更模型嶺迴歸(邏輯迴歸的升級版)等。

vif(lg_ms)

在這裏插入圖片描述
得到模型

bad_ind =  5.8387633 -0.0145523* fico_score 
					-0.4963368*bankruptcy_indY+0.0369379 *tot_derog
					-0.0034479*age_oldest_tr+0.0011731*rev_util
					+0.0295138*ltv

模型評估

    不只是邏輯迴歸採用Roc曲線工具進行模型評估,很多分類器模型都如此。Roc涉及的還有混淆矩陣這個概念,這裏不細說。

##預測
train$p<-predict(lg_ms, train,type='response') 
test$p<-predict(lg_ms, test,type='response')

pred_Te <- prediction(test$p, test$bad_ind)
perf_Te <- performance(pred_Te,"tpr","fpr")

pred_Tr <- prediction(train$p, train$bad_ind)
perf_Tr <- performance(pred_Tr,"tpr","fpr")

plot(perf_Te, col='blue',lty=1);
plot(perf_Tr, col='black',lty=2,add=TRUE);
abline(0,1,lty=2,col='red')
lr_m_auc<-round(as.numeric(performance(pred_Tr,'auc')@y.values),3)
lr_m_str<-paste("Mode_Train-AUC:",lr_m_auc,sep="")
legend(0.58,0.15,c(lr_m_str),2:4,cex=0.6,bty="n",fill='blue')
lr_m_auc<-round(as.numeric(performance(pred_Te,'auc')@y.values),3)
lr_m_str<-paste("Mode_Test-AUC:",lr_m_auc,sep="")
legend(0.58,0.1,c(lr_m_str),2:4,cex=0.6,bty="n",fill='black')#fill='black'

在這裏插入圖片描述
    從上圖可以看到,模型在訓練數據和測試數據中表現都還好,AUC值都有70%+,在實際問題的處理中,這樣的一個模型效果算一般。這裏給一個模型評估的Roc閾值表:

ROC閾值 意義
[0.5,0.7) 效果較低,但要用於股票預測,已經比較厲害了
[0.70.85) 效果一般般
[0.85,0.95) 效果比較棒
[0.95,1] 效果牛X,但好像太過於理想了,需要慎重

總結

    數據分析放在古代可能叫賬房或者軍師,這樣說是沒毛病的。我們要對數據熟悉、對業務熟悉、對模型熟悉、對運算工具熟悉。很多東西更多的要求通,而不是精(能精的話,誰不想呢,加油!),更多要求應變而非墨守成規,更多要求懂得移花接木(就像絕代雙驕裏的那門功夫或者像倚天屠龍記裏的乾坤大羅移)。這些好像扯遠了,具體點:

事項 重要程度
業務理解 *****
數據預處理 *****
模型選擇 *****
模型評估與修正 *****

    好吧,這不像是總結 ~~~,列出來的都是重點。在之後的數據分析工作中,多學多實踐,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章