本期在R语言
中使用逻辑回归算法
建立模型预测个人是否会出现违约行为,协助银行决策是否给予贷款,以达到降低银行贷款坏账的风险
数据基本情况
本文中所使用的数据来源于kaggle
,在网页上有该数据的背景及各个维度的详细介绍,在进行建模之前必须详细的阅读,尽量获取更多关于数据的信息。本文数据获取:https://www.kaggle.com/c/GiveMeSomeCredit
下载数据后,我们将数据导入,看看数据的基本情况
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"))
该数据集一共150000条数据,包含12列,所有的变量都是数值型的,明显的MonthlyIncome
和NumberOfDependents
存在na值.在后面数据处理时,需要重点关注na值的处理。
接下来在看各变量数据大致的分布情况,变量X
是行序号,对建模无意义,需要删除;age
是年龄,其最小值是0,这是明显的异常值;除age
和SeriousDlqin2yrs
外,其他各变量均存在距离四分之三分位数很远的值,由于对各变量的实际情况了解不足,无法确定是否为异常值,暂不处理;另外,存在na值的变量仅有MonthlyIncome
和NumberOfDependents
,在进行na值处理时只需关注这两个变量;SeriousDlqin2yrs
为目标变量,0 、1 各为139974条 、10026条,占比分别为93.32%、6.68%。
数据处理
在进行数据处理前,我们先将各列的列名重新命名,然后逐一进行处理。
names(cs_training) <- c("x","x0","x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
#删除X1(x),其为行号
cs_training[,x := NULL]
#将目标变量转为因子
cs_training[,x0 := as.factor(x0)]
#删除age(x2) 为0 的行。仅有一行数据存在age = 0 ,所以直接删除
cs_training <- cs_training[x2 != 0,]
在进行缺失值处理前,再次详细查看一下缺失值的基本情况:NumberOfDependents
存在3924个na值,Monthly income
有29731个空值,另外,我们可以看见NumberOfDependents
为na的行,Monthly income
的值也均为na.
#缺失值
aggr(cs_training,plot = FALSE)
# 结果: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
函数进行K近邻填补。
cs_training_final <- knnImputation(cs_training,k = 10,meth = "weighAvg")
处理完缺失值后,我们来看一下各个变量的相关性,如存在相关系数过大的变量,则要进行相应的处理。明显的可以看见x3(NumberOfTime30-59DaysPastDueNotWorse)
、x7(NumberOfTimes90DaysLate)
、x9(NumberOfTime60-89DaysPastDueNotWorse)
的两两相关系数超过来0.9,存在明显的相关性,此时应该是考虑删除其中的某两个变量,但是我们考虑到这三个变量的分布情况,它们的最大值均是98,且与四分之三分位数距离很远,可能是这些过大的值导致相关性比较大,我们尝试删除这些异常值后看看情况。删除处理后,再次计算相关系数,此时不存在明显的相关性的变量
#识别相关的特征变量
cor_coefficient <- cor(cs_training_final[,-1])
cor_index <- findCorrelation(cor_coefficient,cutoff = 0.7)
#删除x3(NumberOfTime30-59DaysPastDueNotWorse)、x7(NumberOfTimes90DaysLate)`、x9(NumberOfTime60-89DaysPastDueNotWorse)的异常值
#可以发现,删除x7小于90的行后,其他两个变量的相应的也不存在>90的行了
cs_training_final <- filter(cs_training_final,x7 < 90)
#再次计算相关系数。无相关变量
cor_coefficient <- cor(cs_training_final[,-1])
cor_index <- findCorrelation(cor_coefficient,cutoff = 0.7)
删除前
删除后
模型训练与评估
#拆分训练集和测试集(训练集占比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,]
#处理不均衡问题(目标变量中分类为1的占比仅仅为6.68%,存在数据不均衡的问题)
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语言
中使用逻辑回归算法
的全过程。如有做的不好或这不对的地方还请大家指正!