共计 1636 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
决策树作为一种经典的分类算法,在工程实践中常常会遇到几个典型问题:

-
过拟合风险:决策树会不断分裂直到所有叶子节点纯度达到 100%,导致对训练数据过度拟合,泛化能力下降。
-
连续值处理困难:传统 ID3 算法只能处理离散特征,需要对连续值进行离散化预处理。
-
特征选择偏向:信息增益准则会偏好取值较多的特征,可能导致不合理的特征选择。
CART 决策树的数学原理
CART(Classification And Regression Trees)采用二叉树结构,与 ID3/C4.5 的主要差异在于:
- 分裂准则 :使用基尼系数(Gini Index) 代替信息增益
基尼系数计算公式:
$$Gini(D) = 1 – \sum_{k=1}^{K}p_k^2$$
其中 $p_k$ 是第 k 类样本在数据集 D 中的比例。
- 分裂终止条件:
- 节点样本数小于预设阈值
- 基尼系数下降小于阈值
-
达到最大树深
-
二叉树结构:每个节点只产生两个分支,简化模型结构。
Python 代码实现
基础模型构建
from sklearn.tree import DecisionTreeClassifier
# 初始化决策树模型
tree = DecisionTreeClassifier(
criterion='gini', # 使用基尼系数
max_depth=5, # 控制树的最大深度
min_samples_split=10, # 节点最少样本数
random_state=42
)
# 训练模型
tree.fit(X_train, y_train)
特征重要性分析
import pandas as pd
# 获取特征重要性
feature_importances = pd.DataFrame(
tree.feature_importances_,
index=X_train.columns,
columns=['importance']
).sort_values('importance', ascending=False)
# 可视化
feature_importances.plot(kind='barh')
决策树可视化
from sklearn.tree import export_graphviz
import graphviz
# 导出决策树图
dot_data = export_graphviz(
tree,
out_file=None,
feature_names=X_train.columns,
class_names=['Class0', 'Class1'],
filled=True,
rounded=True
)
# 显示图形
graph = graphviz.Source(dot_data)
graph.render('decision_tree') # 保存为 PDF
生产环境建议
类别不平衡处理
# 使用 class_weight 调整类别权重
tree = DecisionTreeClassifier(
class_weight='balanced', # 自动平衡类别权重
# 或手动指定:class_weight={0:1, 1:10}
)
高维特征优化
- 预处理时进行特征选择
- 设置
max_features参数限制每次分裂考虑的特征数 - 使用 PCA 降维后再训练
与随机森林配合
from sklearn.ensemble import RandomForestClassifier
# 使用随机森林提升泛化能力
rf = RandomForestClassifier(
n_estimators=100,
max_features='sqrt', # 每棵树考虑的特征数
oob_score=True # 使用袋外样本评估
)
实践建议总结
- 树深度控制:通过交叉验证选择最优 max_depth
- 剪枝策略 :结合预剪枝(min_samples_split) 和后剪枝(ccp_alpha)
- 特征工程:连续值离散化可能提升 CART 表现
- 模型解释:利用特征重要性指导业务决策
完整代码示例可在 [Colab 实践链接] 中获取。
通过合理配置参数和优化策略,CART 决策树可以成为既简单高效又具备良好解释性的分类工具,特别适合需要模型解释性的业务场景。
正文完
