本期在R語言
中使用邏輯回歸算法
建立模型預(yù)測個人是否會出現(xiàn)違約行為霎槐,協(xié)助銀行決策是否給予貸款,以達(dá)到降低銀行貸款壞賬的風(fēng)險
數(shù)據(jù)基本情況
本文中所使用的數(shù)據(jù)來源于kaggle
,在網(wǎng)頁上有該數(shù)據(jù)的背景及各個維度的詳細(xì)介紹狰贯,在進(jìn)行建模之前必須詳細(xì)的閱讀劫瞳,盡量獲取更多關(guān)于數(shù)據(jù)的信息呕童。本文數(shù)據(jù)獲取:https://www.kaggle.com/c/GiveMeSomeCredit
下載數(shù)據(jù)后意蛀,我們將數(shù)據(jù)導(dǎo)入耸别,看看數(shù)據(jù)的基本情況
library(data.table)
library(dplyr)
library(VIM)
library(DMwR)
library(caret)
library(pROC)
cs_training <- data.table(read.csv("/R/python/logistic/give me some credit/cs-training.csv"))
該數(shù)據(jù)集一共150000條數(shù)據(jù),包含12列县钥,所有的變量都是數(shù)值型的秀姐,明顯的MonthlyIncome
和NumberOfDependents
存在na值.在后面數(shù)據(jù)處理時,需要重點關(guān)注na值的處理若贮。
接下來在看各變量數(shù)據(jù)大致的分布情況省有,變量X
是行序號,對建模無意義谴麦,需要刪除蠢沿;age
是年齡,其最小值是0匾效,這是明顯的異常值舷蟀;除age
和SeriousDlqin2yrs
外,其他各變量均存在距離四分之三分位數(shù)很遠(yuǎn)的值面哼,由于對各變量的實際情況了解不足野宜,無法確定是否為異常值,暫不處理魔策;另外匈子,存在na值的變量僅有MonthlyIncome
和NumberOfDependents
,在進(jìn)行na值處理時只需關(guān)注這兩個變量代乃;SeriousDlqin2yrs
為目標(biāo)變量,0 仿粹、1 各為139974條 搁吓、10026條,占比分別為93.32%吭历、6.68%堕仔。
數(shù)據(jù)處理
在進(jìn)行數(shù)據(jù)處理前,我們先將各列的列名重新命名,然后逐一進(jìn)行處理晌区。
names(cs_training) <- c("x","x0","x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
#刪除X1(x),其為行號
cs_training[,x := NULL]
#將目標(biāo)變量轉(zhuǎn)為因子
cs_training[,x0 := as.factor(x0)]
#刪除age(x2) 為0 的行摩骨。僅有一行數(shù)據(jù)存在age = 0 ,所以直接刪除
cs_training <- cs_training[x2 != 0,]
在進(jìn)行缺失值處理前通贞,再次詳細(xì)查看一下缺失值的基本情況:NumberOfDependents
存在3924個na值,Monthly income
有29731個空值恼五,另外昌罩,我們可以看見NumberOfDependents
為na的行,Monthly income
的值也均為na.
#缺失值
aggr(cs_training,plot = FALSE)
# 結(jié)果:Monthly income(x5)29731;NumberOfDependents(x10) 3924
aggr(cs_training,prop=TRUE,numbers=TRUE)
#各變量的占比均比較低
marginplot(cs_training[,c("x5","x10")],pch=c(20),col=c("darkgray","red","blue"))
利用DMwR
包中的knnImputation
函數(shù)進(jìn)行K近鄰填補(bǔ)灾馒。
cs_training_final <- knnImputation(cs_training,k = 10,meth = "weighAvg")
處理完缺失值后茎用,我們來看一下各個變量的相關(guān)性,如存在相關(guān)系數(shù)過大的變量睬罗,則要進(jìn)行相應(yīng)的處理轨功。明顯的可以看見x3(NumberOfTime30-59DaysPastDueNotWorse)
、x7(NumberOfTimes90DaysLate)
容达、x9(NumberOfTime60-89DaysPastDueNotWorse)
的兩兩相關(guān)系數(shù)超過來0.9古涧,存在明顯的相關(guān)性,此時應(yīng)該是考慮刪除其中的某兩個變量花盐,但是我們考慮到這三個變量的分布情況羡滑,它們的最大值均是98,且與四分之三分位數(shù)距離很遠(yuǎn)卒暂,可能是這些過大的值導(dǎo)致相關(guān)性比較大啄栓,我們嘗試刪除這些異常值后看看情況。刪除處理后也祠,再次計算相關(guān)系數(shù)昙楚,此時不存在明顯的相關(guān)性的變量
#識別相關(guān)的特征變量
cor_coefficient <- cor(cs_training_final[,-1])
cor_index <- findCorrelation(cor_coefficient,cutoff = 0.7)
#刪除x3(NumberOfTime30-59DaysPastDueNotWorse)、x7(NumberOfTimes90DaysLate)`诈嘿、x9(NumberOfTime60-89DaysPastDueNotWorse)的異常值
#可以發(fā)現(xiàn)堪旧,刪除x7小于90的行后,其他兩個變量的相應(yīng)的也不存在>90的行了
cs_training_final <- filter(cs_training_final,x7 < 90)
#再次計算相關(guān)系數(shù)奖亚。無相關(guān)變量
cor_coefficient <- cor(cs_training_final[,-1])
cor_index <- findCorrelation(cor_coefficient,cutoff = 0.7)
刪除前
刪除后
模型訓(xùn)練與評估
#拆分訓(xùn)練集和測試集(訓(xùn)練集占比75%淳梦,測試集的占比25%)
cs_training_final_rand <- cs_training_final[order(runif(149730)),]
train_data <- cs_training_final_rand[1:112297,]
test_data <- cs_training_final_rand[112298:149730,]
#處理不均衡問題(目標(biāo)變量中分類為1的占比僅僅為6.68%,存在數(shù)據(jù)不均衡的問題)
train_data_smote<- SMOTE(x0~.,train_data,perc.over = 800,perc.under = 100)
#gml
glm_credit <- glm(x0~.,family = binomial(link='logit'),data = train_data_smote)
pre <- predict(glm_credit,test_data,type='response')
#模型評估昔字,畫出ROC曲線
modelroc <- roc(test_data$x0,pre)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2), grid.col=c("green", "red"), max.auc.polygon=TRUE, auc.polygon.col="skyblue", print.thres=TRUE)
在ROC曲線圖里爆袍,計算了AUC值,其為0.81作郭,模型最終效果還算不錯陨囊。
以上是在R語言
中使用邏輯回歸算法
的全過程。如有做的不好或這不對的地方還請大家指正夹攒!