共计 1629 个字符,预计需要花费 5 分钟才能阅读完成。
在金融风控场景中,CART 决策树能直观展示规则逻辑,帮助风控专家理解模型拒绝原因;医疗诊断领域则依赖其可解释性辅助医生定位关键病理特征;工业界更看重它无需特征缩放、天然处理混合类型数据的优势。

一、痛点分析与数据准备
1. 特征工程常见陷阱
- 缺失值简单填充均值会导致分布偏移,建议用
SimpleImputer(strategy='median')+ 标记缺失状态 - 类别型特征直接输入会引发
ValueError,必须通过OrdinalEncoder或独热编码处理 - 数据泄漏问题:所有预处理步骤都应封装到
Pipeline中,避免交叉验证时污染训练集
2. 样本不平衡解决方案
from sklearn.utils import class_weight
classes = np.unique(y_train)
weights = class_weight.compute_class_weight('balanced', classes=classes, y=y_train)
model = DecisionTreeClassifier(class_weight=dict(zip(classes, weights)))
二、核心实现流程
1. 基础模型构建
# 完整 Pipeline 示例
from sklearn.pipeline import make_pipeline
preprocessor = ColumnTransformer(
transformers=[('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(), categorical_features)
])
pipeline = make_pipeline(
preprocessor,
DecisionTreeClassifier(criterion='gini', random_state=42)
)
2. 分裂准则对比实验
| 评估指标 | 基尼系数 | 信息增益 |
|---|---|---|
| 训练集准确率 | 0.92 | 0.91 |
| 测试集 F1-score | 0.88 | 0.87 |
3. 超参数调优实战
from sklearn.model_selection import GridSearchCV
param_grid = {'decisiontreeclassifier__max_depth': [3, 5, 7, None],
'decisiontreeclassifier__min_samples_split': [2, 5, 10]
}
gs = GridSearchCV(pipeline, param_grid, cv=5, scoring='roc_auc')
gs.fit(X_train, y_train)
三、模型诊断与优化
1. 可视化决策路径
# 需先安装 graphviz
conda install python-graphviz
from sklearn.tree import export_graphviz
export_graphviz(
model,
out_file='tree.dot',
feature_names=feature_names,
class_names=True,
rounded=True
)
2. 关键评估图表
- ROC 曲线:关注测试集与训练集曲线间距,判断过拟合
- 特征重要性:警惕高频类别特征虚假高权重
四、生产环境注意事项
- 线程安全:在 Flask/Django 中应每个请求新建模型实例
- 内存控制:通过
max_leaf_nodes限制树复杂度 - 版本兼容:pickle 序列化时注意 Python 版本一致性
五、延伸思考
当特征维度超过 1000 时:
– CART 的计算复杂度呈线性增长,可能遭遇 ” 维度诅咒 ”
– 随机森林的随机特征子集选择机制更具优势
– 建议进行特征筛选后再比较两者性能
完整代码示例已上传 Github(伪链接):https://github.com/example/cart-demo
最后抛个问题给大家:如果某个业务场景既需要模型可解释性,又存在大量高阶特征交互,你会如何改进基础 CART 模型?欢迎评论区讨论~
正文完
