共计 2464 个字符,预计需要花费 7 分钟才能阅读完成。
信贷风险预测中的 CART 决策树实践
背景与行业痛点
在传统信贷风险评估中,逻辑回归曾是主流方法,但它存在明显的局限性:

- 线性假设限制:逻辑回归要求特征与目标变量间存在线性关系,而实际信贷数据中常存在非线性关联
- 特征交互依赖:需要人工构造交叉特征,难以自动捕捉复杂模式
- 阈值敏感:对异常值和数据分布变化较为敏感
技术选型对比
CART 决策树优势
- 可解释性强 :决策路径可直接对应业务规则
- 自动特征选择 :通过基尼系数 / 信息增益自动筛选重要特征
- 非线性处理 :天然支持离散和连续特征的混合处理
与其他算法对比
| 算法 | 训练速度 | 可解释性 | 抗过拟合 | 适用场景 |
|---|---|---|---|---|
| CART | 快 | ★★★★★ | ★★☆ | 小规模数据,需强解释性 |
| 随机森林 | 中等 | ★★☆ | ★★★★ | 中等规模,精度优先 |
| XGBoost | 慢 | ★★★☆ | ★★★★★ | 大规模数据,竞赛场景 |
核心实现流程
数据预处理
# 加载信贷数据集示例
import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('credit_data.csv')
# 缺失值处理
data['income'] = data['income'].fillna(data['income'].median())
# 异常值处理
Q1 = data['debt_ratio'].quantile(0.25)
Q3 = data['debt_ratio'].quantile(0.75)
data = data[(data['debt_ratio'] >= Q1-1.5*(Q3-Q1)) &
(data['debt_ratio'] <= Q3+1.5*(Q3-Q1))]
# 特征分箱与 WOE 编码
from sklearn.preprocessing import KBinsDiscretizer
bins = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile')
data['income_bin'] = bins.fit_transform(data[['income']])
# 计算 WOE 值
def calc_woe(df, feature, target):
# 实现略...
return woe_values
# 划分数据集
X = data.drop('default', axis=1)
y = data['default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y)
模型构建与调优
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
# 基础模型
dtree = DecisionTreeClassifier(criterion='gini',
max_depth=5,
min_samples_leaf=100)
# 重要参数说明:# max_depth - 控制树的最大深度
# min_samples_leaf - 叶节点最小样本数
# ccp_alpha - 代价复杂度剪枝参数
dtree.fit(X_train, y_train)
# 评估
print(classification_report(y_test, dtree.predict(X_test)))
# 剪枝优化 - 通过交叉验证选择最优 ccp_alpha
path = dtree.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas = path.ccp_alphas
# 可视化决策树
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plot_tree(dtree, feature_names=X.columns,
class_names=['Good','Bad'],
filled=True, rounded=True)
plt.show()
生产环境关键考量
类别不平衡处理
- 样本加权 :
class_weight = {0:1, 1:3} # 坏样本权重设为 3 倍 - 过采样 SMOTE:
from imblearn.over_sampling import SMOTE sm = SMOTE() X_res, y_res = sm.fit_resample(X_train, y_train) - 阈值调整 :通过 ROC 曲线选择最佳分类阈值
特征泄露预防
- 严格分离特征工程与模型训练的数据流
- 在交叉验证中完整重现预处理流程
- 使用 Pipeline 封装处理步骤:
from sklearn.pipeline import Pipeline pipe = Pipeline([('imputer', SimpleImputer()), ('scaler', StandardScaler()), ('model', DecisionTreeClassifier()) ])
部署与监控
-
特征一致性校验 :
# 保存训练时的特征统计量 train_stats = X_train.describe().to_dict() # 部署时校验 def validate_input(input_df): for col in expected_columns: if input_df[col].max() > train_stats[col]['max'] * 1.5: raise ValueError(f"异常特征值: {col}") -
模型退化监测 :定期计算 PSI(群体稳定性指标)
延伸思考
如何将决策树输出与业务规则引擎结合?考虑:
- 将决策路径转化为 SQL/ 规则引擎可执行的 DSL
- 设置多级风险阈值(预警 / 审核 / 拒绝)
- 动态调整策略权重(如经济周期变化时)
通过本文介绍的 CART 决策树方案,我们既能获得媲美复杂模型的预测性能,又能保持业务可解释性——这在金融风控领域至关重要。建议读者尝试将模型输出与现有业务系统集成,实现真正的决策智能化。
正文完
