数据挖掘实战:基于 Python 的个人信贷违约预测

news2024/11/20 4:17:10

本次分享我们 Python 觅圈的一个练手实战项目:个人信贷违约预测,此项目对于想要学习信贷风控模型的同学非常有帮助。

图片

技术交流

技术要学会交流、分享,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

好的文章离不开粉丝的分享、推荐,资料干货、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88194,备注:来自CSDN + 数据分析
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:数据分析

资料1
在这里插入图片描述
资料2

我们打造了《100个超强算法模型》,特点:从0到1轻松学习,原理、代码、案例应有尽有,所有的算法模型都是按照这样的节奏进行表述,所以是一套完完整整的案例库。

很多初学者是有这么一个痛点,就是案例,案例的完整性直接影响同学的兴致。因此,我整理了 100个最常见的算法模型,在你的学习路上助推一把!

在这里插入图片描述

项目背景

当今社会,个人信贷业务发展迅速,但同时也会暴露较高的信用风险。信息不对称在金融贷款领域突出,表现在过去时期借款一方对自身的财务状况、还款能力及还款意愿有着较为全面的掌握,而金融机构不能全面获知借款方的风险水平,或在相关信息的掌握上具有明显的滞后性。这种信息劣势,使得金融机构在贷款过程中可能由于风险评估与实际情况的偏离,产生资金损失,直接影响金融机构的利润水平。

而现今时间金融机构可以结合多方数据,提前对客户风险水平进行评估,并做出授信决策。

解决方法

运用分类算法预测违约

模型选择

单模型: 决策树、贝叶斯、SVM等
集成模型: 随机森林、梯度提升树等
评分卡模型: 逻辑回归
项目可输出: 评分卡

数据描述

数据总体概述

可用的训练数据包括用户的基本属性user_info.txt、银行流水记录bank_detail.txt、用户浏览行为browse_history.txt、信用卡账单记录bill_detail.txt、放款时间loan_time.txt,以及这些顾客是否发生逾期行为的记录overdue.txt。(注意:并非每一位用户都有非常完整的记录,如有些用户并没有信用卡账单记录,有些用户却没有银行流水记录。)

相应地,还有用于测试的用户的基本属性、银行流水、信用卡账单记录、浏览行为、放款时间等数据信息,以及待预测用户的id列表。

脱敏处理:(a) 隐藏了用户的id信息;(b) 将用户属性信息全部数字化;© 将时间戳和所有金额的值都做了函数变换。

(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分组后对每个字段均值化处理。

图片

逾期表、用户表

图片

合并五张表

将筛选后的五个表进行合并,得出25个字段

df_train=user_train.merge(bank_train)
df_train=df_train.merge(bill_train)
df_train=df_train.merge(browse_train)
df_train=df_train.merge(overdue_train)
df_train.head()

图片

查看完整表格的基本情况,无缺失值,均是数值类型。

df_train.info()

图片

特征工程

基于业务理解的筛选

银行流水记录特征相关性分析

# 相关性结果数据表
corrmat=bank_train[internal_chars].corr()  
#热力图
sns.heatmap(corrmat, square=True, 
            linewidths=.5, annot=True); 

图片

  • '进账单数’与’进账金额’的相关系数很高,相关系数为0.99

  • ‘支出单数’, '支出金额’的相关性较高,相关系数分别为0.82,0.85

  • ‘进账金额’与’支出单数’, '支出金额’的相关性较高,相关系数分别为0.81,0.85

  • '支出单数’与 '支出金额’的相关性很高,相关系数为0.99

  • '工资笔数’与’工资收入’相关系数为1

  • 可见收入、支出、工资三个指标的金额跟笔数是线性关系,那么后续将构建一个新的特征:笔均=金额/笔数,取工资笔均;而且收入、支出是强相关(0.82),所以只取一个即可,支出笔均。

  • 后续将用’进账金额/进账单数’,‘支出金额/支出单数’,‘工资收入/工资笔数’得到’进账笔均’,‘支出笔均’,‘工资笔均’

总表相关性分析

# 相关性结果数据表
corrmat=df_train[internal_chars].corr()
# 热力图
sns.heatmap(corrmat, square=False, 
            linewidths=.5, annot=True);  

图片

  • '本期账单金额’与’本期账单余额’相关系数为0.85

  • '上期账单金额’与’上期还款金额’相关系数为0.75

  • '本期账单金额’与’上期还款金额’相关系数为0.64

  • '信用卡额度’与’上期账单金额’和’上期还款金额’相关系数分别为0.54和0.52

  • '本期账单金额’与’上期账单金额’相关系数为0.5

本期的账单余额与最低还款额具有高度共线性,决定只选用最低还款额。

生产衍射变量

上期还款差额 =上期账单金额 - 上期还款金额, 上期还款差额还会直接影响用户的信用额度以及本期的账单金额。

调整金额和循环利息是跟“上期的还款差额”有关的:

  • 还款差额>0,需要计算循环利息,调整金额不计

  • 还款差额<0,需要计算调整金额,循环利息不计

可以将还款差额进行“特征二值化”来代替这两个特征。

预借现金额度,是指持卡人使用信用卡通过ATM等自助终端提取现金的最高额度,取现额度包含于信用额度之内,一般是信用额度的50%左右,所以可以不用这个特征,选择信用额度即可。

df_train['平均支出']=df_train.apply(lambda x:x.支出金额/x.支出单数, axis=1)  
df_train['平均工资收入']=df_train.apply(lambda x:x.工资收入/x.工资笔数, axis=1)
df_train['上期还款差额']=df_train.apply(lambda x:x.上期账单金额-x.上期还款金额, axis=1)
df_select=df_train.loc[:,['用户id', '性别', '教育程度', '婚姻状态', '平均支出',
                          '平均工资收入', '上期还款差额', '信用卡额度', '本期账单余额', '本期账单最低还款额', 
                          '消费笔数',  '浏览行为数据', '样本标签']].fillna(0)
df_select.head()

图片

基于机器学习的筛选

上期还款差额二值化

from sklearn.preprocessing import Binarizer
X=df_select['上期还款差额'].values.reshape(-1,1)
transformer = Binarizer(threshold=0).fit_transform(X)
df_select['上期还款差额标签']=transformer

方差过滤法

过滤那些不带有信息的变量,默认参数为0,即过滤方差为0的那些变量,只保留对模型有贡献的那些信息。

from sklearn.feature_selection import VarianceThreshold
VTS = VarianceThreshold()   # 实例化,参数默认方差为0
x_01=VTS.fit_transform(x)

相关性过滤–互信息法

互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。

和F检验相似,它既可以做回归也可以做分类,并且包含两个类mutual_info_classif(互信息分类)和mutual_info_regression(互信息回归)。

这两个类的用法和参数都和F检验一模一样,不过互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。

from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(x,y)

样本不均衡

通过观察,正负样本比例为 836:4899,属于样本不均衡范畴,可采用上采样的SMOTE算法对其进行样本不均衡处理。

from imblearn.over_sampling import SMOTE
over_samples = SMOTE(random_state=111)
over_samples_x, over_samples_y = over_samples.fit_sample(x,y)

模型建立与调参

文章一开始已经提到过了,可选模型较多,这里举例三种模型逻辑回归、决策树、随机森林模型,其余模型的选用,小伙伴们可以自己动手练习练习。

二分类模型——逻辑回归模型

互信息与正则化对模型效果的影响

用学习曲线对参数C进行调整,分别在两个模型中进行调参。

超参数C : 一般不会超过1, 越大惩罚力度越小,本次选取从 0.05 - 2范围。

from sklearn.linear_model import LogisticRegression as LR
from sklearn.model_selection import cross_val_score as cvs
lrl1 = LR(penalty='l1', solver='liblinear', 
          C=i, max_iter=1000, random_state=0)
lrl2 = LR(penalty='l2', solver='liblinear', 
          C=i, max_iter=1000, random_state=0)

图片

由图可知,在经过互信息过滤后,逻辑回归模型得分明显提高,且当超参数C=0.6时,模型效果是最好的。

包装法筛选变量

以逻辑回归为基分类器,结合包装法筛选变量,并运用交叉验证绘制学习曲线,探索最佳变量个数。

同时,运用SMOTE算法进行样本均衡处理,并比较均衡前后模型效果的变化。

from sklearn.feature_selection import RFE
LR_1 = LogisticRegression(penalty='l1', solver='liblinear', 
                          C=0.6, max_iter=1000, random_state=0)
selector1 = RFE(LR_1, n_features_to_select=i, step=1)
X_wrapper1 = selector1.fit_transform(x, y)
once1=cvs(LR_1, X_wrapper1, y, cv=5, scoring='f1').mean()

图片

由图可见,样本均衡前后模型效果有大幅度增长。且两种正则化方法相差无几。

树模型——决策树

因为样本均衡化处理前后,对模型效果提升较为明显,因此在使用决策树模型建立之前,对样本进行均衡化处理。

因为深度参数max_depth是对决策树模型影响最大的参数之一,因此本案例正对决策树深度绘制学习曲线,探索决策树最佳参数。

plt.plot(L_CVS, 'r')  # 交叉验证
plt.plot(L_train, 'g')# 训练集
plt.plot(L_test, 'b') # 测试集

图片

由学习曲线可知,在max_depth=5时训练集和测试集模型效果均达到了最佳状态,当在max_depth大于5后,模型在训练集上的分数依然在上升,而测试集上的表现有所下降,这就是模型过拟合现象,因此最终我们选用max_depth=5

特征重要性

features_imp = pd.Series(dtc.feature_importances_, 
          index = x.columns).sort_values(ascending=False)
features_imp
上期还款差额标签     0.705916
性别           0.101779
平均支出         0.064218
平均工资收入       0.047644
浏览行为数据       0.044333
教育程度         0.015257
婚姻状态         0.012665
本期账单最低还款额    0.004455
消费笔数         0.003734
本期账单余额       0.000000
信用卡额度        0.000000
dtype: float64

决策树可视化

这里提出一点,如果需要深入理解决策树决策过程,可以借助决策树可视化来辅助理解。

import graphviz
from sklearn import tree
#首先配置
dot_data = tree.export_graphviz(dtc 
      # 要对已经建成的dct这个实例化好的模型进行画图
      ,feature_names= x.columns 
      # 更改列名为中文
      # ,class_names=[] 
      # 更改标签名字
      ,filled=True 
      # 给每一个节点分配颜色,颜色约深表示叶子的纯度越高
      ,rounded=True
      # 节点性状为圆角
      )
graph = graphviz.Source(dot_data)
graph

树模型——随机森林

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import GridSearchCV
rfc = RFC(n_estimators=i+1,
          n_jobs=-1,
          random_state=90)
score = cvs(rfc,over_samples_x_train, 
            over_samples_y_train,
            cv=5, scoring='f1').mean()

模型调参

有⼀些参数是没有参照的,一开始很难确定⼀个范围,这种情况下采用先通过学习曲线确定参数大致范围,再通过网格搜索确定最佳参数。

比如确定n_estimators范围时,通过学习曲线观察n_estimators在什么取值开始变得平稳,是否⼀直推动模型整体准确率的上升等信息。

对于其他参数也是按照同样的思路,如影响单棵决策树模型的参数max_depth来说,⼀般根据数据的⼤⼩来进⾏⼀个试探,比如乳腺癌数据很⼩,所以可以采⽤1~10,或者1~20这样的试探。

但对于像digit recognition那样的⼤型数据来说,我们应该尝试30~50层深度(或许还不⾜够),此时更应该画出学习曲线,来观察深度对模型的影响。

确定范围后,就可以通过网格搜索的方式确定最佳参数。其他参数就不一一举例了,大家可以动手尝试一下。

# 调整max_depth
param_grid = {'max_depth':np.arange(1, 20, 1)}
rfc = RFC(n_estimators=150,random_state=90, n_jobs=-1)
GS = GridSearchCV(rfc,param_grid,cv=5, scoring='f1')
GS.fit(over_samples_x, over_samples_y)
GS.best_params_
GS.best_score_

模型评价

本次案例模型评估使用classification_report

sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。

主要参数:
y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。
y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。
sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。
digits:int,输出浮点值的位数。

决策树验证集评价结果

最后这里举了一个决策树模型效果评价的例子,其余分类型模型评价同样可以使用。当然,模型评价方法不止这一种,大家也可以尝试着从其他角度来做模型评价。

            precision   recall  f1-score  support
           0     0.70   0.74    0.72      1454
           1     0.72   0.68    0.70      1454
    accuracy                    0.71      2908
   macro avg     0.71   0.71    0.71      2908
weighted avg     0.71   0.71    0.71      2908

本文旨在梳理数据挖掘的一般过程,没有涉及到很复杂的算法,每个环节,如数据预处理、特征工程、模型建立于评价,均是常用的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10 修改任务栏颜色 “开始菜单、任务栏和操作中心” 是灰色无法点击,一共就两步,彻底解决有图有真相。

电脑恢复了一下出厂设置、然后任务栏修改要修改一下颜色&#xff0c;之前会后来忘记了&#xff0c;擦。 查了半天文档没用&#xff0c;最后找到官网才算是看到问题解决办法。 问题现象: 解决办法: 往上滑、找到这里 浅色改成深色、然后就可以了&#xff0c;就这么简单。 w…

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

Ubuntu中MySQL安装与使用

一、安装教程&#xff1a;移步 二、通过sql文件创建表格&#xff1a; 首先进入mysql&#xff1a; mysql -u 用户 -p 回车 然后输入密码source sql文件&#xff08;路径&#xff09;;上面是sql语句哈&#xff0c;所以记得加分号。 sql文件部分截图&#xff1a; 创建成功后的部…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

【无标题】mmocr在云服务器上

这里写目录标题 1、创建虚拟环境2、切换和退出conda虚拟环境3. 显示、复制&#xff08;克隆&#xff09;、删除虚拟环境4、删除环境安装指示中 cd进项目文件夹开始训练模型&#xff08;python XXX.py | tee record.txt 记录训练结果&#xff09;如何在Linux服务器上安装Anacond…

Redis部署-主从模式

目录 单点问题 主从模式 解析主从模式 配置redis主从模式 info replication命令查看复制相关的状态 断开复制关系 安全性 只读 传输延迟 拓扑结构 数据同步psync replicationid offset psync运行流程 全量复制流程 无硬盘模式 部分复制流程 积压缓冲区 实时复…

【代码】基于算术优化算法(AOA)优化参数的随机森林(RF)六分类机器学习预测算法/matlab代码

代码名称&#xff1a;基于算术优化算法&#xff08;AOA&#xff09;优化参数的随机森林&#xff08;RF&#xff09;六分类机器学习预测算法/matlab代码 使用算术优化算法&#xff08;AOA&#xff09;优化分类预测模型的参数&#xff0c;收敛性好&#xff0c;准确率提升明显&am…

【Java】I/O流—File类:从0到1的全面解析

&#x1f38a;专栏【Java】 &#x1f33a;每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…

Linux学习第46天:Linux音频驱动试验:总有那么一首歌,会让你泪流满面。

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 大叔来之一个小村庄&#xff0c;上大学以后来到了省城济南。之前高中练习英语听力买过一个随声听&#xff0c;晚上练习听力&#xff0c;怕影响同学休息还买了一个…

超级鹰验证码平台使用 + 案例使用

超级鹰主要是用来识别图片形式的验证码&#xff0c;进行登录验证的。 使用流程&#xff1a; 注册账号领取1000题分&#xff0c;新用户可以享受1000题分的优惠。 进去页面之后&#xff0c;点击开发文档&#xff1a; 这里面有很多语言的使用&#xff0c;这篇博客介绍python的…

Linux中top命令输出日志分析?

以下是对输出的各部分的解释&#xff1a; 09:54:34&#xff1a;系统当前时间。up 161 days, 2:08&#xff1a;系统已经运行了161天2小时8分钟。5 users&#xff1a;有5个用户登录系统。load average: 0.13, 0.08, 0.05&#xff1a;系统的1分钟、5分钟、15分钟的平均负载。负载…

Halcon算子中的slant倾斜hom_mat2d_slant

1.hom_mat2d_slant(HomMat2DIdentity, rad(50), y, 0, 0, HomMat2DSlant) --这个是选择20度和50度的。&#xff08;0&#xff0c; 0&#xff09;点对应的是左上角&#xff0c;50度就是让y轴产生有50度的倾角。 2.hom_mat2d_slant(HomMat2DIdentity, rad(60), x, 0, 0, HomMat2D…

【GraphQL】PostGraphile简介

Introduction to PostGraphile 什么是PostGraphile&#xff1f; 如果您熟悉Spring Data JPA&#xff0c;那么理解PostGraphile将非常容易。但没关系。让我们来看看。PostgreSQL数据库是一个非常流行的高性能应用数据库。ProstGraphile与PostgreSQL数据库和GraphQL配合使用。 …

Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0

错误再现&#xff1a; 启动Springboot项目时候报错 java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Maven/apache-maven-3.6.3/repository/org/springframework/boot/spring-boot/3.0.0/spring-boot-3.0.0.jar!/org/springframework/boot/Sprin…

彰显营销硬实力!皓量科技连续四年入选《中国数字营销生态图》

11月28日&#xff0c;中国商务广告协会数字营销专业委员会、虎啸奖组委会、秒针营销科学院共同发布了《中国数字营销生态图&#xff08;2023版&#xff09;》&#xff08;以下简称生态图&#xff09;。凭借多年在广告营销领域的精耕细作&#xff0c;皓量科技从2020年开始连续4年…

计算机导论——第37章 磁盘驱动器

关键问题&#xff1a;如何存储和访问磁盘上的数据 现代磁盘驱动器如何存储数据&#xff1f;接口是什么&#xff1f;数据是如何安排和访问的&#xff1f;磁盘调度如何提高性能&#xff1f; 1. 接口 驱动器制造商唯一保证的是单个512字节的写入是原子的&#xff0c;即它将完整地…

计算机硬件(二)

1.内存和内存条的用途 假设运行内存16个g,能开多少软件 后台和前台能同时运行多少APP RAM越大越好 464 6128 8128 10256 例子: 8gx216g 两根内存条 16g运行内存 2.内存频率的用途 DDR5 DDR4 DDR3 后面的数字越大,越好,可以理解为传输的速度&#xff0c;内存搭配主…

【实战教程】PHP如何轻松对接腾讯云COS,实现文件上传下载?

腾讯云提供了一系列丰富的云服务&#xff0c;其中包括对象存储&#xff08;Cloud Object Storage&#xff0c;简称COS&#xff09;&#xff0c;它是一种高可靠性、可扩展性强的云存储服务。本文将介绍如何使用PHP对接腾讯云COS存储服务&#xff0c;实现文件的上传和下载功能。 …

Pytest做性能测试?

Pytest其实也是可以做性能测试或者基准测试的。是非常方便的。 可以考虑使用Pytest-benchmark类库进行。 安装pytest-benchmark 首先&#xff0c;确保已经安装了pytest和pytest-benchmark插件。可以使用以下命令安装插件&#xff1a; pip install pytest pytest-benchmark …

这是怎么了?继阿里11月故障后,淘宝这个问题20 天了还未修复!

继11月12号&#xff0c;阿里云发生大面积故障故障以来&#xff0c;已经过去了近 20天&#xff0c;但是截止到发文时间&#xff0c;作者发现淘宝还有部分功能存在问题&#xff0c;没法正常使用。 难道真是降本增笑&#xff0c;开猿截流&#xff0c;导致没有相关负责人员了&…