美文网首页
R语言:利用逻辑回归算法预测个人是否会出现违约行为

R语言:利用逻辑回归算法预测个人是否会出现违约行为

作者: 数据老黄 | 来源:发表于2018-07-15 15:19 被阅读0次

    本期在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列,所有的变量都是数值型的,明显的MonthlyIncomeNumberOfDependents存在na值.在后面数据处理时,需要重点关注na值的处理。

    接下来在看各变量数据大致的分布情况,变量X是行序号,对建模无意义,需要删除;age 是年龄,其最小值是0,这是明显的异常值;除ageSeriousDlqin2yrs外,其他各变量均存在距离四分之三分位数很远的值,由于对各变量的实际情况了解不足,无法确定是否为异常值,暂不处理;另外,存在na值的变量仅有MonthlyIncomeNumberOfDependents,在进行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语言中使用逻辑回归算法的全过程。如有做的不好或这不对的地方还请大家指正!

    相关文章

      网友评论

          本文标题:R语言:利用逻辑回归算法预测个人是否会出现违约行为

          本文链接:https://www.haomeiwen.com/subject/tnyppftx.html