[代码]数据挖掘与商务智能期末报告——构建客户信用评分模型-CSDN博客[代码]数据挖掘与商务智能期末报告——构建客户信用评分模型
https://blog.csdn.net/qq_54976575/article/details/139441688?spm=1001.2014.3001.5502代码在这篇博客里,但是观前提醒,数据预处理没做到位,最后的结果不是特别好。
0.实验任务理解
实验目的
构建客户信用评分模型。
实验要求
至少包括以下步骤:
- 数据探索:数据描述统计和数据可视化
- 数据预处理:数据标准化、数据降维、变量选择、变量转换、缺失值填充等(具体处理步骤根据需要选择,说明选择理由)
- 建模:采用logistic回归、支持向量机、决策树、集成模型、贝叶斯模型、神经网络等。
- 分类效果评估(明确评估指标和方法)
实验思路
给出个人贷款违约记录数据,选择出和isDefault即是否违约显著相关的特征,然后使用不同的建模方法构建信用分类预测模型,并进行效果对比与评估。模型的目标是能根据用户的贷款相关数据将其进行信用等级分类并输出,从而达到信用评分的作用。
实验环境
操作系统:Windows 10;
编译语言:Python 3.9;
编程工具:Jupyter Notebook。
1.数据描述
个人贷款违约记录数据,共10000条记录,标为35个变量,其中f系列匿名特征包括f0-f4,所以总共为39个变量。数据文件名:train_public.csv,具体字段及字段描述如表1所示。
表1-1-1 变量及变量描述
字段 | 字段描述 | |
1 | loan_id | 贷款记录唯一标识 |
2 | user_id | 借款人唯一标识 |
3 | total_loan | 贷款数额 |
4 | year_of_loan | 贷款年份 |
5 | interest | 当前贷款利率 |
6 | monthly_payment | 分期付款金额 |
7 | class | 贷款级别 |
8 | employer_type | 所在公司类型(世界五百强、国有企业、普通企业…) |
9 | industry | 工作领域(传统工业、商业、互联网、金融…) |
10 | work_year | 工作年限 |
11 | house_exist | 是否有房 |
12 | censor_status | 审核情况 |
13 | issue_date | 贷款发放的日期 |
14 | use | 贷款用途类别 |
15 | post_code | 贷款人申请时邮政编码 |
16 | region | 地区编码 |
17 | debt_loan_ratio | 债务收入比 |
18 | del_in_18month | 借款人过去18个月逾期30天以上的违约事件数 |
19 | scoring_low | 借款人在贷款评分中所属的下限范围 |
20 | 借款人在贷款评分中所属的上限范围 | |
21 | known_outstanding_loan | 借款人档案中未结信用额度的数量 |
22 | known_dero | 贬损公共记录的数量 |
23 | pub_dero_bankrup | 公开记录清除的数量 |
24 | recircle_b | 信贷周转余额合计 |
25 | recircle_u | 循环额度利用率 |
26 | initial_list_status | 贷款的初始列表状态 |
27 | app_type | 是否个人申请 |
28 | earlies_credit_mon | 借款人最早报告的信用额度开立的月份 |
29 | title | 借款人提供的贷款名称 |
30 | policy_code | 公开可用的策略_代码=1不公开可用的策略_代码=2 |
31 | f系列匿名特征 | 匿名特征f0-f4,为一些贷款人行为计数特征的处理 |
32 | early_return | 借款人提前还款次数 |
33 | early_return_amount | 贷款人提前还款累积金额 |
34 | early_return_amount_3mon | 近3个月内提前还款金额 |
35 | isDefault | 是否违约,违约=0 不违约=1 |
图1-1-1 train_public.csv数据文件
isDefault代表着贷款人是否违约,应作为目标变量进行分析和分类预测。
另外,初步观察数据,发现loan_id和user_id分别作为贷款和人的标识,具备唯一性,于分析无用,可以直接去除。
2.数据探索
2.1数据描述统计
2.1.1查看数据集信息
首先,读入数据,将数据集记录为dt。
而后,查看数据的基本信息。分别查看数据集的行数和列数、起始部分数据内容、数据集的列名。
得知,数据集共10000行,39列,与数据集描述相符。数据集的列名分别为:'loan_id', 'user_id', 'total_loan', 'year_of_loan', 'interest', 'monthly_payment', 'class', 'employer_type', 'industry', 'work_year', 'house_exist', 'censor_status', 'issue_date', 'use', 'post_code', 'region', 'debt_loan_ratio', 'del_in_18month', 'scoring_low', 'scoring_high', 'known_outstanding_loan', 'known_dero', 'pub_dero_bankrup', 'recircle_b', 'recircle_u', 'initial_list_status', 'app_type', 'earlies_credit_mon', 'title', 'policy_code', 'f0', 'f1', 'f2', 'f3', 'f4', 'early_return', 'early_return_amount', 'early_return_amount_3mon', 'isDefault'。
图2-1-1 查看数据的基本信息
而后,执行dt.info(),查看数据集的详细信息,包括每列的数据类型、非空值的数量、内存使用情况等。获知,数据集为一个DataFrame 对象,包含 10000 行和 39 列的数据,内存使用情况为3.0+ MB,数据体体量不大。数据类型包括浮点数 (float64)、整数 (int64) 和对象 (object),具体对应如图2-1-2所示。
图2-1-2 查看数据集的详细信息
接下来检查数据平衡性。先前已经标明isDefault为目标变量,故而用其检查数据的平衡性。
图2-1-3 检查数据平衡性
未违约的人与违约的人分别为1683和8317,可见数据严重不平衡,或会影响预测效果。这意味着后续将需要通过随机过采样等方式重新采样以解决不平衡问题,而后再建模进行预测。
2.1.2描述性统计
执行dt.describe(),对数据集进行描述性统计,获得每列数据的计数、平均值、标准差、最小值、25% 分位数、50% 分位数、75% 分位数和最大值。
具体结果如图2-1-4所示。从展现出的几列中可以初步得出:year_of_loan只有3和5两种类型,total_loan、interest、monthly_payment分布相对较广,平均值较高。house_exist、censor_status、issue_date、use的信息分布较为分散。
图2-1-4 数据集描述性统计结果
2.2数据可视化
2.2.1维度分析:以isDefault为标签分组绘制直方图
为方便查看,对特征进行分组,以贷款申请和处理过程中所涉及的不同方面的信息为依据,划分为3组。以下是具体依据,具体特征分类如表2-2-1所示:
贷款基本信息字段:这类字段主要包含有关贷款本身的基本信息,如贷款金额、贷款期限、贷款利率等。这些信息是贷款审批和合同签订阶段所必需的,用于明确借款的具体情况和条件。
借款人信息字段:这类字段包括借款人的个人或企业相关信息,如姓名、年龄、性别、联系方式、工作单位、收入等。这些信息是贷款机构评估借款人信用状况和还款能力的重要依据,有助于判断借款人的借款资格和风险水平。
还款信息字段:这类字段涉及贷款的还款计划和还款情况,如还款日期、还款金额、逾期记录等。这些信息用于跟踪和管理贷款的还款进度,确保借款人按时履行还款义务,并帮助金融机构进行贷后风险管理。
表2-2-1 特征分类结果
贷款基本信息字段 | 借款人信息字段 | 还款信息字段 |
loan_id user_id total_loan year_of_loan interest monthly_payment class issue_date use post_code region app_type debt_loan_ratio initial_list_status | employer_type industry work_year house_exist censor_status earliest_credit_mon title policy_code f0-f4 | del_in_18month scoring_low scoring_high known_outstanding_loan known_dero pub_dero_bankrup recircle_b recircle_u early_return early_return_amount early_return_amount_3mon |
而后,根据特征分类,以isDefault为标签,分组绘制直方图,来初步查看各个特征的取值与是否违约的关系。
其中,work_year和class虽然为object型变量,但通过前面探索数据,可以知晓它们一个为工作年份,一个为贷款等级,内部均具有顺序关系,故而可以转化为非连续数值型变量。
另外, issue_date和earlies_credit_mon作为日期型变量,industry和employer_type作为内部不具有顺序关系的object型变量,需后再经处理,故暂不放在分组直方图中。
其余变量的直方图如图2-2-1至图2-2-3所示。
图2-2-1 贷款基本信息变量直方图
图2-2-2 借款人信息变量直方图
图2-2-3 还款信息变量直方图
再查看日期型变量issue_date和earlies_credit_mon,转化时间格式。其中,issue_date转化为issueDateDT,表示数据日期离数据集中日期最早的日期(2007-10-01)的天数。对earlies_credit_mon统一日期格式,而后计算各月份的百分比绘制直方图,如图2-2-4所示。
图2-2-4 日期型变量直方图
再查看内部不具有顺序关系的object型变量industry和employer_type,由于显示关系,将数据由中文转化为英文,以category变量的方式绘制直方图,如图2-2-5所示。
图2-2-5 内部不具有顺序关系的object型变量直方图
从图中初步观察发现:
有明显差异的包括:year_of_loan, interest, debt_loan_ratio, house_exist,early_return, early_return_amount, early_return_amount_3mon, censor_status这几个变量,不同的数值范围,是否违约的比率有显著差异。work_year, f0, f4, scoring_low, monthly_payment, use这几类变量的差异较大。另外,f0,f3呈现出显著右偏,scoring_low呈现出显著左偏。
可以初步猜想:
“贷款年份”为5年的较3年的更不易逾期。
“当前贷款利率”愈高的愈不易逾期。
“分期付款金额”在300-450间的更不易逾期。
“贷款用途类别”为1的更不易逾期。
“地区编码”为20-25的贷款更不易逾期。
“债务收入比”愈高的愈不易逾期。
“审核情况”为2的比0的更不易逾期。
“f0”值愈大愈不易逾期。
“f3”值愈大愈不易逾期。
“借款人在贷款评分中所属的下限范围”愈低愈不易逾期。
“借款人档案中未结信用额度的数量”小的更不易逾期。
“信贷周转余额合计”小的更不易逾期。
“循环额度利用率”愈高愈不易逾期。
“借款人提前还款次数”愈小愈不易逾期。
“贷款人提前还款累积金额”愈少愈不易逾期。
“近3个月内提前还款金额”愈少愈不易逾期。
2.2.2相关性分析:绘制热力图、散点图
接下来对数据集进行相关性分析。查看相关系数矩阵,绘制热力图,并列出相关性最强的10组特征,如图2-2-6至图2-2-8所示。
图2-2-6 相关系数矩阵
图2-2-7 热力图
图2-2-8 列出相关性最强的10组特征
列出相关性最强的10组特征,发现有3组特征的相关性高于0.8,属于高度共线。通过观察发现,高度共线三组特征分别为:
①total_loan和monthly_payment的相关系数为0.925,说明贷款数额和分期付款金额此二者具有高度共线性,符合直觉。因为贷款数额一般为还款期与分期付款金额的乘积。
②scoring_high和scoring_low的相关系数为0.889,说明借款人在贷款评分中所属的上限范围和下限范围具有高度共线性,符合直觉。由于贷款评分是根据借款人的多个财务指标综合评估得出的,因此上限范围和下限范围之间存在一定的关联。
③f4和f3的相关系数为0.840,说明匿名特征的f3和f4具有高度共线性。
通过散点图二次确认高度共线性关系,使相关关系可视化更明显。
图2-2-9 3组高度共线的特征的散点图
以上结果表明,后期对于数据预处理时需关注这3组数据,至少选择并去除每组一个特征,以防高度共线性影响预测效果。
3.数据预处理
3.1去除无关列
首先,去掉loan_id和user_id这两个分别标明用户和贷款id的列。这两列仅为身份、交易标识,对于信用分析并无意义。其次删除前面用issueDateDT和Month分别来转换显示日期分布的两列issue_date和earlies_credit_mon。
图3-1-1 去除无关列(1)
据图2-2-2和图2-2-3的百分比直方图可以看出,'employer_type'各个行业的是否逾期的比率都大抵相似,'del_in_18month'在各个数值是否逾期的分布比率也都大抵相似,故而删除这两列。
同理,'app_type'分别为0和1时是否逾期的比率也都大抵相似,故而删除该列。
图3-1-2 去除无关列(2)
3.2处理缺失值
首先,检查当前数据集中的缺失值。
图3-2-1 查看缺失值
一共由7列变量存在缺失值,其中pub _dero_bankrup仅缺失个位数,work_year、f0-f4均缺失几百个数据。总的来说,每个变量缺失的数量都较少。执行dt.info()发现,缺失的都是数值型数据,继而绘制直方图查看有缺失值的字段的数据分布特征,如图3-2-2所示。
根据数据的分布特征,采用填充缺失值法。其中f1和pub_dero_bankrup两个字段用众数来填充,均为0。其余5个字段用各自的均值来填充缺失值。
填充后,检查是否还有缺失值,输出为0,证明数据集中现无缺失值。
图3-2-3 填充缺失值并检查
3.3检查唯一值、重复行、归一化属性
填补缺失值后,检查唯一值,检验是否由某列的唯一值占比过高,如图3-3-1所示。
图3-3-1 检查唯一值
检验发现,没有哪一列的唯一值占比过高。但'title'是借款人提供的贷款名称,数值实为标号。检查'title'的唯一值,发现重复值很多,如图3-3-2所示。且观察图2-2-2的百分比直方图,众数0的逾期百分比持平,可见'title'对于预测是否逾期的作用很小,故将其删除。
图3-3-2 title列唯一值
而后检查重复行,如图3-3-3所示。检查后发现,数据集中不存在数据完全一致的重复行。
图3-3-3 检查重复行
最后检查归一化属性,如图3-3-4所示。遍历后发现,'app_type','policy_code','f1'这三个字段,一种值的比例靠近1,大抵是对是否逾期没有影响,所以将占比最多的值超过0.95的列删除。
图3-3-4 检查并删除归一化属性
3.4处理异常值
通过绘制箱线图的方式以检查数值型数据的异常值,如图3-4-1所示。
图3-4-1 箱线图检查数据异常值
对于数值范围跨度较大的异常数据,使用 IQR(四分位距)法来判断数据是否为异常值,而后根据异常值情况,将标记为异常值的数据替换为该列数据的均值或采用更换为其他值的方式。
图3-4-2 IQR处理数据异常值
此外,由于'house_exist'=3或4的只为个位数,故将其归为2中,使该变量只有0,1,2三种值,也即区分为无房、有1套房、有多套房这三类。
'pub_dero_bankrup'、'known_dero'与'house_exist'同理,前者区分为公开记录清除:无记录、有记录;后者区分为贬损公共记录:无记录、有记录。
图3-4-3 归类替代处理数据异常值
执行完3.1-3.4的所有操作后,当前剩余30列变量;由于缺失值均采用填充的方法,故数据总数未变。当前数据集行列数如图3-4-4所示。
图3-4-4 初步预处理后数据集行列数
接下来进入数据标准化、数据降维、变量选择、变量转换等特征工程环节,进一步筛选变量。
3.5数据标准化
由于决定通过WOE编码选择变量,而WOE编码是一种将变量转换为二进制变量(0或1)的方法。它通过计算变量的平均值和标准差,然后将变量值与平均值和标准差进行比较来实现。因此,WOE编码本身就具有标准化的作用,一般在对变量进行WOE编码之前,不需要进行标准化。
并且尝试过在进行标准化后,模型的预测准确率会降低,因此,这里不进行标准化。
3.6变量转换——WOE编码与IV值
3.6.1选择理由
WOE(Weight Of Evidence)是一种用于评估变量对于目标变量(如违约、欺诈等)的预测能力的统计方法,用来衡量特征的预测强度,它可以将连续型或离散型变量转化为具有预测能力的分数,其特性与适用领域与本实验相符。
WOE可以直接衡量变量的预测能力,值越大表示变量与目标变量的关联性越强。具有可解释性,可以直观地理解变量的影响程度。且WOE值对异常值不敏感,可以提高模型对异常值的鲁棒性。
WOE首先要对特征进行分箱(bin),每个分箱包含一段取值范围的数据。对于每个分箱,计算在该分箱中目标变量的好坏比(即不良事件发生的概率除以好事件发生的概率)。计算每个分箱的WOE值,它是该分箱中目标变量的好坏比的对数值与所有分箱中目标变量好坏比的对数值之差。
而IV值(Information Value)是以WOE为基础的,通过计算特征每个类别的WOE值,并结合事件(例如违约)和非事件(例如正常)的比例,得出每个类别的信息价值。然后,将每个类别的信息价值加总,得到特征的总的信息价值。
IV值作用是用于衡量变量预测能力,IV值越大,表示该变量的预测能力越强。
对于本实验问题来说,基于WOE和IV,可以选择那些与目标变量高度相关的特征,从而减少特征空间,并提高模型的预测能力。
3.6.2WOE编码
分别对于对连续型数值和非连续型数值特征进行分箱、WOE编码、计算IV值。
在初次对连续型数值特征进行编码时,发现发现known_outstanding_loan、interest、early_return_amount_3mon、early_return_amount 、issueDateDT、monthly_payment这六个特征的IV值是inf,也即无穷大。这是由于在计算WOE时,出现了除以零的情况。当某个分箱中的good或bad计数为零时,会导致这个警告。
为了解决这个问题,对于分母good和bad计数添加一个小的正数epsilon = 1e-8,用于避免除以零,问题解决。
图3-6-1 部分WOE编码代码
连续型数值特征分箱、编码、IV值结果如图3-6-2所示。
图3-6-2 连续型数值特征分箱、编码、IV值结果
根据IV值评估变量预测能力的标准,IV值>0.02的具有一定的预测能力。从结果可以发现,'early_return_amount','early_return_amount_3mon','interest','debt_loan_ratio''f0','scoring_low'的IV值>0.02,故保留这6个特征。
非连续型数值特征分箱、编码、IV值结果如图3-6-3所示。
图3-6-3 非连续型数值特征分箱、编码、IV值结果
从结果可以发现,'early_return','class','year_of_loan','censor_status','house_exist'的IV值>0.02,故保留这5个特征。
3.7变量选择
3.7.1根据IV值筛选变量
接下来,根据IV值筛选变量。
经过WOE编码并根据IV值保留>0.02的变量后,现在一共保有12个变量,其中6个连续型数值型变量,5个非连续型数值型变量,1一个目标变量。
图3-7-1 根据IV值筛选变量
而后,将原始变量转化为WOE变量。将经过WOE编码后的连续型和非连续型数值型变量加入到数据集中。
图3-7-2合并数据集
提取出所有WOE变量和目标变量’isDefault’,并将所有列的数据类型转换为浮点型变量,以满足机器学习算法的要求。
图3-7-3 提取后数据集
3.7.2前向逐步回归法筛选变量
用前向逐步回归法根据相关系数筛选变量。
首先选定一个变量,每次加入一个变量,将当前相关系数大于0.7的变量去除。
图3-7-4前向逐步回归筛选变量
上面这一步去掉了2个变量,即:'house_exist'和'early_return_amount_3mon'。
当前数据集中保留'early_return_amount_woe', 'early_return_woe', 'class_woe', 'interest_woe', 'year_of_loan_woe', 'debt_loan_ratio_woe', 'censor_status_woe', 'f0_woe', 'scoring_low_woe'这9个自变量,以及'isDefault'这1个因变量。当前自变量数量合宜,无需再进行PCA降维,已经达到了特征选择和特征降维的目的。下一步进入建立模型阶段。
4.数据建模
4.1划分训练集与测试集
首先需要划分训练集和测试集,以便在模型训练和评估过程中使用不同的数据集。使用训练集来训练模型,并使用测试集来评估模型在未见过数据上的表现,以此检验模型的泛化能力。
图4-1-1划分训练集和测试集
4.2过采样与欠采样尝试
之前在2.1.1中发现,未违约的人与违约的人分别为1683和8317,存在数据不均衡的情况,或会影响预测效果。
所以在划分完训练集后,首先选择采用SMOTE算法对少数类进行过采样生成均衡的数据集。
图4-2-1 SMOTE过采样
使用逻辑回归为例,分别对于SMOTE过采样前和过采样后进行效果比较,并选用ROC、AUC和KS作为评估指标,结果分别如图4-2-2和图4-2-3所示。
图4-2-2 过采样前的指标
图4-2-3 过采样后的指标
结果显示,经过SMOTE过采样后,模型的性能反而下降。这可能是因为过采样引入了噪声,降低机器学习模型的性能。
此外,分别采用随机过采样、SVM SMOTE进行过采样,采用随机欠采样和Near Miss进行欠采样,结果如表4-2-1所示。
表4-2-1
过/欠采样 | AUC值 | KS值 |
随机过采样 | 0.843 | 0.622 |
SVM SMOTE | 0.843 | 0.624 |
随机欠采样 | 0.845 | 0.624 |
Near Miss | 0.745 | 0.508 |
如表中所示,过采样/欠采样均不会使模型的性能提高,因此放弃平衡不均衡数据集的思路,后期可能考虑通过调整损失函数或移动阈值的方法来使算法对少数类样本更加敏感。
4.3logistic回归
Logistic 回归的本质是:假设数据服从这个分布,然后使用极大似然估计做参数的估计。其数学模型可以表示为 。
Logistic 回归通过基于概率模型的线性回归方法进行分类,要求数据集特征较多且线性可分,适用于处理二分类问题。
使用逻辑回归模型对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-3-1 逻辑回归分类结果
预测准确率为0.8305。另外,模型对负例的预测效果很好(精度为0.86,召回率为0.94),但对正例的预测效果较差(精度为0.52,召回率为0.29)。这是由于正负样本不平衡导致的。
4.4kNN
4.4.1原理简述
kNN(k-nearest neighbor, kNN)是一种基于特征向量空间的分类和回归算法,通过测量不同特征值之间的距离来进行预测。给定待预测样本x* ,在训练中找寻与x*相近的k个邻居,计算k个邻居中y=C的概率。
kNN算法精度高、对异常值不敏感、无数据输入假定,适用于分类问题,特别是数据集较小、维度较低、类别分布较为均匀的情况。
4.4.2运行结果
使用kNN算法对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-4-1 kNN分类结果
预测准确率为0.829。另外,模型对负例的预测效果很好(精度为0.87,召回率为0.94),但对正例的预测效果较差(精度为0.51,召回率为0.31)。
4.5支持向量机
4.5.1原理简述
支持向量机(Support Vector Machine, SVM)是一种二分类模型,其主要思想为找到空间中的一个更够将所有数据样本划开的超平面,并且使得本本集中所有数据到这个超平面的距离最短。可以表示为它引入了变量的非线性转换,并有损失函数最小化
SVM通过寻找最优间隔超平面,将样本分离为不同的类别,适用于线性可分或近似可分的问题,也可以通过核技巧处理非线性可分问题。
4.5.2运行结果
使用SVM模型对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-5-1 SVM分类结果
预测准确率为0.838。另外,模型对负例的预测效果很好(精度为0.85,召回率为0.97),但对正例的预测效果较差(精度为0.59,召回率为0.21)。
4.6决策树
4.6.1原理简述
决策树是一个预测模型,它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。常见决策树算法有ID3、C4.5和CART算法。
决策树通过构建一个树形结构,根据特征条件对数据进行划分和分类。适用于数据集包含离散和连续特征,也适用于多分类问题。
4.6.2运行结果
使用决策树算法对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-6-1 决策树分类结果
分类预测准确率为0.7855。另外,模型对负例的预测效果很好(精度为0.86,召回率为0.89),但对正例的预测效果较差(精度为0.36,召回率为0.32)。该数据集的特征可能尤为不适合决策树。
4.7集成模型
构建集成模型要满足的条件有:①个体分类器的预测效果较好(准确性);②个体分类器间要有差异化(多样性)。
4.7.1Bagging
4.7.1.1原理简述
Bagging(Bootstrap aggregating)是基于bootstrap抽样多个模型集成的。其思路是通过抽样获得不同数据集,使得学习器间具有差异。
假设有个数据集,如果将它用不同的模型进行回归,彼此之间很难独立,之间的相关性还是很强。但做集成模型是冀望每一个模型彼此间具有一定的差异性。
Bagging擅长处理不平衡或噪声数据,通过随机采样和构建多个基分类器的集合,通过投票或平均预测结果进行分类。减少了过拟合,提高了模型的鲁棒性和泛化性能。
4.7.1.2运行结果
使用Bagging对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-7-1 Bagging分类结果
预测准确率为0.7945。另外,模型对负例的预测效果很好(精度为0.89,召回率为0.88),但对正例的预测效果较差(精度为0.39,召回率为0.34)。
4.7.2Adaboost
4.7.2.1原理简述
Adaboost通过训练多个分类器,并根据前一个分类器的准确性进行重点训练样本,进而提高分类器的性能。通过加权投票来进行分类。针对已有数据集 ,给每一个样本(xi,yi) 分配权重wi ,初始权重相同,通过权重可以改变模型对单个样本的关注度。训练模型,计算准确率,而后重新分配权重(对错误的样本分配更高的权重),而后重新训练,依次迭代。
区别于决策树与随机森林,其二者每个个体分类器实际上是独立构造的,解决了个体分类器的差异问题;而Adaboost的子集间为串行构造关系,当前分类器要基于前一个分类器的预测结果去调整权重,然后再构造再预测。即以串行的方式逐步优化。
4.7.2.2运行结果
使用Adaboost模型对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-7-2 Adaboost分类结果
预测准确率为0.833。另外,模型对负例的预测效果很好(精度为0.87,召回率为0.94),但对正例的预测效果较差(精度为0.53,召回率为0.31)。Adaboost对于正例的预测效果较前几个更优。
4.7.3Gradient Boosting
4.7.3.1原理简述
Gradient Boosting的基本思想是:串行地生成多个弱学习器,每个弱学习器的目标是拟合先前累加模型的损失函数的负梯度, 使加上该弱学习器后的累积模型损失往负梯度的方向减少。可以理解为函数空间上的梯度下降,即参数空间的梯度下降利用梯度信息调整参数降低损失,函数空间的梯度下降利用梯度拟合一个新的函数降低损失。
4.7.3.2运行结果
使用Gradient Boosting模型对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-7-3 Gradient Boosting分类结果
预测准确率为0.828。另外,模型对负例的预测效果很好(精度为0.87,召回率为0.94),但对正例的预测效果较差(精度为0.51,召回率为0.31)。
4.7.4Voting Classifier
4.7.4.1原理简述
VotingClassifier的思路是组合概念上不同的机器学习分类器,并使用多数投票或平均预测概率(软投票)来预测类别标签。这样的分类器可以用于一组性能同样良好的模型,以平衡它们各自的弱点。
其有硬投票和软投票两种投票方式,本次研究采用了软投票,也即采用加权投票法,增加了权重这个参数。
4.7.4.2运行结果
本次实验组合了逻辑回归、SVM和决策树三种算法。使用VotingClassifier类对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-7-4 VotingClassifier分类结果
预测准确率为0.8195。另外,模型对负例的预测效果很好(精度为0.85,召回率为0.94),但对正例的预测效果较差(精度为0.46,召回率为0.24)。
4.7.5随机森林
4.7.5.1原理简述
随机森林是在Bagging的基础上(Bootstrap)构造决策树,但每个节点变量选择时只基于原有变量的随机子集Xs∈X1,…,XM, Xs=k, k<M 。只在子集里选择最优变量进行分拆,而非全部变量。(即:构造每个决策树时使用不同子集)
为保证个体学习器间的差异:①基于Bootstrap形成各个训练的sample,从样本保证差异性;②构造决策树的随机变量集合以保证差异性。
决策森林计算速度相对较快,每个决策都是并行进行。适用于各种类型的数据集,尤其是大规模和高维度的数据,对于缺失值和异常值也具有较好的处理能力。
4.7.5.2运行结果
使用随机森林模型对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-7-5 随机森林分类结果
预测准确率为0.802。另外,模型对负例的预测效果很好(精度为0.87,召回率为0.90),但对正例的预测效果较差(精度为0.42,召回率为0.35)。
4.8贝叶斯算法
贝叶斯分类器是各种分类器中分类错误概率最小或者在预先给定代价的情况下平均风险最小的分类器。其分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
4.8.1朴素贝叶斯
4.8.1.1原理简述
朴素贝叶斯方法(Naive Bayes)是基于贝叶斯定理和特征条件独立假设的分类方法。对给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;后基于此模型,对给定的输入x ,利用贝叶斯定理求出后验概率最大的输出Y 。
朴素贝叶斯适用于文本分类以及高维特征的分类问题,对于稀疏数据和大规模数据具有较好的处理能力。
4.8.1.2运行结果
使用朴素贝叶斯模型对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-8-1 朴素贝叶斯分类结果
预测准确率为0.751。另外,模型对负例的预测效果很好(精度为0.97,召回率为0.72),但对正例的预测效果较差(精度为0.40,召回率为0.91)。朴素贝叶斯模型对于负例的预测精度较高,对于正例的预测召回率较高,证明该模型识别真正的正例和真正的负例的效果都很好,模型可能还存在欠拟合或过拟合现象,导致对两个类别的预测都不够准确。
4.8.2树增强型朴素贝叶斯
4.8.2.1原理简述
树增强型贝叶斯算法(Tree Augmented Naive Bayes, TAN) 不看y,每一个变量只有一个父变量。其适用于文本分类和高维特征的分类问题,尤其是处理含有不完整特征的数据集。
其步骤可简略为:
②以变量为节点构建完全图,任意两节点间边的权重为
③基于此完全图生成最大有权树,即树的边权之和最大。
④将Y加入此树,再来估计给定x后y的因果图,即
4.8.2.2运行结果
使用TAN算法对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-8-2 TAN分类结果
预测准确率为0.746。另外,模型对负例的预测效果很好(精度为0.97,召回率为0.71),但对正例的预测效果较差(精度为0.40,召回率为0.91)。这是由于正负样本不平衡导致的,模型可能还存在欠拟合或过拟合现象,导致对两个类别的预测都不够准确。
4.9神经网络MLP
4.9.1原理简述
多层感知机(MLP,Multilayer Perceptron)又称人工神经网络(ANN,Artificial Neural Network),一般情况下,MLP包括输入层、隐藏层和输出层。输入层神经元接收输入特征,隐藏层神经元对输入进行非线性变换,输出层神经元产生最终的预测结果。MLP适用于大规模数据集和复杂问题的分类和预测,需要大量的训练数据和计算资源。
4.9.2运行结果
使用神经网络的MLP对训练数据进行训练,并使用该模型对测试数据进行预测。
图4-9-1 MLP分类结果
预测准确率为0.8305。另外,模型对负例的预测效果很好(精度为0.86,召回率为0.94),但对正例的预测效果较差(精度为0.52,召回率为0.29)。
4.10小结
总而言之,所有模型都显现了一个特点,即是对于负例的预测效果很好,对正例的预测效果很差。这大概是由于正负例的数量不平衡导致的。
但同时,我分别用采用了SMOTE过采样和随机欠采样的方法平衡数据集,而后用这两种数据集分别训练各个模型时,发现预测准确率也并没有提高。这是我没有解决的问题,所有模型的准确率均在85%之下。
此外,除却贝叶斯算法的两个模型外,其他所有算法的预测准确率均在0.8以上,多个算法的准确率在0.83以上。仅靠预测准确率无法明显择出最优算法,进行模型评价时,需要选择更有区分度的指标。
5.模型评价与比较
5.1交叉验证
k折交叉验证(k-fold cross validation)是一种常用的模型评估方法,用于评估机器学习模型的性能和泛化能力。它将数据集分为k个相等大小的子集,其中k-1个子集用作训练集,剩余的一个子集用作测试集。然后,通过循环k次,每次将不同的子集作为测试集,其余的子集作为训练集,以评估模型在不同子集上的性能。
评估阶段,首先尝试使用k折交叉验证方法对之前应用的多个分类算法进行评估,并计算了每个分类器的平均准确度和标准差。
首先对于除MLP外的其他算法进行评估。
图5-1-1 k折交叉验证4.3-4.8算法
由于神经网络的独特性,单独对其平均准确度和标准差进行计算。
图5-1-2 k折交叉验证MLP算法
从准确率上看,Logistic Regression效果最好,其次是SVM,再次是Gradient Boosting,准确率都达到了0.84以上,标准差在0.005至0.008之间。但同时,它们之间的差距很小,不足以说明哪一个算法更适合本研究问题。于是继而采用AUC值和KS值来进行比较。
5.2以AUC值与KS值为指标的模型分类效果评估
5.2.1AUC与KS简述及选择理由
在构建客户信用评分模型时,AUC(Area Under the Curve)和KS(Kolmogorov-Smirnov)是常用的模型评估指标。它们可以提供关于分类模型分类能力和性能的重要信息。
AUC是ROC曲线下的面积,ROC(Receiver Operating Characteristic)曲线是表示分类模型的真阳性率和假阳性率之间的关系。AUC值越接近于1,表示模型的分类能力越好,可以更好地区分出正例和负例。
KS衡量了模型在不同预测概率阈值下的表现。它是ROC曲线上最大垂直距离,表示模型预测结果的累积分布函数与实际结果的累积分布函数之间的最大差异。KS值越大,说明分类模型能够更好地将正例和负例区分开。
使用AUC和KS指标可以不受数据集分布的影响:AUC和KS评估指标对于样本不平衡或数据集分布不均衡的情况比准确率和召回率等指标更可靠。因其关注的是分类模型在不同阈值下的整体性能,而不仅仅是特定概率或分类阈值下的表现。并且可以方便地对比不同模型的性能,帮助选择最佳的分类模型。
因此,对于本正反例不均衡的数据集,且采用十余个分类模型的实验来说,采用AUC和KS进行评估可以更为全面评估分类模型的性能,并提供选择最佳模型和分类阈值的依据,可以提供关于模型如何利用特征来预测客户信用风险的更全面的信息。
因此,在平均准确率的基础上,还需要比照它们的AUC和KS值。
5.2.2AUC值与KS值对比
以下为各分类算法的AUC值与KS值。
图5-2-1 逻辑回归的AUC值与KS值
图5-2-2 kNN的AUC值与KS值
综合查看各个分类器的AUC值与KS值如表5-2-1所示。
表5-2-1 各个分类器的AUC值与KS值
分类器 | AUC值 | KS值 |
逻辑回归 | 0.851 | 0.628 |
kNN | 0.624 | 0.249 |
SVM | 0.801 | 0.586 |
决策树 | 0.694 | 0.385 |
VotingClassifier | 0.830 | 0.606 |
Bagging | 0.774 | 0.487 |
AdaBoost | 0.848 | 0.621 |
Gradient Boosting | 0.853 | 0.625 |
随机森林 | 0.802 | 0.526 |
朴素贝叶斯 | 0.850 | 0.630 |
根据AUC值来判断模型好坏,Gradient Boosting模型的AUC值最高,为0.853,其次是逻辑回归和朴素贝叶斯模型,分别为0.851和0.850。
从KS值来看,逻辑回归和朴素贝叶斯模型具有最大的KS值,均为0.630,其次是Gradient Boosting,为0.625。
综上,结合AUC值、KS值和平均预测率来看,可以认为Gradient Boosting模型在分类任务中的整体性能较好,且在辨别正负样本的能力和预测分类标签方面表现优秀,相对其他模型具有更好的分类效果。
5.3尝试优化最优模型
上述实验结合各个评价指标对分类模型进行评价,证明Gradient Boosting在这个数据集种表现最好。于是接下来考虑采用网格搜索的方式对Gradient Boosting进行参数优化,以提高预测效果。
图5-3-1 对Gradient Boosting进行网格搜索以实现参数优化
优化后的结果如图5-3-2与图5-3-3所示。
图5-3-2 网格搜索优化Gradient Boosting后的预测准确率
图5-3-3 网格搜索优化Gradient Boosting后的AUC值与KS值
网格优化参数的优化结果不甚明显,ROC未变;KS值有小幅提升,由0.625提升至0.633;预测准确率由0.8425略微提高到0.8458。这表明优化后的参数没有显著提高模型的分类性能,但对模型的排序能力有一定的改进,一定程度上改善了模型的分类性能。
于是换用交叉验证的方式对Gradient Boosting进行优化。结果如图5-3-4与图5-3-5所示。
图5-3-4 交叉验证优化Gradient Boosting后的预测准确率
图5-3-5 交叉验证优化Gradient Boosting后的AUC值与KS值
实验结果如出一辙,AUC值甚至略微下降,KS值和预测准确率均有小幅提升。这证明优化后的参数没有显著提高模型的分类性能。
5.4小结
本章首先采用了k折交叉验证方法对各个分类算法进行评估,由于准确率的差距较小,因此引入AUC和KS指标进行更全面的比较。在AUC值和KS值评估分类模型的分类效果时,发现Gradient Boosting模型具有最高的AUC值为0.853,且有较高的KS值为0.625。因此,可以认为Gradient Boosting模型在分类任务中整体表现较好,并具有较好的正负样本区分能力。
为了进一步提升模型的预测能力,分别采用网格搜索和交叉验证的方式对Gradient Boosting进行参数优化。然而优化后的参数均没有显著提高模型的分类性能。
综上,虽然参数优化并没有显著改善模型的分类性能,但Gradient Boosting模型仍然是在这个数据集中最佳的分类模型。
6.实验总结
本实验首先对实验任务进行理解和描述。
其次进行数据探索。先进行数据描述统计,介绍了数据集中各列的含义以及数据的基本信息,包括数据集的行数和列数、起始部分数据内容、数据集的列名,及最大最小值、平均值等。
其次对数据可视化,包括划分组别绘制直方图、箱线图、热力图、散点图等图表来展示数据的分布情况。
而后对数据进行预处理,包括去除无关列、缺失值填充、检查唯一值、检查重复行、处理异常值等操作,并使用了WOE编码和IV值进行了变量转换和筛选,以便更好地进行后续的建模工作,最终筛选出了9个自变量。
其后建立模型。首先划分训练集和测试集,而后尝试过/欠采样以平衡数据集但没有得到较好结果。继而采用了多种机器学习算法,包括逻辑回归、支持向量机、决策树、集成模型、贝叶斯模型、神经网络等共12种分类算法,对数据分别进行建模和分类及预测。
最后对模型的表现进行了评估,包括计算准确率、精确度、召回率等指标,并绘制ROC曲线和KS图表来展示模型的表现,通过比较预测准确率、AUC值和KS值来对模型进行综合评价。最后选出Gradient Boosting模型在分类任务中整体表现较好,平均预测准确率、AUC值和KS值分别为0.8425、0.853、0.625,其具有较好的正负样本区分能力,而后尝试对其进行参数优化,结果没有显著提高。