共计 1616 个字符,预计需要花费 5 分钟才能阅读完成。
算法原理
决策树是机器学习中最直观的算法之一,它通过一系列规则对数据进行分类或回归。C4.5 和 CART 是两种最常用的决策树算法,它们的核心差异在于如何选择最优划分特征。

- C4.5 算法:
- 使用信息增益比来选择划分特征,克服了 ID3 算法中信息增益偏向选择取值较多的特征的问题。
- 信息增益比是信息增益与特征固有值的比值,可以理解为对信息增益的标准化。
- 支持多叉树,即一个特征可以有多个分支。
-
能够处理连续值和缺失值。
-
CART 算法:
- 使用基尼系数来选择划分特征,基尼系数表示数据的不纯度,值越小表示数据越纯。
- 基尼系数的计算比信息熵简单,因此 CART 算法通常更快。
- 只支持二叉树,即每次划分只能生成两个分支。
- 同样支持连续值和缺失值处理。
代码实现
以下是使用 Python 实现 C4.5 和 CART 算法的关键代码片段。
C4.5 算法实现
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 使用 C4.5 算法(sklearn 中的决策树默认使用 CART,但可以设置 criterion='entropy' 来模拟 C4.5)clf_c45 = DecisionTreeClassifier(criterion='entropy')
clf_c45.fit(X, y)
# 可视化决策树
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8))
plot_tree(clf_c45, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
CART 算法实现
# 使用 CART 算法(默认 criterion='gini')clf_cart = DecisionTreeClassifier(criterion='gini')
clf_cart.fit(X, y)
# 可视化决策树
plt.figure(figsize=(12, 8))
plot_tree(clf_cart, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
效果对比
在 Iris 数据集上,我们对比两种算法的分类效果:
- 分类准确率:
- C4.5 和 CART 在 Iris 数据集上的表现通常非常接近,因为数据集本身比较简单。
-
可以通过交叉验证来更准确地评估两种算法的性能。
-
决策树结构:
- C4.5 生成的树可能会更深,因为它倾向于选择信息增益比高的特征。
-
CART 生成的树通常更宽,因为它是二叉树结构。
-
运行速度:
- CART 通常比 C4.5 更快,因为基尼系数的计算比信息熵简单。
调优建议
决策树容易过拟合,因此调优非常重要:
- 预剪枝:
- 限制树的最大深度(max_depth)。
- 设置叶子节点的最小样本数(min_samples_leaf)。
-
设置分裂节点的最小样本数(min_samples_split)。
-
后剪枝:
- 通过代价复杂度剪枝(CCP)来修剪决策树。
-
可以使用 sklearn 的
cost_complexity_pruning_path方法。 -
处理连续值和缺失值:
- C4.5 和 CART 都能自动处理连续值(通过寻找最佳分割点)。
- 缺失值可以通过 surrogate splits(替代分裂)来处理。
思考题
当特征维度很高时,哪种算法更适合?为什么?
- CART 算法 可能更适合,因为它的计算效率更高,尤其是在高维数据下。
- C4.5 算法在特征维度很高时可能会变得很慢,因为它需要计算信息增益比,而高维数据中可能存在大量无关特征。
- 不过,实际选择还需要考虑数据的特性和具体应用场景。
正文完
