共计 1595 个字符,预计需要花费 4 分钟才能阅读完成。
基础概念对比
决策树家族中,ID3/C4.5 与 CART 的核心差异体现在分裂准则上:

-
ID3/C4.5:采用信息增益(Information Gain)或增益比,基于信息熵理论:
$$IG(D_p,f) = I(D_p) – \sum_{j=1}^{m} \frac{N_j}{N_p}I(D_j)$$
其中 $I(D)$ 计算当前节点的熵值:
$$I(D) = -\sum_{i=1}^{c} p(i|D)\log_2 p(i|D)$$ -
CART:使用基尼系数(Gini Index)作为不纯度度量:
$$Gini(D) = 1 – \sum_{i=1}^{c} [p(i|D)]^2$$
分裂时选择使基尼系数下降最大的特征
代码实战演示
基础调用对比
from sklearn.tree import DecisionTreeClassifier
# ID3/C4.5 风格(需设置 criterion='entropy')dtree_entropy = DecisionTreeClassifier(
criterion='entropy', # 使用信息增益
max_depth=3
)
# CART 风格(默认参数)dtree_gini = DecisionTreeClassifier(
criterion='gini', # 使用基尼系数
max_depth=3
)
参数影响可视化
import matplotlib.pyplot as plt
depths = range(1, 11)
acc_entropy = []
acc_gini = []
for d in depths:
# 训练两种模型
clf_entropy = DecisionTreeClassifier(criterion='entropy', max_depth=d).fit(X_train, y_train)
clf_gini = DecisionTreeClassifier(criterion='gini', max_depth=d).fit(X_train, y_train)
# 记录准确率
acc_entropy.append(clf_entropy.score(X_test, y_test))
acc_gini.append(clf_gini.score(X_test, y_test))
# 绘制对比曲线
plt.plot(depths, acc_entropy, label='Entropy')
plt.plot(depths, acc_gini, label='Gini')
plt.xlabel('Max Depth')
plt.ylabel('Accuracy')
plt.legend()
生产环境关键考量
- 连续特征处理
- CART 采用二分法处理连续特征(寻找最佳分割点)
-
ID3/C4.5 需要对连续特征离散化后才能使用
-
过拟合解决方案
- 预剪枝(Pre-pruning):通过 max_depth/min_samples_leaf 等参数控制
- 后剪枝(Post-pruning):CART 独有的代价复杂度剪枝(CCP)
# CCP 剪枝示例 path = dtree_gini.cost_complexity_pruning_path(X_train, y_train) ccp_alphas = path.ccp_alphas
常见陷阱警示
- 类别不平衡问题
- 基尼系数更易受多数类影响
-
解决方案:使用 class_weight 参数或采样策略
-
高基数类别特征
- 信息增益会偏好取值多的特征
-
建议:采用增益比(C4.5)或 One-Hot 编码
-
内存消耗误区
- CART 生成的二叉树比 ID3 的多叉树更节省内存
- 深度相同时,CART 的节点数更少
开放性问题
- 为什么 XGBoost/LightGBM 等现代工具都采用 CART 作为基学习器?
- 在特征维度极高(>10k)的场景下,哪种分裂准则计算效率更高?
- 如何证明基尼系数与交叉熵在数学上的等价性边界条件?
(完整代码示例需配合具体数据集使用,建议读者尝试在 sklearn 的 iris 或 wine 数据集上复现上述实验)
正文完
