机器学习之客户违约预测模型搭建之案例实战

2024-03-19 16:20

本文主要是介绍机器学习之客户违约预测模型搭建之案例实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 决策数模型搭建

1.1 数据预处理

客户违约预测模型的目的是通过已有的客户信息和违约表现来搭建合适的模型,从而预测之后的客户是否会违约。首先通过pandas库读取数据相关知识读取客户的证信数据以及其交易表现,即是否违约记录,代码如下:

        运行结果如下表所示,其中共有1000组历史数据,其中前400个为违约客户数据,后600个为非违约客户数据。因为Python数学建模中无法识别文本内容,所以“性别”及“是否违约”栏中的内容已经进行了数值处理,其中“性别”栏中0表示男,1表示女,“是否违约”栏中0表示不违约,1表示违约。        

1.2 特征工程 

        其中是否违约作为目标变量,剩下的字段作为特征变量,通过一个借款客户的特征来判断他会不会违约。这里为了方便演示,只选取了5个特征变量,在商业实战中,用到的特征变量远比这里的案例多得多。下面便是决策树模型搭建,也是大部分机器学习模型搭建中的常规步骤。

 1.2.1 提取特征变量和目标变量

        通过如下代码将特征变量和目标变量单独提取出来,代码如下:

        通过drop()函数删除“是否违约”这一列,将剩下的数据作为特征变量赋值给变量X,这里再补充一个删除列的方法:df.drop('是否违约', axis=1),其中axis=1表示按列进行处理。然后通过DataFrame提取列的方式提取“是否违约”这一列作为目标变量,并赋值给变量y

1.2.2 划分训练集和测试集

        通常我们会根据样本量的大小来划分训练集和测试集,当样本量大的时候,可以划分多一点的比例的数据给训练集,比如有10万组数据的时候,我们可以设定9:1的比例来划分训练集和测试集。这里有1000个数据,并不算多,所以按8:2的比例来划分训练集和测试集。

划分训练集和测试集的代码如下:

        因为每次运行程序时,train_test_split()函数都是随机划分数据的,如果想每次划分数据产生的内容都是一致的,可以设置random_state参数,代码如下:

        数据的划分是随机的,我们可以将划分后的数据打印出来看下,如下图所示:

 

 1.3 模型搭建

划分为训练集和测试集之后,就可以从Scikit-Learn库中引入决策树模型进行模型训练了,代码如下:

个决策树模型综合代码:

 2. 模型预测与评估

2.1直接预测是否违约

        搭建模型的目的便是希望利用它来预测数据,这里把测试集中的数据导入到模型中来进行预测,代码如下,其中clf就是上一节搭建的决策树模型:

预测y_pred如下图所示,01为预测的结果,0为预测会不违约,1为预测会违约。 

利用创建DataFrame相关知识点,将预测的y_pred和测试集实际的y_test汇总到一起,其中y_pred是一个numpy.ndarray一维数组结构,y_testSeries一维序列结构,所以这里都用list()函数将其转换为列表,代码如下: 

通过print(a.tail())可以将生成的DataFrame后五行打印输出如下:

        可以看到这里对测试数据集中的全部数据进行了预测,且最后五组数据的预测准确度达到了80%,如果要查看整体的预测准确度,可以采用如下代码

        通过将score打印输出,发现整个模型在测试集上的预测准确度为0.825,即200个测试集数据中,有165人预测结果和实际结果相符。

2.2  预测不违约&违约概率

        其实分类决策树模型本质预测的并不是准确的01的分类,而是预测其属于某一分类的概率,可以通过如下代码查看预测属于各个分类的概率:

        此时获得的y_pred_proba就是预测的属于各个分类的概率,它是一个二维数组,下表展示的便是最后五组数据的不违约&违约概率

第一 列数据是预测为第一类结果 0 ,也即不违约的 概率
第二 列数据则是预测为第二类结果 1 ,也即违约的 概率

两个概率的和为1

        二分类问题默认是以0.5作为阈值来预测属于哪一类,因为如果某一类的概率大于0.5,则该类的概率必然大于另一类。实际应用也可以根据需要调节阈值,比如设定只要违约概率大于0.3,就认为该用户会违约

单纯的查看违约概率,即查看y_pred_proba的第二列,可以采用如下代码

        之前已经利用准确度来衡量了模型的预测效果,不过在商业实战中一般不会以准确度作为模型的评估标准,因为准确度很多时候并不可靠。

        举个例子:倘若100个客户里有10个人违约,而如果模型预测所有客户都不会违约,虽然这个模型没有过滤掉一个违约客户,但是模型的预测准确度仍然能达到90%,显然这个较高的准确度并不能反映模型的优劣

商业实战中,我们更关心下面两个指标:

其中TPFPTNFN的含义如下表所示,这个表也叫作混淆矩阵: 

2.3 模型预测效果评估 

        一个优秀的客户违约预测模型,我们希望命中率(TPR)尽可能的高,即能尽可能地揪出坏人,同时也希望假警报率(FPR)能尽可能的低,即不要误伤好人

然而这两者往往成正相关性,因为一旦当调高阈值,比如认为违约率超过90%的才认定为违约,那么会导致假警报率很低,但是命中率也很低。

如果降低阈值的话,比如认为违约率超过10%就认定为违约,那么命中率就会很高,但是假警报率也会很高

因此为了衡量一个模型的优劣,数据科学家根据不同阈值下的命中率和假警报率绘制了如下的曲线图,称之为ROC曲线:

        在某一个阈值条件下,我们希望命中率能尽可能的高,而假警报率尽可能的低。

        举例来说,某一检测样本总量为100,其中违约客户为20人,当阈值为20%的时候,即违约概率超过20%的时候即认为用户会违约,模型A和模型B预测出来的违约客户都是40

模型A预测违约的40人中有20人的确违约,那么命中率达20/20=100%,此时假警报率为20/80=25%

模型B预测违约的40人中有15人的确违约,那么其命中率为15/20=75%,假警报率为25/80=31.25%

那么此时认为模型A是一个较优的模型。因此,对于不同模型,我们希望在相同的阈值条件下命中率越高,假警报率越低。

         如果把假警报率理解为代价的话,那么命中率就是收益,所以也可以说在相同阈值的情况下,我们希望假警报率(代价)尽量小的情况下,命中率(收益)尽可能的高,该思想反映在图形上也就是这个曲线尽可能的陡峭,曲线越靠近左上角说明在同样的在同样的阈值条件下,命中率越高,假警报率越小,模型越完善。换一个角度来理解,一个完美的模型是在不同的阈值下,假警报率(FPR)则接近于0,而命中率(TPR)都接近于1,该特征反映在图形上,就是曲线非常接近(01)这个点,也即曲线非常陡峭。

数值比较上可以使用AUC值来衡量模型的好坏,AUC值(Area Under Curver)指在曲线下面的面积,该面积的取值范围通常为0.510.5表示随机判断,1则代表完美的模型

商业实战中:

AUC值能达到0.75以上就已经可以接受

如果能达到0.85以上,则为非常不错的模型

 Python实现上,通过如下代码就可以求出在不同阈值下的假警报率(FPR)以及命中率(TPR)的值,从而可以绘制ROC曲线。

  

通过如下代码则可以快速求出模型的AUC 

         其中第一行代码引入roc_auc_score()函数。第二行代码传入测试集目标变量y_test的值,以及预测的违约概率。将获得AUC值打印出来为:0.846,可以说预测效果还是不错的。

3. 模型可视化呈现

Graphviz:

        如果想将决策树模型可视化展示出来,可以使用Pythongraphviz插件,下图所示便是上面训练出来的决策树模型。因为模型可视化呈现主要是为了演示和教学,在真正实战中并不怎么会用到,所以对于graphviz的安装与使用,感兴趣的读者可以自行查阅或参考如下网址:https://shimo.im/docs/lUYMJX0TEjoncFZk/        

这篇关于机器学习之客户违约预测模型搭建之案例实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826574

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个