目录

  1. 项目简介及目标
  2. 数据概览
    2.1数据来源
    2.2数据结构图
    2.3数据变量表
    2.4离散型数据分布
    2.5连续型数据分布
  3. 数据处理及特征选择
    3.1目标值量化
    3.2删除字段
    3.3缺失值处理
    3.4同值化处理
    3.5数据格式转换
    3.6标签编码
    3.7异常值处理
    3.8特征选取
  4. 模型建立
    4.1数据划分
    4.2样本不平衡处理
    4.3参数最优
    4.4建立模型
  5. 模型评估
    5.1ROC曲线AUC值
    5.2K-S曲线
  6. 模型对比
  7. 分析总结

1. 项目简介及目标

简介: 贷款申请人向Lending Club平台申请贷款时,Lending Club平台通过线上或线下让客户填写贷款申请表,收集客户的基本信息,同时会借助第三方平台如征信机构或FICO等机构的信息。通过这些信息属性来做线性回归 ,生成预测模型,Lending Club平台可以通过预测判断贷款申请是否会违约,从而决定是否向申请人发放贷款。
目标:通过预测判断贷款申请是否会违约,从而决定是否向申请人发放贷款。

2. 数据概览

2.1数据来源

数据集是Lending Club平台发生借贷的业务数据(2019年第二季),共有144 个变量,42537条记录。

2.2数据结构图

通过查阅资料,将144个变量进行翻译及分类,主要包括以下几个类型的信息

2.3部分变量表

由于变量太多,仅展示部分变量

2.4离散型数据分布(这里展示的只是部分变量)
  • 目标变量loan_status

从图中可以看出,相对正常样本,违约样本太少,后续应进行样本不平衡处理以提高模型的预测效果

  • term:贷款时长,值以月为单位,可以是36或60
  • grade:LC指定贷款等级,LC平台依据多样化的需求,将借贷人分成A-G七个等级,从A到G,贷款的风险越来越高,利率也越来越高。

从图中,我们也可以看出这个趋势。无论是投资人还是借贷者,大多数都是选择较低风险较低收益的类型。

  • emp_length:工作年限(以年为单位)。可能的值在0到10之间,其中0表示小于一年,10表示10年或更长时间。

工作时长低于1年与10以上的借款人最多,两者的违约比例相差不大。因此,并非工作年限长信用值越高,越靠谱。除此两类,在2-9年,随着工作年限越长,贷款需求越少,有可能是因为收入越来越稳定。

  • purpose: 借款人为贷款请求提供的类别。

    债务整合(举债还债)这类最多。另外3项是:住房改善、汽车、大宗采购,也就是基本生活需求。相对来说,借钱做生意的,违约率较高。
2.5连续型数据分布
  • dti: 按借款人每月总偿债额与总债务

    分期付款金额基本呈的正态分布,说明贷款额度集中在中小额度。
    *annual_inc:年度收入

    年收入集中在0-10万美元以内,但是也有极高收入(最高达到600万)的借款人。

3. 数据处理

3.1目标值量化

对于目标变量Loan_status有四个分类,分别是Fully Paid、Charged Off、Does not meet the credit policy. Status:Charged Off和Does not meet the credit policy. Status:Fully Paid,后两者是指不符合信用政策的坏账或者完全支付的状态,我们认为是特殊情况的信贷,因此不予考虑,当缺失值处理,同时用1代表charge off(违约)0代表fully paid(完全支付)

3.2删除字段

由于项目目的是提前预测贷款申请入是否违约,所以需要剔除属于贷款发放后的数据信息。
诸如个人ID、地址、URL地址以及日期等信息,主观判断其对是否违约影响甚微。
当字段缺失值过多时,将会不利于预测模型的拟合结果。故将缺失值超过70%的字段剔除。

#删除贷后信息
drop_lable = ['collection_recovery_fee','initial_list_status','installment','last_pymnt_amnt','last_pymnt_d','loan_amnt','next_pymnt_d','out_prncp','out_prncp_inv','policy_code','pymnt_plan','recoveries','total_pymnt','total_pymnt_inv','total_rec_int','total_rec_late_fee','total_rec_prncp','sec_app_earliest_cr_line','sec_app_mort_acc','settlement_date','settlement_amount','settlement_percentage','settlement_term','sub_grade','emp_title','zip_code','title','desc','last_credit_pull_d','addr_state','issue_d','earliest_cr_line']
Loan_data.drop(columns = drop_lable,axis = 1,inplace = True)
# 删除缺失值超过70%的列
Loan_data.dropna(thresh = len(Loan_data)*0.7,axis = 1,inplace = True)
3.3缺失值处理

对于其他含有缺失值的字段,本次项目采用的方法是删除所有含有空值的记录。主要原因是所使用的数据集有充足的记录,删除少许记录对于模型的建立没有太大的影响,而如果采用平均值、众数或者中位数来填充空值,会使得样本的真实性下降,使建模效果变差。
另外,在删除的记录中,违约记录与正常记录为364:1460,违约记录的占比较低,因此认为对建模效果不会产生太大的影响。

# 删除存在缺失值的行
Loan_data.dropna(axis = 0,inplace = True)
3.4同值化处理

如果一个变量大部分的观测都是相同的特征,那么认为此类特征变量无法显著区分目标变量,可以考虑将其删除。根据排序结果,保留前三个的变量。

3.5数据格式转换

由于部分所选的数据特征存在百分号或是其他字符,需要对其进行数据格式的转换,为后续分析做准备。

#特征格式变换
Loan_data['term'] = Loan_data['term'].str.replace(' months','').astype('float')
Loan_data['int_rate'] = Loan_data['int_rate'].str.replace('%','').astype('float')
Loan_data['revol_util'] = Loan_data['revol_util'].str.replace('%','').astype('float')
3.6标签编码

因项目所采用随机森林与逻辑回归模型不支持字符型的数据变量,故对此类变量进行编码。为了使所研究的数据清晰简洁,本文采用类别标签方法对下图所示数据变量进行标签化编码。

# 标签编码
le_dict = {'emp_length':{'< 1 year':0,'1 year':1,'2 years':2,'3 years':3,'4 years':4,'5 years':5,'6 years':6,'7 years':7,'8 years':8,'9 years':9,'10+ years':10},'grade':{'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7},'home_ownership':{'MORTGAGE':1,'RENT':2,'OTHER':3,'OWN':4,'NONE':5},'verification_status':{'Not Verified':1,'Source Verified':2,'Verified':3},'purpose':{'car':1,'credit_card':2,'small_business':3,'other':4,'wedding':5,'debt_consolidation':6,'home_improvement':7,'major_purchase':8,'moving':9,'vacation':10,'house':11,'medical':12,'renewable_energy':13,'educational':14,},'debt_settlement_flag':{'N':1,'Y':2}
}
Loan_data = Loan_data.replace(le_dict)
3.7 异常值处理

格式转换之后发现revol_util字段有些许值大于100,按理说这个变量的值不应该超过100,所以将超过100的异常记录删除。

Loan_data.drop(Loan_data[Loan_data['revol_util'] > 100].index,inplace = True)
3.8 特征提取

本项目将利用多重共线性+VIF值进行变量筛选,利用随机森林进行特征选择
通过相关系数矩阵得到高于0.8的三对变量如下图:

随机森林重要性排序结果如下,剔除重要系数小于0.01的变量:


具体步骤: 首先剔除相关系数大且VIF值大的变量,计算剔除变量后的VIF,再重复上面原则,步骤简单但是一步一步图太多,就直接说结果吧。经过3.7步前的操作,剩余21个变量,经过多重共线性筛选剩余17个变量,经过随机森林重要性筛选得到16个变量(不包括目标变量)。

4. 模型建立

4.1数据划分

本次项目我们采用交叉验证法划分数据集,将数据划分为训练集、验证集和测试集,让模型在训练集上进行学习,在验证机上进行参数调优,最后使用测试集数据评估模型的性能。
将样本数据以7:3的比例进行训练集和测试集的划分。

4.2样本不平衡处理

上面我们提到过正负例样本不平衡,我们对训练集进行上采样,得到训练模型,并在测试集上进行检验。本次上采样采用SMOTE算法

# SMOTE算法平衡数据,种子数=2
sm=SMOTE(random_state=2)
x,y=sm.fit_sample(x_train,y_train)
print("通过SMOTE方法后平衡的正负样本")
n_sample=y.shape[0]
n_pos_sample=y[y==1].shape[0]
n_neg_sample=y[y==0].shape[0]
# print("样本个数:{};正样本{:.2%};负样本{:.2%}".format(n_sample,n_pos_sample/n_sample,n_neg_sample/n_sample))
4.3参数最优—网格搜索法

模型调优我们采用网格搜索调优参数,通过构建参数候选集合,网格搜索会穷举各种参数组合,根据设定评分机制找到最好的一组参数。本次我们得到最优超参数C为0.1,惩罚项为l1正则。

# 网格搜索,并使用5折交叉验证获取最优参数值(选择标准“auc”最大),logistic模型随机数种子=2
penaltys = ["l1","l2"]
Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
tuned_parameters = dict(penalty = penaltys, C = Cs)
lr_penalty= LogisticRegression(random_state=2)
grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='roc_auc')
grid.fit(x_train,y_train) #运行
print(u'最优超参数为:',grid.best_params_)
grid.best_score_  #最好的分数
4.4模型建立

由于本次项目目的是为了预测贷款申请人是否会违约,属于分类问题且为二分类预测,因此采用逻辑回归。我们之前设违约为1,全额付清为0,利用违约的概率与不违约的概率进行比值然后取对数,构造该变量与各变量间的模型。

model = LogisticRegression(C=0.1,penalty='l1',random_state=2)
model.fit(x_train, y_train)

5. 模型评估

  • 精确率、召回率及F1值
样本 精确率 召回率 F1值
训练集 0.597 0.500 0.464
测试集 0.788 0.501 0.466
  • ROC曲线及AUC值
样本 AUC值
训练集 0.685
测试集 0.692
  • K-S曲线
    k-s曲线能够直观地看出是否违约事件的区分程度,ks值越大,表示模型能够将正、负客户区分开的程度越大。通常来讲,ks值大于0.2表示模型有较好的预测准确性,逻辑回归的ks值为0.27,说明该模型是可行的。

6. 模型对比

对于分类问题,决策树也有较好的预测效果,因此我们将处理好的数据用决策树算法进行预测,结果发现利用基尼系数划分节点时,深度为4的树训练出来的模型,在测试集上的精确率为0.43,AUC值达到0.671,ks值为0.26,说明模型能够区分正负客户区,但是从auc值和ks值看,决策树的预测效果并没有逻辑回归好,所以逻辑回归模型的预测效果还是不错的。


7. 分析总结

  • 在特征选择方面,我们最终留下16个特征,包括贷前贷款申请信息6个,分别是grade、term、dti、funded_amnt、purpose、verification_status,个人信息3个,分别是annual_inc、emp_length、home_ownership,借款账户信息2个,分别是open_acc、total_acc,循环账户信息2个,分别是revol_bal、revol_util,行为信息、历史违约及社会信用各1个,分别是inq_last_6mths、delinq_2yrs、pub_rec。贷前贷款申请信息和个人信息占比超过50%,这说明贷款申请人填写申请表是很有必要的,另外通过随机森林算法我们可以得到影响违约最重要的前5个变量是LC指定的贷款等级、年度收入、借款人相对于所有可用循环信贷的信贷金额、贷款时长、借款人每月总偿债额与总债额之比,其中年度收入与目标变量是正相关的,也就是说,借款人的年收入越高,违约的优势比越低,而其他四个变量的值越大或等级越高,违约的优势比也越大,因此要着重注意借款人的这些信息.
  • 在模型方面,我们采用了逻辑回归和决策树2种算法进行预测,虽然2个模型的ks值都超过了0.2,但是决策树的预测效果并没有逻辑回归靠谱。逻辑回归模型的AUC值为0.69,k-s值为0.27,说明模型是可行的且是可靠,因此我们建议采用逻辑回归的模型进行贷款违约预测。

结束语

本项目为个人学习成果,若有不对之处,还请各位读者给予指正~

Lending Club贷款违约预测相关推荐

  1. Lending Club贷款数据分析

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  2. 车辆贷款违约预测挑战赛

    2021科大讯飞-车辆贷款违约预测挑战赛--方案 简介 车贷违约预测问题,目的是建立风险识别模型来预测可能违约的借款人.预测结果为借款人是否可能违约,属于二分类问题. 偏数据挖掘的比赛,关键点是如何基 ...

  3. 【算法竞赛学习】金融风控之贷款违约预测-模型融合

    Task5 模型融合 Tip:此部分为零基础入门金融风控的 Task5 模型融合部分,欢迎大家后续多多交流. 赛题:零基础入门数据挖掘 - 零基础入门金融风控之贷款违约预测 项目地址:https:// ...

  4. 【算法竞赛学习】金融风控之贷款违约预测-建模与调参

    Task4 建模与调参 此部分为零基础入门金融风控的 Task4 建模调参部分,带你来了解各种模型以及模型的评价和调参策略,欢迎大家后续多多交流. 赛题:零基础入门数据挖掘 - 零基础入门金融风控之贷 ...

  5. 数据竞赛入门-金融风控(贷款违约预测)五、模型融合

    前言 本次活动为datawhale与天池联合举办,为金融风控之贷款违约预测挑战赛(入门) 比赛地址:https://tianchi.aliyun.com/competition/entrance/53 ...

  6. 数据竞赛入门-金融风控(贷款违约预测)四、建模与调参

    前言 本次活动为datawhale与天池联合举办,为金融风控之贷款违约预测挑战赛(入门) 比赛地址:https://tianchi.aliyun.com/competition/entrance/53 ...

  7. 数据竞赛入门-金融风控(贷款违约预测)三、特征工程

    前言 本次活动为datawhale与天池联合举办,为金融风控之贷款违约预测挑战赛(入门) 比赛地址:https://tianchi.aliyun.com/competition/entrance/53 ...

  8. 基于机器学习与深度学习的金融风控贷款违约预测

    基于机器学习与深度学习的金融风控贷款违约预测 目录 一.赛题分析 1. 任务分析 2. 数据属性 3. 评价指标 4. 问题归类 5. 整体思路 二.数据可视化分析 1. 总体数据分析 2. 数值型数 ...

  9. 笔记之零基础入门金融风控-贷款违约预测

    零基础入门金融风控-贷款违约预测 赛题描述 赛题概况 数据概况 合理的创建标题,有助于目录的生成 预测指标 赛题流程 评分卡 笔记记录转载 赛题描述 赛题以金融风控中的个人信贷为背景,要求选手根据贷款 ...

最新文章

  1. 虚拟化--YESLAB DC Vphere5 上课PDF
  2. 算法导论一个让人很不爽的地方
  3. ExecuteNonQuery返回值问题
  4. explain 之 table || explain 之 type
  5. [Unity] 3D数学基础 - 坐标系、向量、矩阵
  6. NSubstitute完全手册(八)替换返回值
  7. 如何查看 SAP Spartacus PageLayoutComponent 里的 template$ 的值
  8. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记
  9. TreeMap源码分析——深入分析(基于JDK1.6)
  10. 设计模式(六)J2EE 模式
  11. Linux加密框架 crypto算法模板 以及HMAC算法模板实例
  12. 根据[user]查找所有者为[user]的文件列表
  13. 电子元器件选型——MOSFET
  14. 如何加声调口诀_拼音声调口诀
  15. 副屏幕全屏_如何让电脑显示器屏幕显示全屏
  16. 阿里云主机(ECS)入门(图文说明)详细了解
  17. 死亡计算机在线使用,抖音死亡计算器寿命计算器在线测试入口 使用生命年龄计算器...
  18. 我们需要谈论凯文:我试图建立一个值得信赖的Twitter机器人
  19. [FPGA入门笔记](十):按键消抖实验
  20. 基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符

热门文章

  1. Android 判断手机设备是否是小米,华为,魅族设备
  2. 高德地图marker屏蔽Label
  3. 正确使用计算机键盘和鼠标,你真的会用鼠标吗?鼠标使用全揭秘
  4. 迷你世界枪战精英html5游戏,迷你世界枪战精英吃鸡版
  5. win10查看linux文件夹,Win10系统访问Linux子系统中文件的教程
  6. data mining (foreign blogs)
  7. Git 分支操作、Git 团队协作机制、GitHub 操作
  8. java base64转字图片、图片转base64字符串
  9. WPS2019 For Ubuntu
  10. 【JAVA】(实训1)EL表达式编码问题