1. ID3 算法(Iterative Dichotomiser 3)
1.1 核心原理
- 发明时间:1986年由Ross Quinlan提出
- 基础思想:基于信息增益进行特征选择
- 适用问题:仅支持分类问题(离散特征)
1.2 关键公式
信息熵:
H
(
S
)
=
−
∑
i
=
1
c
p
i
log
2
p
i
H(S) = -\sum_{i=1}^c p_i \log_2 p_i
H(S)=−i=1∑cpilog2pi
其中
p
i
p_i
pi是类别
i
i
i在集合
S
S
S中的比例
信息增益:
I
G
(
S
,
A
)
=
H
(
S
)
−
∑
v
∈
V
a
l
u
e
s
(
A
)
∣
S
v
∣
∣
S
∣
H
(
S
v
)
IG(S,A) = H(S) - \sum_{v \in Values(A)} \frac{|S_v|}{|S|} H(S_v)
IG(S,A)=H(S)−v∈Values(A)∑∣S∣∣Sv∣H(Sv)
1.3 算法步骤
def ID3(data, target, features):
1. 如果所有样本属于同一类别,返回单节点树
2. 如果特征集为空,返回多数类节点
3. 计算所有特征的信息增益
4. 选择信息增益最大的特征A作为根节点
5. 对A的每个可能取值v:
a. 创建分支对应A=v的子集S_v
b. 如果S_v为空,添加叶子节点标记为多数类
c. 否则递归调用ID3(S_v, target, features-{A})
6. 返回决策树
1.4 优缺点
优点:
- 计算复杂度低(O(n×d))
- 生成的规则易于解释
缺点:
- 倾向选择取值多的特征
- 无法处理连续特征
- 无剪枝策略,容易过拟合
2. C4.5 算法(ID3的改进版)
2.1 核心改进
- 处理连续特征:通过阈值划分
- 缺失值处理:概率分布法
- 剪枝策略:悲观错误剪枝(PEP)
- 分裂标准:使用信息增益比
2.2 关键公式
分裂信息:
S
p
l
i
t
I
n
f
o
(
S
,
A
)
=
−
∑
v
∈
V
a
l
u
e
s
(
A
)
∣
S
v
∣
∣
S
∣
log
2
∣
S
v
∣
∣
S
∣
SplitInfo(S,A) = -\sum_{v \in Values(A)} \frac{|S_v|}{|S|} \log_2 \frac{|S_v|}{|S|}
SplitInfo(S,A)=−v∈Values(A)∑∣S∣∣Sv∣log2∣S∣∣Sv∣
信息增益比:
G
a
i
n
R
a
t
i
o
(
S
,
A
)
=
I
G
(
S
,
A
)
S
p
l
i
t
I
n
f
o
(
S
,
A
)
GainRatio(S,A) = \frac{IG(S,A)}{SplitInfo(S,A)}
GainRatio(S,A)=SplitInfo(S,A)IG(S,A)
2.3 连续特征处理
2.4 算法伪代码
def C4.5(data, target, features):
1. 如果样本纯度高或特征不足,创建叶节点
2. 对每个特征:
a. 如果是离散特征:计算信息增益比
b. 如果是连续特征:
i. 排序并计算候选划分点
ii. 选择最佳划分点
3. 选择最优特征/划分点
4. 递归构建子树
5. 后剪枝(PEP)
2.5 优缺点
优点:
- 克服ID3偏向多值特征的问题
- 支持连续特征和缺失值
- 通过剪枝降低过拟合
缺点:
- 需要多次扫描和排序数据
- 内存消耗较大
3. CART 算法(Classification and Regression Trees)
3.1 核心特性
- 二叉树结构:每个节点仅有两个分支
- 多功能性:支持分类和回归
- 分裂标准:
- 分类:基尼指数
- 回归:平方误差最小化
3.2 关键公式
基尼指数:
G
i
n
i
(
S
)
=
1
−
∑
i
=
1
c
p
i
2
Gini(S) = 1 - \sum_{i=1}^c p_i^2
Gini(S)=1−i=1∑cpi2
回归损失:
M
S
E
=
1
N
∑
(
y
i
−
y
^
)
2
MSE = \frac{1}{N} \sum (y_i - \hat{y})^2
MSE=N1∑(yi−y^)2
3.3 算法流程
def CART(data, target, features):
1. 对于每个特征A:
a. 如果是分类特征:
i. 计算所有可能二分划分
ii. 选择基尼指数最小的划分
b. 如果是连续特征:
i. 排序后计算候选划分点
ii. 选择最佳划分点
2. 选择最优划分
3. 递归构建左右子树
4. 代价复杂度剪枝
3.4 剪枝策略
代价复杂度剪枝:
R
α
(
T
)
=
R
(
T
)
+
α
∣
T
∣
R_\alpha(T) = R(T) + \alpha|T|
Rα(T)=R(T)+α∣T∣
其中:
- R ( T ) R(T) R(T):误分类误差
- ∣ T ∣ |T| ∣T∣:叶节点数
- α \alpha α:复杂度参数
3.5 优缺点
优点:
- 输出二叉树结构简单
- 计算效率高于C4.5
- 优秀的回归能力
缺点:
- 对类别不平衡敏感
- 小变化可能导致结构剧变
4. 三种算法对比
特性 | ID3 | C4.5 | CART |
---|---|---|---|
发明时间 | 1986 | 1993 | 1984 |
任务类型 | 分类 | 分类 | 分类/回归 |
树结构 | 多叉 | 多叉 | 二叉 |
分裂标准 | 信息增益 | 信息增益比 | 基尼指数/MSE |
连续特征 | 不支持 | 支持 | 支持 |
缺失值 | 不支持 | 支持 | 支持 |
剪枝 | 无 | 悲观剪枝 | 代价复杂度剪枝 |
计算效率 | 高 | 中 | 高 |
过拟合风险 | 高 | 中 | 低 |
5. 实际应用建议
-
选择场景:
- 小规模离散数据 → ID3
- 需要处理连续特征 → C4.5
- 需要回归或高效实现 → CART
-
参数调优:
# CART示例(sklearn) from sklearn.tree import DecisionTreeClassifier params = { 'max_depth': [3,5,7], 'min_samples_split': [2,5,10], 'criterion': ['gini','entropy'] }
-
可视化分析:
from sklearn.tree import plot_tree import matplotlib.pyplot as plt plt.figure(figsize=(20,10)) plot_tree(model, feature_names=features, class_names=target_names, filled=True) plt.show()
-
内存优化:
- 对于大数据集优先选择CART
- 使用
max_leaf_nodes
参数控制复杂度
三种算法构成了决策树发展的主线,现代集成方法(如随机森林、GBDT)大多基于CART实现。理解它们的区别有助于在不同场景选择合适的树模型。