Advertisement

实战五十三:基于机器学习随机森林的购房贷款违约预测(完整代码+数据集)

阅读量:

1.1 实验题目:购房贷款违约预测

任务:基于机器学习技术开展购房贷款违约风险评估。针对选定的特征变量进行建模分析,并通过构建预测模型判断客户是否会遇到还款逾期情况。

1.2 实验要求

1.2 题目背景

在全球经济持续发展和改革开放不断深化的背景下,在企业经营和个人消费观念层面,贷款已成为企业在经营和个人生活中应对经济问题的重要手段。与此同时,在银行推出一系列创新性的贷款产品以及人们对美好生活的向往与追求之间存在着密切联系。这些产品的推出往往伴随着客户还款能力下降的风险增加。金融机构在审核贷款申请时会综合考察借款人的信用状况,并通过评估预测其违约可能性进而决定是否发放相关贷款产品。为了有效识别潜在风险并据此做出审慎决策,在信贷审批环节建立有效的风险评估体系是金融机构进行信用风险管理的基础性工作;通过科学模型与系统化的运用可以最大限度地降低风险并实现利润最大化

1.2 数据集

该数据集位于../dataset文件夹中。其中train.csv文件包含训练数据。具体包括12万个条目。每个条目除ID和结果外均具备50项特征指标。测试用例文件test.csv则用于待测分析。其中包含约3万待测样本数量

1.2 任务描述

本任务旨在探讨如何利用非平衡数据分类的思想对银行等金融机构提供的购房贷款数据展开分析,并采用随机森林分类模型来预测贷款违约的可能性。

1.2 评测标准

采用 F1 score 指标,正样本为 1,

计算方法参考 https://en.wikipedia.org/wiki/F1_score

1.3 算法设计


1.3 数据处理

从载体.csv加载数据后调用describe()方法以展示数据特征,并将结果保存至指定位置。具体存储路径为'../dataset/tmp.csv'。其中包含数据的最大值、最小值、平均值以及百分比形式出现的数据样本等详细信息。

图 1 数据信息类型

基于观察的信息可以看出:本次数据集中的数据分布较为分散、稀疏。其中一类(多数类)的数据远超另一类(少数类),属于非均衡分布的情况,并且填充值为0的数量非常大。打算通过人为构造缺失值并填充的方法来替代原有的0数值。具体操作步骤见图3.1.1。此外,在分析过程中发现存在inf数值的情况,在模型预测中由于缺乏精确的数值支持会导致计算错误。具体处理方法见图3.1.2

在选择训练特征的过程中,首先审视 tmp.csv 文件的内容,并识别出具有显著误差的数据字段。例如,在这些数据中仅有约10%的字段具有非零值。随后运用 matplotlib 等可视化工具进行分析,并绘制各字段取值分布图,并计算其对应取值下的违约率指标。为了优化模型性能,则需剔除那些对预测结果影响较小的特征项。以年龄为例说明这一过程:我们首先绘制年龄字段的分布图,并计算其对应不同年龄段下的违约率;对于其他字段则通过类似的方法进行评估。

1.3 人为设置缺失值并处理

人为设定缺失值并处理的基本思路在于获取数据的行与列之后;随后通过生成随机分布因子以及预设缺失值的比例,在数据中的相应随机位置设定 NaN 值;随后采用 Imputer 方法进行插补;其中设定插补方式为均值;需要注意的是,在所观察的数据集中有大量(约50%)特征数值等于零的情况下,则采用中位数填充不再适用。

1.3 inf 数据的处理

通过查看tmp.csv文件来识别inf数据出现的位置,并利用replace函数将其中的无穷大数值替换成对应列的中位数值以最终完成inf数据的清理工作

1.3 age 项的数据分析

首先利用 matplotlib 的 pyplot 工具绘制两个 KDE 曲线分别代表已清偿和未清偿客户的年龄分布,并将其叠加在同一幅图表中(如图 2所示),具体代码实现步骤则可参考附录。

图 2 人数密度的年龄

图 3 求 KDE 的代码实现

通过查看图 2可以看出,在该年龄段(20-30岁)的数据样本数量较多。进一步观察发现,在这一区间内未结清贷款案例的数量显著高于已结清案例的数量。这可能暗示着模型对年龄变量具有较强的预测能力。

随后进一步运用绘图工具,在此时刻重关注尚未还清的贷款数据。针对年龄在20岁至70岁之间的区间范围,则特别将每个年龄区间的划分长度设定为5,并统计每个小区间内尚未还清的贷款数量与总样本数量的比例(如图4所示)。代码的具体实现过程则体现在如图5所示的图表中。

图 5 未偿还贷款的年龄分布

图 6 求年龄分布的代码实现

观察数据显示,在一般性人群中(即普遍人群中),未偿还贷款中年龄较低者的占比显著高于整体水平,并且这一占比呈现出随着年龄增长而递减的趋势。通过上述分析推导得出,age变量与贷款偿还行为之间存在显著的相关性关系,并直接导致该现象的发生。因此,在分析过程中应当考虑包含age这一变量以确保模型的有效性。

1.3 其他项数据特征分析举例

采用 matplotlib.pyplot 工具进行绘图,并展示不同取值对应的未偿还贷款比例及其数量关系(如图 7 所示)。代码的具体实现见图 8。值得注意的是,在本研究中考虑到大量数据均为浮点型特征的情况下(如年龄、收入等指标),当因变量的数据分布过于密集时(即存在较多相同或相近的数值),可能导致图形显示效果不佳或信息过载现象出现。一种可行的方法是对这些区间内的数值进行简化处理,并将该区间内所有数值用该区间的中位数值来代表(如将某个年龄段的所有收入水平用该年龄段的中位收入来表示)。

图 7 半年内申请贷款数量

图 8 特征数据分析绘制代码

参考图 7 中的数据统计情况:左图展示了半年内不同申请次数下逾期还款的数量分布情况;右图则详细分析了各阶段逾期还款的比例变化特征。通过对比分析可以明显看出,在这半年期间用户的逾期还款规律呈现出一定的波动性特征:一方面随着每月还款次数的增加而逐步降低;另一方面也显示出整体呈现出明显的下降趋势。进一步的数据分析表明,在这期间用户的逾期还款比例呈现明显的下降趋势,并且这种变化趋势在统计学上具有显著意义。

在过去的半年内, 借款申请的数目仅占50个项目名录中的一个. 在本次特征提取过程中, 我们将这50个数据逐一对比, 并通过表格形式进行详细分析. 此外, 所有结果将被保存至指定路径下的图片目录中. 其中具有较高相关性的项目将被保留下来; 对于那些无明显相关性的项目, 我们将予以删除.

1.3 特征选择的思考

在构建特征的过程中,可以选择两种不同的策略,一种是提取若干强相关的输入变量重组数据集,另一种是基于原有数据集进行调整。考虑到本实验涉及的数据表项较多,如果采用第一种策略进行特征工程,单纯依靠肉眼观察难以筛选出最具参考价值的关键指标,因为在查看违约率图表时,许多特性的表现相似度较高,难以确定最优组合。因此,采用第二种方法后,在对50个关键特性逐一分析时,剔除那些对模型无显著影响的因素即可,这样既减少了工作负担又尽可能保留了原有潜在的相关性。

1.3 模型算法

在该数据集中呈现明显的类别分布失衡,并且呈现出明显的范围差异;基于随机森林模型进行分类任务的设置

1.3 随机算林算法

我对随机森林算法的直观理解是将其视为由多棵决策树组成的集成模型,在面对输入样本时每一棵决策树都会生成独立的预测结果。随后整个随机森林会对这些预测结果进行汇总并基于多数票决的方式确定最终输出类别

每棵决策树的生成规则为:

如果N表示训练集中元素的数量,则对于每一棵决策树而言,在构建其对应的训练数据集时会随机抽取并有放回地选取N个原始样本点(共计N个),这些样本点可能会导致数据中的某些元素被多次选中;然而,在完全不存在这种元素重叠的情况下(即每棵树都使用了全部不同的样本),这样的做法将导致每棵决策树都拥有相同的 training data set(即与整个原始 training set 完全一致),从而失去了生成多样化的意义)。

假设每个样本包含M个特征,则选择一个小于M的常数m(通常记作m≪M),并在此基础上随机抽取m(m远小于M)个候选特征集合。在每次树构建过程中,在上述随机抽取到的候选特征集合中寻找分割点以生成决策树结构。

每棵树都尽最大程度的生长,并且没有剪枝过程。

1.3 随机森林算法参数

在实验过程中,了解到的随机森林某些重要参数如下:

_estimators:数值类型参数,默认设置为 100;决定树的数量与模型训练耗时呈指数关系,默认情况下当数据量达到 1000 时,预计耗时约为 10 分钟。

该参数类型为数值型,并表示决策树模型中叶子节点中至少需要包含的样本数量。通常情况下,默认设置为 50。然而,在某些特定场景下将其值降低至低于 50时,可能会导致模型对噪声数据产生过度拟合的现象

bootstrap:布尔类型的变量用于指示是否采用有放回地进行抽样操作;当设置为False时,则该算法与传统随机森林方法存在显著差异。

oob_score 用于指示是否采用袋外样本来评估模型的整体准确性。这些未被包含在构建该决策树的数据中的样本被称为袋外样本。通过计算这些袋外样本的分类错误率来评估模型性能。这一方法有助于提高基于整个数据集构建决策树的准确性。

1.3 模型评估
1.3 gridSearchCV 网格搜索

在对随机森林算法进行深入调整和优化的过程中,这两个关键超参常让我难以确定取值。后来我才认识到网格搜索是一种系统性的方法用于探索最佳模型配置。起初我认为这是一种自动化调参工具,在实际操作中发现它更像是一个全面测试方案——通过遍历所有可能的超参组合来评估模型性能。然而这种方法存在明显的局限性——耗时较长,在实际应用中往往难以满足效率要求;因此,在尝试使用这种方法时花费了整整三天的时间才能获得满意的结果。实现过程如图9所示

图 9 gridSearchCV 代码

1.3 评估标准

无自定义评估标准,采用 F1-score 在 educoder 相应模块进行测试。

1.3 模型融合

在本次实验中所述模块未采用多模型集成训练策略。在选择随机森林算法之前我们曾对感知机支持向量机(SVM)以及 K-近邻算法(KNN)等进行了系列训练测试。当采用较为合适的参数设置时在相同的训练集上运行后发现感知机与 KNN 算法的 F1 得分维持在约 0.5 水平而 SVM 方法则表现出明显的性能瓶颈未能收敛并导致程序崩溃深入思考其原理后发现原因在于数据集 0 的取值分布异常集中使得样本高维特征空间中的点大部分集中在原点附近而 SVM 算法基于样本与超平面之间的关系来计算分类边界这一特性使得在此类数据分布下超平面求解过程面临巨大挑战无法有效收敛因此即使适当放宽算法约束仍无法获得理想的分类参数配置

1.4 实验环境与平台


实验平台采用 AMD Ryzen 7 4800U处理器搭配 Radeon Graphics 显卡配置运行,在 Ubuntu 操作系统环境下完成测试任务。基于 Python 3.7 的开发环境,并结合 sklearn 数据挖掘库构建模型框架及训练流程;通过 matplotlib 可视化库完成数据特征分析,并以 pyCharm 开发工具辅助实现代码调试功能

1.5 程序实现


该系统不仅具备预测功能的能力,并且能够通过调用机器学习算法来执行预测任务。当随机森林模型完成训练后,在计算阶段调用feature_importances_函数以评估各特征对模型的影响,并将重要性数值可视化展示(如图 10所示)。从而方便用户在模型生成预测结果后自行核对数据准确性。

图 10 特性重要性输出

在模型训练之前, 输入训练集与测试集至StandardScaler()完成标准化处理; 该方法对F1-score具有提升效果.

1.6 实验结果


最新一次结果如图 11 所示:

图 11 实验结果

1.7 结果分析


测试结果显示,在各项指标评估中,F1分数始终保持在较低水平,最高得分仅为0.587,其余结果多集中在这一区间内(约0.56至0.58)。这种波动现象主要源于数据预处理阶段所采取的人工干预措施,即通过随机选取缺失值并进行补充和处理。此外,其他主流机器学习算法在面对非平衡数据时也未能展现出理想的效果,我认为这可能与F1分数计算公式的特性有关:该指标为精确率与召回率两倍之和除以其总和,而从标签分布角度来看,未违约案例的数量显著多于违约案例的数量。因此,模型对未违约样本的预测更加集中于实际状况,而对违约样本的识别则相对滞后

还存在原因之一在于数据清洗过程中缺乏有效的流程管理,在这一环节未采用实时评估指标来指导 washing direction, 从而使得在实际操作中往往依赖于 personal observations of data distribution characteristics and individual analytical approaches for data cleaning. 经过不同 washing strategy 的试验后发现多数情况下操作流程繁杂且难以达到预期效果.

完整代码:<>

全部评论 (0)

还没有任何评论哟~