共计 1825 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:CART 决策树的工业落地难题
在信贷风控和用户分群等业务场景中,我们经常遇到两个典型问题:

- 过拟合陷阱:训练集准确率 95% 的模型,上线后效果断崖式下跌。某次用户分层项目中,未剪枝的决策树在测试集 KS 值比训练集低 22 个百分点
- 特征失真:某个性别特征因样本分布不均,在 Gini 系数计算中反而比收入特征更重要,与业务认知严重冲突
技术方案:从理论到工程实现
1. 算法选型:为什么选择 CART 而非 ID3/C4.5
- ID3 局限:仅支持离散特征且对取值多的特征有偏好
- C4.5 改进:引入信息增益率但仍需处理连续特征离散化
- CART 优势:
- 二叉树结构更适合工业场景
- 同时支持回归 (Gini/MSE) 和分类任务
- 计算效率高于信息熵
2. 核心公式:Gini 系数的业务解释
def gini_impurity(y):
p = np.bincount(y) / len(y)
return 1 - np.sum(p**2) # 1-Σ(p_i)^2
- 当类别均匀分布时 Gini 值最大(0.5)
- 相比信息熵计算量减少 40%(实测)
3. 剪枝策略:代价复杂度剪枝实战
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(
ccp_alpha=0.02, # 通过 GridSearchCV 确定
min_samples_leaf=50, # 建议≥样本量的 1%
max_depth=5
)
完整代码示例
数据预处理关键步骤
# 连续特征分箱(以年龄为例)df['age_bin'] = pd.cut(df['age'],
bins=[0,18,30,45,60,100],
labels=False)
# WOE 编码提升可解释性
def woe_encode(df, feature, target):
woe_dict = {}
for category in df[feature].unique():
good = df[(df[feature]==category)&(df[target]==1)].count()
bad = df[(df[feature]==category)&(df[target]==0)].count()
woe = np.log((good/total_good)/(bad/total_bad))
woe_dict[category] = woe
return df[feature].map(woe_dict)
模型训练与可视化
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(15,10))
plot_tree(clf,
feature_names=X.columns,
class_names=['Bad','Good'],
filled=True,
rounded=True)
plt.show()
生产环境优化建议
- 类别不平衡处理:
- 设置
class_weight='balanced' -
或手动指定权重
{0:1, 1:5} -
树结构控制:
- 深度建议 3 - 5 层(平衡可解释性)
-
min_samples_split至少 50 -
特征工程:
- 高基数类别特征先做 Target Encoding
- 连续特征必须分箱
效果验证方法论
SHAP 值分析
import shap
explainer = shap.TreeExplainer(clf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
指标对比
| 剪枝策略 | 训练集 AUC | 测试集 AUC | KS 值 |
|---|---|---|---|
| 未剪枝 | 0.92 | 0.78 | 0.45 |
| CCP 剪枝 | 0.86 | 0.83 | 0.52 |
延伸思考
尝试用 Graphviz 生成决策路径图:
from sklearn.tree import export_graphviz
import graphviz
dot_data = export_graphviz(clf, out_file=None,
feature_names=features,
class_names=target_names,
filled=True)
graph = graphviz.Source(dot_data)
graph.render("decision_tree")
这个可视化方案特别适合需要向业务部门解释模型的场景,能清晰展示关键决策节点。建议进一步结合 LIME 方法对单个样本的预测结果进行解释,构建完整的模型可解释性体系。
正文完
