共计 1842 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在信贷风控领域,传统逻辑回归模型虽然简单易于解释,但在实际应用中存在两个明显局限:

- 非线性特征捕捉不足 :信贷数据中往往存在大量非线性关系(如年龄与违约率的 U 型曲线),逻辑回归需要手动构造交互项和分箱处理,既耗时又容易遗漏重要模式
- 可解释性受限 :当特征工程复杂化后,模型的实际决策逻辑变得模糊,难以满足金融监管的透明性要求
技术对比
决策树家族中主要有三种算法适用于风控场景:
- ID3/C4.5:使用信息增益划分,但
- 倾向于选择取值多的特征
- 只能处理离散特征
- 计算复杂度较高
- 随机森林 :虽然预测精度高,但
- 黑箱特性明显
- 实时预测效率低
- CART:我们的选择因为
- 支持连续值和缺失值处理
- 基尼系数计算效率高
- 二叉树结构部署友好
核心实现
1. 数据准备
# 加载德国信贷数据集示例
from sklearn.datasets import fetch_openml
credit = fetch_openml('credit-g', as_frame=True)
df = pd.DataFrame(credit.data, columns=credit.feature_names)
df['target'] = credit.target.map({'good':0, 'bad':1}) # 坏账标记
2. 基尼系数分裂实现
# 计算基尼不纯度
def gini_impurity(y):
p = np.mean(y)
return 1 - p**2 - (1-p)**2
# 特征分裂示例(以 age 特征为例)for split_point in range(20, 60, 5):
left_mask = df['age'] <= split_point
gini_left = gini_impurity(df[left_mask]['target'])
gini_right = gini_impurity(df[~left_mask]['target'])
weighted_gini = (sum(left_mask)*gini_left + sum(~left_mask)*gini_right)/len(df)
print(f'分割点 {split_point}: {weighted_gini:.4f}')
3. 参数调优
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth': [3, 5, 7],
'min_samples_leaf': [10, 30, 50]
}
grid_search = GridSearchCV(DecisionTreeClassifier(criterion='gini'),
param_grid,
scoring='roc_auc',
cv=5
)
grid_search.fit(X_train, y_train)
print(f'最佳参数:{grid_search.best_params_}')
4. SHAP 解释
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
生产考量
类别不平衡处理方案对比
- SMOTE 过采样
- 优点:保留所有样本信息
- 缺点:可能引入噪声
- 随机欠采样
- 优点:训练效率高
- 缺点:损失有用信息
- class_weight 参数
- 优点:无需修改数据
- 缺点:对极端不平衡效果有限
模型监控指标
- PSI(群体稳定性指数):检测特征分布变化
- KL 散度 :监控预测结果分布漂移
- 建议每周计算并与基线对比
避坑指南
- 过拟合陷阱
- 现象:训练集 AUC 0.99,测试集 0.65
-
解法:设置 min_samples_leaf≥50
-
忽略特征重要性
- 现象:模型使用无关特征
-
解法:强制 top10 特征入模
-
类别编码错误
- 现象:ordinal 特征被 one-hot
-
解法:对有序变量用 LabelEncoder
-
未监控数据漂移
- 现象:线上效果持续下降
-
解法:建立 PSI 日报机制
-
解释性不足
- 现象:无法回答拒贷原因
- 解法:保存决策路径样本
思考题
- 当树深度达到 15 层时,如何在不重训练的情况下将其压缩到 5 层以内?
- 对于百万级样本的实时信贷审批,怎样优化 CART 的预测速度?
实践证明,在德国信贷数据集上优化后的 CART 模型可使 AUC 达到 0.81,相比逻辑回归提升 12%。关键是要平衡好模型复杂度和业务解释性,这个平衡点需要根据具体场景反复调试。
正文完
