共计 2512 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
信贷风险预测是金融机构核心业务之一,直接关系到贷款违约率和资金安全。传统人工审核效率低且主观性强,而机器学习能自动发现数据中的风险模式。但新手常面临三大挑战:

- 数据维度多:收入、负债、历史信用等数十项特征需要有效整合
- 样本不均衡:违约样本通常不足 5%,导致模型偏向多数类
- 可解释性要求:监管要求必须能解释拒贷原因
技术选型对比
- 逻辑回归:
- 优势:计算简单,输出概率直观
-
局限:难以捕捉非线性关系,对特征工程依赖强
-
随机森林:
- 优势:自动特征选择,抗过拟合能力强
-
局限:模型复杂度高,可解释性较差
-
CART 决策树:
- 核心优势:
- 可视化决策路径(符合监管要求)
- 自动处理混合类型特征
- 对数据分布假设较少
- 典型应用场景:
- 需要白盒模型的金融场景
- 中等规模数据集(万级样本)
实现步骤详解
数据预处理
模拟一份包含 10000 条记录的信贷数据集:
import pandas as pd
import numpy as np
# 模拟特征:年龄、收入、负债比、信用分、逾期次数
np.random.seed(42)
data = pd.DataFrame({'age': np.random.randint(18, 70, 10000),
'income': np.random.lognormal(mean=10, sigma=0.5, size=10000),
'debt_ratio': np.random.beta(a=2, b=5, size=10000),
'credit_score': np.random.normal(loc=650, scale=100, size=10000),
'delinquencies': np.random.poisson(lam=0.5, size=10000)
})
# 生成标签:违约概率 =1/(1+e^-(0.1* 年龄 -0.5* 负债比 -0.01* 信用分))
data['default'] = 1 / (1 + np.exp(-(0.1 * data['age'] -
0.5 * data['debt_ratio'] -
0.01 * (data['credit_score'] - 650)
))) > 0.3 # 阈值设为 30%
关键处理步骤:
-
缺失值处理:
# 用中位数填充数值特征 data.fillna(data.median(), inplace=True) -
特征分箱:
# 将连续年龄离散化为 5 个区间 data['age_group'] = pd.cut(data['age'], bins=5, labels=False) -
数据标准化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data[['income', 'credit_score']] = scaler.fit_transform(data[['income', 'credit_score']])
模型训练
使用 scikit-learn 实现:
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
# 划分特征和标签
X = data.drop('default', axis=1)
y = data['default']
# 按 7:3 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
# 初始化决策树(限制最大深度防止过拟合)clf = DecisionTreeClassifier(
max_depth=4,
min_samples_leaf=50,
criterion='gini',
random_state=42
)
# 训练模型
clf.fit(X_train, y_train)
模型评估
选择适合不均衡数据的指标:
from sklearn.metrics import classification_report
# 预测测试集
y_pred = clf.predict(X_test)
# 输出评估报告
print(classification_report(y_test, y_pred, target_names=['正常', '违约']))
# 输出特征重要性
print("特征重要性:")
for name, importance in zip(X.columns, clf.feature_importances_):
print(f"{name}: {importance:.2f}")
性能优化技巧
- 过拟合防范:
- 设置
max_depth参数(通常 3 - 6 层) - 增加
min_samples_split(建议≥50) -
使用剪枝参数
ccp_alpha -
处理样本不均衡:
# 调整类别权重 clf = DecisionTreeClassifier(class_weight={0:1, 1:5}) -
特征组合:
- 创建交叉特征如
负债比 / 收入 - 对连续特征做分箱处理
避坑指南
- 陷阱 1 :直接使用原始特征
-
解决:对收入等长尾分布取对数
-
陷阱 2 :忽略特征相关性
-
解决:计算相关系数矩阵,移除相关系数 >0.8 的特征
-
陷阱 3 :使用准确率评估不均衡数据
- 解决:优先看召回率(Recall)和 AUC-ROC
实践建议
- 尝试不同的分裂标准(gini vs entropy)
- 用 GridSearchCV 搜索最优参数组合
- 可视化决策树辅助业务解释:
from sklearn.tree import plot_tree import matplotlib.pyplot as plt plt.figure(figsize=(12,8)) plot_tree(clf, feature_names=X.columns, class_names=['正常','违约'], filled=True) plt.show()
思考延伸
- 当出现新特征(如社交媒体数据)时,如何调整模型结构?
- 对于不同地区的借款人,是否需要训练独立模型?
- 如何将模型预测结果转化为可执行的信贷策略?
通过这个实战流程,你应该已经掌握了 CART 决策树在信贷风控中的核心应用方法。建议从本文的模拟数据出发,逐步替换真实业务数据,观察模型表现的变化。
正文完
