共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。
算法原理
决策树是机器学习中最直观的算法之一,它通过一系列判断条件对数据进行分类或回归。C4.5 和 CART 是两种最常用的决策树算法,它们在核心原理上有显著差异。

C4.5 算法
C4.5 算法使用信息增益比来选择最佳分裂特征。信息增益比是对信息增益的改进,解决了信息增益偏向选择取值较多的特征的问题。
- 信息熵 :衡量数据的不确定性,计算公式为:H(D) = -Σ(p_i * log2(p_i))
- 信息增益 :特征 A 对数据集 D 的信息增益 g(D,A)=H(D)-H(D|A)
- 信息增益比 :信息增益与特征固有值的比值,g_R(D,A)=g(D,A)/H_A(D)
CART 算法
CART(Classification and Regression Tree) 算法可以用于分类和回归任务。它使用基尼系数来选择最佳分裂特征。
- 基尼系数 :衡量数据的不纯度,Gini(D) = 1 – Σ(p_i^2)
- 基尼指数 :特征 A 的基尼指数 Gini_index(D,A) = Σ(|D_v|/|D|)*Gini(D_v)
代码实现
C4.5 算法实现关键代码
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 使用信息增益比 (criterion='entropy')
clf_c45 = DecisionTreeClassifier(criterion='entropy', max_depth=3)
iris = load_iris()
clf_c45.fit(iris.data, iris.target)
# 可视化决策树
from sklearn.tree import export_graphviz
import graphviz
dot_data = export_graphviz(clf_c45, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris_c45") # 保存为 PDF 文件
CART 算法实现关键代码
# 使用基尼系数 (criterion='gini')
clf_cart = DecisionTreeClassifier(criterion='gini', max_depth=3)
clf_cart.fit(iris.data, iris.target)
# 可视化决策树
dot_data = export_graphviz(clf_cart, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris_cart")
效果对比
在 Iris 数据集上对比两种算法的表现:
- 分类准确率 :两种算法在 Iris 数据集上的准确率通常非常接近,都在 95% 左右
- 树的结构 :C4.5 生成的树通常更深一些,因为它对连续值特征有更好的处理方式
- 训练速度 :CART 通常比 C4.5 训练速度更快,因为基尼系数的计算比信息增益比简单
处理方式差异
连续值处理
- C4.5:将连续属性离散化,通过信息增益比选择最佳分割点
- CART:使用二分法处理连续特征,选择使基尼指数最小的分割点
缺失值处理
- C4.5:可以处理缺失值,通过概率权重分配样本
- CART:默认不支持缺失值,需要预先处理
调优建议
决策树的调优主要考虑以下几个方面:
- 预剪枝策略
- 限制树的最大深度 (max_depth)
- 设置叶子节点最少样本数 (min_samples_leaf)
-
设置分裂节点最少样本数 (min_samples_split)
-
后剪枝策略
- 代价复杂度剪枝 (ccp_alpha 参数)
- 减少错误剪枝 (REP)
-
悲观错误剪枝 (PEP)
-
其他参数
- 最大特征数 (max_features)
- 最小不纯度减少 (min_impurity_decrease)
性能表现
在不同规模数据集上的表现:
- 小数据集 :C4.5 通常表现更好,因为它对特征选择更精细
- 大数据集 :CART 更有优势,计算效率更高
- 高维数据 :CART 通常表现更好,因为它对噪声特征更鲁棒
思考题
当特征维度很高时,哪种算法更适合?为什么?
答案是 CART 算法更合适。原因如下:
1. CART 使用基尼系数计算量更小,适合高维数据
2. CART 对噪声特征更鲁棒
3. CART 生成的树通常更平衡,泛化能力更强
在实际应用中,建议先尝试 CART 算法,如果效果不理想再考虑 C4.5。对于特别高维的数据,还可以考虑随机森林等基于决策树的集成方法。
正文完
