大家好,我是东哥。本次分享一个数据挖掘实战项目:个人信贷违约预测,此项目对于想要学习信贷风控模型的同学非常有帮助,数据和源码在文末。
项目背景
当今社会,个人信贷业务发展迅速,但同时也会暴露较高的信用风险。信息不对称在金融贷款领域突出,表现在过去时期借款一方对自身的财务状况、还款能力及还款意愿有着较为全面的掌握,而金融机构不能全面获知借款方的风险水平,或在相关信息的掌握上具有明显的滞后性。这种信息劣势,使得金融机构在贷款过程中可能由于风险评估与实际情况的偏离,产生资金损失,直接影响金融机构的利润水平。
而现今时间金融机构可以结合多方数据,提前对客户风险水平进行评估,并做出授信决策。
解决方法
运用分类算法预测违约
模型选择
单模型: 决策树、贝叶斯、SVM等
集成模型: 随机森林、梯度提升树等
评分卡模型: 逻辑回归
项目可输出: 评分卡
数据描述
数据总体概述
可用的训练数据包括用户的基本属性user_info.txt、银行流水记录bank_detail.txt、用户浏览行为browse_history.txt、信用卡账单记录bill_detail.txt、放款时间loan_time.txt,以及这些顾客是否发生逾期行为的记录overdue.txt。(注意:并非每一位用户都有非常完整的记录,如有些用户并没有信用卡账单记录,有些用户却没有银行流水记录。)
相应地,还有用于测试的用户的基本属性、银行流水、信用卡账单记录、浏览行为、放款时间等数据信息,以及待预测用户的id列表。
脱敏处理:(a) 隐藏了用户的id信息;(b) 将用户属性信息全部数字化;(c) 将时间戳和所有金额的值都做了函数变换。
(1)用户的基本属性user_info.txt。共6个字段,其中字段性别为0表示性别未知。
用户id,性别,职业,教育程度,婚姻状态,户口类型 6346,1,2,4,4,2
(2)银行流水记录bank_detail.txt。共5个字段,其中,第2个字段,时间戳为0表示时间未知;第3个字段,交易类型有两个值,1表示支出、0表示收入;第5个字段,工资收入标记为1时,表示工资收入。
用户id,时间戳,交易类型,交易金额,工资收入标记 6951,5894316387,0,13.756664,0
(3)用户浏览行为browse_history.txt。共4个字段。其中,第2个字段,时间戳为0表示时间未知。
用户id,时间戳,浏览行为数据,浏览子行为编号 34724,5926003545,172,1
(4)信用卡账单记录bill_detail.txt。共15个字段,其中,第2个字段,时间戳为0表示时间未知。为方便浏览,字段以表格的形式给出。
(6)顾客是否发生逾期行为的记录overdue.txt。共2个字段。样本标签为1,表示逾期30天以上;样本标签为0,表示逾期10天以内。
注意:逾期10天~30天之内的用户,并不在此问题考虑的范围内。用于测试的用户,只提供id列表,文件名为testUsers.csv。
用户id,样本标签 1,1 2,0 3,1
各个数据表之间的关系
数据预处理
从表中数据得知并非每一位用户都有非常完整的记录,如有些用户并没有信用卡账单记录,有些用户却没有银行流水记录。
发现用户信息表,是否逾期表,放款时间表这三张表的id数目都是55,596,银行流水表为9,294,浏览信息表为47,330,信用卡账单表为53,174。通过用户id数得到并非每个用户都有银行流水记录、信用卡账单等信息,所以这里我们取6个表共同用户的记录筛选后组成完整的表。
我们要预测的测试集都是还没有放款的用户特征,所以训练数据这里我们也选取放款时间之前的特征,将存在时间戳的表与放款时间表进行交叉,只筛选此时间范围内的用户id。
筛选出这6张表共有的用户id,得出5735个用户的记录是完整的。
user.T
银行账单表
bank_detail_select = pd.merge(left=df_bank_detail_train, right=user, how='inner', on='用户id')
统计用户进账单数,求和
统计用户支出单数,求和
统计用户工资收入计数,求和
银行账单表
bank_train.head()
浏览表
先剔除5735以外的数据,再统计每个用户的浏览记录(count)
browse_train.head()
账单表
去掉了时间、银行id、还款状态这几个变量,按用户id分组后对每个字段均值化处理。
逾期表、用户表