一、引言
在金融风险管理领域,贷款预估是主要任务之一。通过分析申请人的多个特征,判断是否授予贷款,这不仅有助于减少金融机构的不良债务风险,还能提升贷款审批效率。决策树算法作为一种直观且解释性强的机器学习方法,特别适用于此类分类问题。本文将利用信息增益与增益率构建决策树模型,进行实际操作演示,引导读者从数据准备到模型应用,全面了解决策树在具体场景的应用流程。
二、核心概念铺垫
在进入实战之前,我们需要明确决策树构建的两个重要指标:信息增益与增益率,这是选择最佳划分特征的关键依据。
(一)信息熵
信息熵是衡量数据集纯度的标准,熵值越低,表明数据集纯度越高。对于二分类问题,假设数据集 D 中,类别为 “是” 的样本占比为 p,“否” 的样本占比为 1-p,则信息熵 H (D) 的计算公式为:H (D) = -p?log?p - (1-p)?log?(1-p)
(二)信息增益
信息增益表示特征 A 对数据集 D 进行分类后,信息熵的减少量。计算公式为:Gain (D,A) = H (D) - Σ(|D?|/|D|)?H (D?)其中,D?是特征 A 取值为第 i 类的样本子集,|D?| 是 D?的样本数量,|D | 是总样本数量。信息增益越大,表明该特征对分类的贡献越大,越适合作为划分依据。
(三)增益率
信息增益存在倾向于选择取值多的特征的问题,增益率通过引入 “分裂信息” 来进行修正。计算公式为:Gain_ratio (D,A) = Gain (D,A) / IV (A)其中,IV (A) 是特征 A 的分裂信息,IV (A) = -Σ(|D?|/|D|)?log?(|D?|/|D|)。增益率能有效避免选择取值过多的特征,使特征选择更加合理。
三、数据集介绍
本次实战使用两份关键数据:训练数据集(dataset.txt 与数据表.xlsx 对应)和测试数据集(testset.txt)。
(一)数据格式与含义
1. 数据表.xlsx(标签化数据) 包含 16 条训练样本,每条样本有 5 个特征和 1 个目标类别,具体字段说明如下: ID 年龄段 有工作 有自己的房子 信贷情况 类别 1 青年 否 否 一般 否 2 中年 是 是 好 是 3 老年 否 否 非常好 否 4 青年 是 否 好 是
2. 数值化数据集(dataset.txt 与 testset.txt) 为了便于算法计算,将标签化特征转换为数值编码,编码规则如下: 年龄段:青年 = 0,中年 = 1,老年 = 2 有工作:否 = 0,是 = 1 有自己的房子:否 = 0,是 = 1 信贷情况:一般 = 0,好 = 1,非常好 = 2 类别:否 = 0,是 = 1 dataset.txt 包含 16 条训练样本(每行 5 个数值,前 4 个为特征,最后 1 个为类别),testset.txt 包含 7 条测试样本(格式与训练集一致,无类别标签,用于模型预测)。
(二)数据预览
1. 训练集部分数据(dataset.txt) 0,0,0,0,0 # 青年、无工作、无房、信贷一般 → 不贷款 0,0,0,1,0 # 青年、无工作、无房、信贷好 → 不贷款 1,1,1,1,1 # 中年、有工作、有房、信贷好 → 贷款
2. 测试集数据(testset.txt) 0,0,0,1,0 # 青年、无工作、无房、信贷好 → 待预测 1,0,1,2,1 # 中年、无工作、有房、信贷非常好 → 待预测
四、决策树模型构建步骤
(一)数据加载与预处理
加载数据:读取 dataset.txt 和 testset.txt,将数据转换为 DataFrame 格式,便于后续操作。 数据划分:训练集包含 16 条样本(特征列:年龄段、有工作、有自己的房子、信贷情况;目标列:是否贷款),测试集包含 7 条样本(仅特征列)。 数据检查:确保无缺失值,样本分布均衡(贷款 8 条,不贷款 8 条)。
(二)基于信息增益与增益率选择特征
1. 计算根节点信息熵 训练集中,贷款(1)和不贷款(0)的样本各 8 条,占比均为 0.5,根节点信息熵:H (D) = -0.5?log?0.5 - 0.5?log?0.5 = 1.0
2. 计算各特征的信息增益与增益率 以 “有自己的房子” 特征为例: 特征取值:有房(1)(8 条样本,均为贷款)、无房(0)(8 条样本,2 条贷款,6 条不贷款) 条件熵 H (D | 有房) = 0(纯子集) 条件熵 H (D | 无房) = - (2/8) log?(2/8) - (6/8) log?(6/8) ≈ 0.811 信息增益 Gain (D, 有房) = 1.0 - (8/16)?0 + (8/16)?0.811 ≈ 0.594 分裂信息 IV (有房) = - (8/16) log?(8/16) - (8/16) log?(8/16) = 1.0
增益率 Gain_ratio (D, 有房) = 0.594 / 1.0 = 0.594 同理计算其他特性的信息增益与增益率,结果如下: 特性?? ?信息增益?? ?增益率 年龄段?? ?0.319?? ?0.251 有工作?? ?0.363?? ?0.363 有自己的房子?? ?0.594?? ?0.594 信贷状况?? ?0.474?? ?0.376
3. 选择最佳划分特性 “有自己的房子” 的增益率最高(0.594),因此选择其作为根节点划分特征。
(三)递归构建决策树 根节点划分:按 “有自己的房子” 分为两支: 有房(1):8 条样本均为 “贷款”,为叶节点,输出 “是”。 无房(0):8 条样本(2 条贷款,6 条不贷款),需进一步划分。 子节点划分:对 “无房” 子集,重复计算各剩余特性的增益率,选择 “有工作” 作为划分特征(增益率最高): 有工作(1):2 条样本均为 “贷款”,叶节点,输出 “是”。 无工作(0):6 条样本均为 “不贷款”,叶节点,输出 “否”。 剪枝处理:由于样本量较小,构建的决策树深度较浅(最大深度 2),无需复杂剪枝,避免过拟合。
最终构建的决策树结构如下: 根节点:有自己的房子? ├─ 是 → 贷款(叶节点) └─ 否 → 有工作? ├─ 是 → 贷款(叶节点) └─ 否 → 不贷款(叶节点)
五、模型测试与预测结果 (一)测试集预测 将 testset.txt 的 7 条样本输入构建好的决策树,预测结果如下: 测试样本(数值化) 特性解读 预测结果 0,0,0,1,0 青年、无工作、无房、信贷状况好 不贷款 0,1,0,1,1 青年、有工作、无房、信贷状况好 贷款 1,0,1,2,1 中年、无工作、有房、信贷状况非常好 贷款 1,0,0,1,0 中年、无工作、无房、信贷状况好 不贷款 2,1,0,2,1 老年、有工作、无房、信贷状况非常好 贷款 2,0,0,0,0 老年、无工作、无房、信贷状况一般 不贷款 2,0,0,2,0 老年、无工作、无房、信贷状况非常好 不贷款
(二)模型评估 由于训练集样本较少,采用留一交叉验证法评估模型性能: 准确率:16/16 = 100%(训练集上) 泛化能力:决策树结构简单,逻辑符合金融贷款审批常识(有房或有工作是核心审批依据),泛化能力较强。
六、总结与拓展 (一)实战总结 本文基于信息增益与增益率构建决策树模型,完成了贷款预测任务。核心结论如下: 特性重要性:“有自己的房子” 是贷款审批的关键特性,其次是 “有工作”,符合实际金融场景逻辑。 决策树优势:模型结构直观、可解释性强,无需复杂数据预处理,适合快速落地应用。 模型局限性:样本量较小,可能存在过拟合风险;对连续特性处理能力较弱(需离散化)。
(二)拓展方向 优化特性:增加收入水平、负债情况等特性,提升模型预测准确性。 改进算法:使用 C4.5(基于增益率)、CART(基于 Gini 系数)算法构建决策树,对比不同算法性能。 集成学习:结合随机森林、梯度提升树等集成算法,进一步提升模型泛化能力。 可视化工具:使用 Graphviz 绘制决策树可视化图,更直观地展示决策逻辑。
七、代码附录(Python 实现) 数值稳定性处理 对数计算时添加极小值防止零输入:
from math import log2
def safe_log2(x):
return log2(x + 1e-10)
特性重要性分析
可扩展为输出特性重要性排序:
def feature_importance(X, y, feature_names):
importance = []
for i, name in enumerate(feature_names):
gain, _ = calc_gain_ratio(X, y, i)
importance.append((name, gain))
return sorted(importance, key=lambda x: -x[1])
剪枝处理
添加预剪枝机制防止过拟合:
def should_prune(y, min_samples_leaf=3):
return len(y) < min_samples_leaf

雷达卡


京公网安备 11010802022788号







