共计 1310 个字符,预计需要花费 4 分钟才能阅读完成。
业务场景与算法选择
决策树算法在机器学习领域的应用非常广泛,这里我们通过两个典型场景说明其适用性:

- 金融风控 :在贷款审批场景中,决策树可以直观地展示 ” 收入 >5 万且负债比 <30%” 等规则路径,比黑盒模型更易通过合规审查
- 推荐系统 :电商平台常用决策树处理 ” 用户历史点击 >10 次 && 商品类目匹配 ” 等分层规则,实现可解释的推荐逻辑
算法对比与数学原理
核心差异对比
- ID3/C4.5:
- 使用信息增益(熵减)作为分裂标准
- 仅支持分类任务
-
对取值多的特征有偏好
-
CART:
- 采用 Gini 系数作为分裂标准
- 同时支持分类和回归
- 默认生成二叉树结构
Gini 系数推导
Gini 系数计算公式为:
$$
Gini(D) = 1 – \sum_{k=1}^K p_k^2
$$
其中 $p_k$ 是第 $k$ 类样本在数据集 $D$ 中的比例。分裂后的 Gini 指数为:
$$
Gini_{split} = \sum_{i=1}^n \frac{|D_i|}{|D|} Gini(D_i)
$$
以二分类问题为例,当正负样本比例相同时(各 50%),Gini 系数达到最大值 0.5。
Python 实现详解
基础实现
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
# 加载数据集
data = load_breast_cancer()
X, y = data.data, data.target
# 模型训练(关键参数说明)model = DecisionTreeClassifier(
criterion='gini', # 使用 Gini 系数
max_depth=3, # 预剪枝:限制树深度
min_samples_split=10 # 节点最少样本数
)
model.fit(X, y)
特征重要性分析
import matplotlib.pyplot as plt
# 获取特征重要性
importance = model.feature_importances_
# 可视化
plt.barh(range(len(importance)), importance, align='center')
plt.yticks(range(len(importance)), data.feature_names)
plt.xlabel('Feature Importance')
plt.show()
性能优化实践
剪枝策略对比
| 方法 | 准确率 | 训练时间 (ms) | 树深度 |
|---|---|---|---|
| 无剪枝 | 0.93 | 120 | 12 |
| 预剪枝 | 0.91 | 85 | 5 |
| 后剪枝 (CCP) | 0.92 | 110 | 7 |
类别不平衡处理
# 代价敏感学习方案
model = DecisionTreeClassifier(class_weight={0: 1, 1: 3}, # 负样本权重 1,正样本权重 3
min_samples_leaf=20
)
避坑指南
- 高基数类别特征 :
- 对取值超过 20 个的类别特征建议做分箱处理
-
或改用目标编码(Target Encoding)
-
与随机森林的协同 :
- 先单棵决策树分析特征重要性
- 再用随机森林进行最终建模
- 两者特征重要性结果相互验证
开放性问题
在深度学习中可以借鉴:
1. 决策树的特征选择机制用于网络剪枝
2. 树结构的层级特征组合思路用于设计网络结构
3. Gini 系数思想改进注意力权重计算
正文完
