CART决策树实战:从原理到工业级应用避坑指南

1次阅读
没有评论

共计 1825 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点:CART 决策树的工业落地难题

在信贷风控和用户分群等业务场景中,我们经常遇到两个典型问题:

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()

生产环境优化建议

  1. 类别不平衡处理
  2. 设置class_weight='balanced'
  3. 或手动指定权重{0:1, 1:5}

  4. 树结构控制

  5. 深度建议 3 - 5 层(平衡可解释性)
  6. min_samples_split至少 50

  7. 特征工程

  8. 高基数类别特征先做 Target Encoding
  9. 连续特征必须分箱

效果验证方法论

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 方法对单个样本的预测结果进行解释,构建完整的模型可解释性体系。

正文完
 0
评论(没有评论)