决策树C4.5算法
目录
- 引言:C4.5是什么?
- 第一部分:C4.5与ID3的关系
- 第二部分:核心概念回顾
- 第三部分:特征熵与信息增益率
- 第四部分:C4.5算法原理
- 第五部分:完整实例演示
- 第六部分:决策树构建过程详解
- 第七部分:C4.5算法的优缺点
- 总结与回顾
引言:C4.5是什么?
ID3算法的问题
在ID3算法中,我们使用信息增益来选择最优特征。但是,信息增益存在一个严重的问题:
信息增益偏向问题: 信息增益倾向于选择取值较多的特征。
例子:
假设有一个特征"样本ID",每个样本的ID都不同。如果使用这个特征进行分裂:
- 每个子集只包含1个样本
- 每个子集的熵都是0(完全确定)
- 条件熵 = 0
- 信息增益 = 原始熵(最大值)
但显然,"样本ID"这个特征对分类没有任何帮助!它只是把每个样本分到不同的子集,并没有学到任何有用的模式。
C4.5算法的改进
C4.5算法是ID3算法的改进版本,由Ross Quinlan在1993年提出。主要改进包括:
- 使用信息增益率:解决信息增益偏向问题
- 处理连续特征:可以处理数值型特征
- 处理缺失值:可以处理数据中的缺失值
- 剪枝机制:防止过拟合
本文重点讲解C4.5的核心改进:信息增益率!
第一部分:C4.5与ID3的关系
1.1 ID3算法的回顾
ID3算法使用信息增益来选择特征:
$$
Gain(D, A) = H(D) - H(D|A)
$$
其中:
- $H(D)$:数据集的信息熵
- $H(D|A)$:条件熵
信息增益的问题:
- 当特征的取值数量很多时,信息增益会很大
- 但这不一定意味着该特征对分类有帮助
- 例如:样本ID、姓名等唯一标识符
1.2 C4.5算法的核心思想
C4.5算法使用信息增益率来选择特征:
$$
GainRatio(D, A) = \frac{Gain(D, A)}{IV(A)}
$$
其中:
- $Gain(D, A)$:信息增益
- $IV(A)$:特征熵(Intrinsic Value),也称为分裂信息(Split Information)
信息增益率的优势:
- 通过除以特征熵,惩罚取值较多的特征
- 特征熵越大,信息增益率越小
- 从而避免选择取值过多的特征
1.3 为什么需要特征熵?
特征熵衡量特征的"分裂程度":
- 特征熵 = 0:特征只有一个取值(所有样本相同)
- 特征熵 = 最大值:特征的每个取值均匀分布
- 特征熵越大:特征的取值越多,分布越均匀
信息增益率的直观理解:
- 信息增益:衡量特征对分类的帮助
- 特征熵:衡量特征的分裂程度
- 信息增益率 = 信息增益 / 特征熵
- 既要有帮助,又要避免过度分裂
第二部分:核心概念回顾
2.1 信息熵(Information Entropy)
信息熵:衡量随机变量的不确定性
$$
H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)
$$
在决策树中,信息熵衡量类别的混乱程度:
$$
H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}
$$
其中:
- $D$:数据集
- $C_k$:第 $k$ 个类别的样本集合
- $K$:类别数量
2.2 条件熵(Conditional Entropy)
条件熵:在已知特征 $A$ 的条件下,类别的不确定性
$$
H(D|A) = \sum_{v=1}^{V} \frac{|D_v|}{|D|} H(D_v)
$$
其中:
- $A$:特征
- $V$:特征 $A$ 的可能取值数量
- $D_v$:特征 $A$ 取值为 $v$ 的样本子集
2.3 信息增益(Information Gain)
信息增益:使用特征 $A$ 后,信息熵的减少量
$$
Gain(D, A) = H(D) - H(D|A)
$$
信息增益的性质:
- $Gain(D, A) \geq 0$
- 信息增益越大,特征对分类的帮助越大
- 但信息增益偏向取值较多的特征
第三部分:特征熵与信息增益率
3.1 特征熵的定义
特征熵(Intrinsic Value):衡量特征本身的分裂程度
$$
IV(A) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}
$$
其中:
- $A$:特征
- $V$:特征 $A$ 的可能取值数量
- $D_v$:特征 $A$ 取值为 $v$ 的样本子集
- $|D_v|$:子集 $D_v$ 的样本数量
- $|D|$:数据集 $D$ 的样本数量
注意: 特征熵的公式与信息熵类似,但衡量的是特征取值的分布,而不是类别的分布。
3.2 特征熵的直观理解
特征熵衡量特征的"分裂程度":
- 特征熵 = 0:特征只有一个取值,所有样本在该特征上相同
- 特征熵 = 最大值:特征的每个取值均匀分布
- 特征熵越大:特征的取值越多,分布越均匀
例子:
假设有14个样本,特征"天气"有3个取值:
| 天气取值 | 样本数量 | 比例 |
|---|---|---|
| 晴 | 5 | 5/14 |
| 阴 | 4 | 4/14 |
| 雨 | 5 | 5/14 |
特征熵:
$$
IV(天气) = -\frac{5}{14} \log_2\left(\frac{5}{14}\right) - \frac{4}{14} \log_2\left(\frac{4}{14}\right) - \frac{5}{14} \log_2\left(\frac{5}{14}\right)
$$
$$
IV(天气) \approx 1.577
$$
3.3 信息增益率的定义
信息增益率(Information Gain Ratio):信息增益除以特征熵
$$
GainRatio(D, A) = \frac{Gain(D, A)}{IV(A)}
$$
其中:
- $Gain(D, A)$:信息增益
- $IV(A)$:特征熵
信息增益率的性质:
- 当 $IV(A) = 0$ 时,$GainRatio(D, A)$ 未定义(需要特殊处理)
- 信息增益率 ≤ 信息增益(因为 $IV(A) \geq 0$)
- 信息增益率惩罚取值较多的特征
3.4 信息增益率的直观理解
信息增益率 = 信息增益 / 特征熵
为什么这样设计?
-
信息增益:衡量特征对分类的帮助
- 越大越好
- 但偏向取值较多的特征
-
特征熵:衡量特征的分裂程度
- 取值越多,特征熵越大
- 过度分裂不是好事
-
信息增益率:平衡两者
- 既要信息增益大(有帮助)
- 又要特征熵小(不过度分裂)
- 从而避免选择取值过多的特征
例子对比:
假设有两个特征:
- 特征A:信息增益 = 0.5,特征熵 = 0.5,信息增益率 = 1.0
- 特征B:信息增益 = 0.6,特征熵 = 1.5,信息增益率 = 0.4
虽然特征B的信息增益更大,但特征A的信息增益率更大。C4.5会选择特征A,因为它避免了过度分裂。
3.5 特征熵为0的情况
问题: 当特征只有一个取值时,$IV(A) = 0$,信息增益率未定义。
解决方案:
- 跳过该特征:如果特征的取值数量 < 2,不计算信息增益率
- 使用信息增益:如果所有特征的特征熵都为0,回退到使用信息增益
- 设置阈值:只考虑特征熵大于某个阈值的特征
在C4.5算法中:
- 通常要求特征的取值数量 ≥ 2
- 如果特征熵太小(接近0),可能回退到信息增益
3.6 信息增益率的计算步骤
步骤1: 计算数据集 $D$ 的信息熵 $H(D)$
步骤2: 对于每个特征 $A$:
- 计算特征 $A$ 的每个取值 $v$ 对应的子集 $D_v$
- 计算每个子集的信息熵 $H(D_v)$
- 计算条件熵:$H(D|A) = \sum_{v} \frac{|D_v|}{|D|} H(D_v)$
- 计算信息增益:$Gain(D, A) = H(D) - H(D|A)$
- 计算特征熵:$IV(A) = -\sum_{v} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}$
- 计算信息增益率:$GainRatio(D, A) = \frac{Gain(D, A)}{IV(A)}$
步骤3: 选择信息增益率最大的特征(如果特征熵太小,回退到信息增益)
第四部分:C4.5算法原理
4.1 C4.5算法的基本思想
C4.5算法采用自顶向下的贪心策略构建决策树:
- 从根节点开始,包含所有训练样本
- 选择最优特征:
- 计算每个特征的信息增益率
- 如果特征熵太小,回退到信息增益
- 选择信息增益率(或信息增益)最大的特征
- 分裂节点:根据选定的特征,将数据分成多个子集
- 递归构建:对每个子集递归执行步骤2-3
- 停止条件:
- 所有样本属于同一类别
- 没有剩余特征可用
- 信息增益率小于阈值
- 样本数量小于阈值
- 剪枝:构建完成后进行剪枝,防止过拟合
4.2 C4.5算法的伪代码
函数 C4.5(数据集D, 特征集A):
如果 D中所有样本属于同一类别:
返回 叶节点(类别)
如果 A为空 或 D中所有样本的特征值相同:
返回 叶节点(D中多数类)
如果 |D| < 最小样本数阈值:
返回 叶节点(D中多数类)
对于每个特征 a ∈ A:
如果 IV(a) < 阈值:
使用 Gain(D, a) # 回退到信息增益
否则:
使用 GainRatio(D, a) # 使用信息增益率
选择最优特征 a* = argmax(评分)
创建节点,标记为特征 a*
对于特征 a* 的每个取值 v:
创建分支,对应 D_v = {样本 | 样本的特征a* = v}
如果 D_v 为空:
添加叶节点(D中多数类)
否则:
递归调用 C4.5(D_v, A - {a*})
返回 节点
函数 剪枝(树T):
# 后剪枝:从叶节点向上,如果剪枝后性能不下降,则剪枝
# 这里简化处理,实际C4.5有复杂的剪枝策略
返回 剪枝后的树
4.3 C4.5算法的特点
相比ID3的改进:
- 信息增益率:解决信息增益偏向问题
- 连续特征处理:可以处理数值型特征(通过二分法)
- 缺失值处理:可以处理数据中的缺失值
- 剪枝机制:防止过拟合
仍然存在的问题:
- 计算复杂度:比ID3更复杂
- 多叉树:生成多叉树,可能不如二叉树简洁
- 对噪声敏感:虽然有所改善,但仍对噪声敏感
第五部分:完整实例演示
5.1 数据集描述
我们使用与ID3相同的天气预测是否打网球数据集,但这次使用C4.5算法:
| 样本ID | 天气 | 温度 | 湿度 | 风力 | 是否打网球 |
|---|---|---|---|---|---|
| 1 | 晴 | 高 | 高 | 弱 | 否 |
| 2 | 晴 | 高 | 高 | 强 | 否 |
| 3 | 阴 | 高 | 高 | 弱 | 是 |
| 4 | 雨 | 中 | 高 | 弱 | 是 |
| 5 | 雨 | 低 | 正常 | 弱 | 是 |
| 6 | 雨 | 低 | 正常 | 强 | 否 |
| 7 | 阴 | 低 | 正常 | 强 | 是 |
| 8 | 晴 | 中 | 高 | 弱 | 否 |
| 9 | 晴 | 低 | 正常 | 弱 | 是 |
| 10 | 雨 | 中 | 正常 | 弱 | 是 |
| 11 | 晴 | 中 | 正常 | 强 | 是 |
| 12 | 阴 | 中 | 高 | 强 | 是 |
| 13 | 阴 | 高 | 正常 | 弱 | 是 |
| 14 | 雨 | 中 | 高 | 强 | 否 |
数据集统计:
- 总样本数:14
- 特征:天气、温度、湿度、风力(4个特征)
- 类别:是否打网球(2个类别:是、否)
- "是"的数量:9
- "否"的数量:5
5.2 第一步:计算根节点的信息熵
数据集 $D$ 的信息熵:
$$
P(是) = \frac{9}{14} = 0.643
$$
$$
P(否) = \frac{5}{14} = 0.357
$$
$$
H(D) = -P(是) \log_2 P(是) - P(否) \log_2 P(否)
$$
$$
H(D) = -0.643 \times \log_2(0.643) - 0.357 \times \log_2(0.357)
$$
$$
H(D) = -0.643 \times (-0.637) - 0.357 \times (-1.485)
$$
$$
H(D) = 0.410 + 0.530 = 0.940
$$
根节点信息熵:$H(D) = 0.940$
5.3 第二步:计算各特征的信息增益和特征熵
5.3.1 特征"天气"的计算
特征"天气"的取值: 晴、阴、雨
统计各取值下的样本分布:
| 天气 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 晴 | 1,2,8,9,11 | 2 | 3 | 5 |
| 阴 | 3,7,12,13 | 4 | 0 | 4 |
| 雨 | 4,5,6,10,14 | 3 | 2 | 5 |
计算条件熵:
对于"晴":
$$
H(D_{晴}) = -\frac{2}{5} \log_2\left(\frac{2}{5}\right) - \frac{3}{5} \log_2\left(\frac{3}{5}\right) = 0.971
$$
对于"阴":
$$
H(D_{阴}) = -\frac{4}{4} \log_2\left(\frac{4}{4}\right) - \frac{0}{4} \log_2\left(\frac{0}{4}\right) = 0
$$
对于"雨":
$$
H(D_{雨}) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) = 0.971
$$
计算条件熵:
$$
H(D|天气) = \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0 + \frac{5}{14} \times 0.971 = 0.694
$$
计算信息增益:
$$
Gain(D, 天气) = H(D) - H(D|天气) = 0.940 - 0.694 = 0.246
$$
计算特征熵:
$$
IV(天气) = -\frac{5}{14} \log_2\left(\frac{5}{14}\right) - \frac{4}{14} \log_2\left(\frac{4}{14}\right) - \frac{5}{14} \log_2\left(\frac{5}{14}\right)
$$
$$
IV(天气) = -0.357 \times (-1.485) - 0.286 \times (-1.807) - 0.357 \times (-1.485)
$$
$$
IV(天气) = 0.530 + 0.517 + 0.530 = 1.577
$$
计算信息增益率:
$$
GainRatio(D, 天气) = \frac{Gain(D, 天气)}{IV(天气)} = \frac{0.246}{1.577} = 0.156
$$
5.3.2 特征"温度"的计算
特征"温度"的取值: 高、中、低
统计各取值下的样本分布:
| 温度 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 高 | 1,2,3,13 | 2 | 2 | 4 |
| 中 | 4,8,10,11,14 | 3 | 2 | 5 |
| 低 | 5,6,7,9 | 3 | 1 | 4 |
计算条件熵:
$$
H(D_{高}) = -\frac{2}{4} \log_2\left(\frac{2}{4}\right) - \frac{2}{4} \log_2\left(\frac{2}{4}\right) = 1.000
$$
$$
H(D_{中}) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) = 0.971
$$
$$
H(D_{低}) = -\frac{3}{4} \log_2\left(\frac{3}{4}\right) - \frac{1}{4} \log_2\left(\frac{1}{4}\right) = 0.811
$$
$$
H(D|温度) = \frac{4}{14} \times 1.000 + \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0.811 = 0.865
$$
计算信息增益:
$$
Gain(D, 温度) = H(D) - H(D|温度) = 0.940 - 0.865 = 0.075
$$
计算特征熵:
$$
IV(温度) = -\frac{4}{14} \log_2\left(\frac{4}{14}\right) - \frac{5}{14} \log_2\left(\frac{5}{14}\right) - \frac{4}{14} \log_2\left(\frac{4}{14}\right)
$$
$$
IV(温度) = -0.286 \times (-1.807) - 0.357 \times (-1.485) - 0.286 \times (-1.807)
$$
$$
IV(温度) = 0.517 + 0.530 + 0.517 = 1.564
$$
计算信息增益率:
$$
GainRatio(D, 温度) = \frac{Gain(D, 温度)}{IV(温度)} = \frac{0.075}{1.564} = 0.048
$$
5.3.3 特征"湿度"的计算
特征"湿度"的取值: 高、正常
统计各取值下的样本分布:
| 湿度 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 高 | 1,2,3,4,8,12,14 | 3 | 4 | 7 |
| 正常 | 5,6,7,9,10,11,13 | 6 | 1 | 7 |
计算条件熵:
$$
H(D_{高}) = -\frac{3}{7} \log_2\left(\frac{3}{7}\right) - \frac{4}{7} \log_2\left(\frac{4}{7}\right) = 0.985
$$
$$
H(D_{正常}) = -\frac{6}{7} \log_2\left(\frac{6}{7}\right) - \frac{1}{7} \log_2\left(\frac{1}{7}\right) = 0.592
$$
$$
H(D|湿度) = \frac{7}{14} \times 0.985 + \frac{7}{14} \times 0.592 = 0.789
$$
计算信息增益:
$$
Gain(D, 湿度) = H(D) - H(D|湿度) = 0.940 - 0.789 = 0.151
$$
计算特征熵:
$$
IV(湿度) = -\frac{7}{14} \log_2\left(\frac{7}{14}\right) - \frac{7}{14} \log_2\left(\frac{7}{14}\right)
$$
$$
IV(湿度) = -0.5 \times (-1) - 0.5 \times (-1) = 1.000
$$
计算信息增益率:
$$
GainRatio(D, 湿度) = \frac{Gain(D, 湿度)}{IV(湿度)} = \frac{0.151}{1.000} = 0.151
$$
5.3.4 特征"风力"的计算
特征"风力"的取值: 弱、强
统计各取值下的样本分布:
| 风力 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 弱 | 1,3,4,5,8,9,10,13 | 6 | 2 | 8 |
| 强 | 2,6,7,11,12,14 | 3 | 3 | 6 |
计算条件熵:
$$
H(D_{弱}) = -\frac{6}{8} \log_2\left(\frac{6}{8}\right) - \frac{2}{8} \log_2\left(\frac{2}{8}\right) = 0.811
$$
$$
H(D_{强}) = -\frac{3}{6} \log_2\left(\frac{3}{6}\right) - \frac{3}{6} \log_2\left(\frac{3}{6}\right) = 1.000
$$
$$
H(D|风力) = \frac{8}{14} \times 0.811 + \frac{6}{14} \times 1.000 = 0.892
$$
计算信息增益:
$$
Gain(D, 风力) = H(D) - H(D|风力) = 0.940 - 0.892 = 0.048
$$
计算特征熵:
$$
IV(风力) = -\frac{8}{14} \log_2\left(\frac{8}{14}\right) - \frac{6}{14} \log_2\left(\frac{6}{14}\right)
$$
$$
IV(风力) = -0.571 \times (-0.807) - 0.429 \times (-1.222) = 0.461 + 0.524 = 0.985
$$
计算信息增益率:
$$
GainRatio(D, 风力) = \frac{Gain(D, 风力)}{IV(风力)} = \frac{0.048}{0.985} = 0.049
$$
5.4 第三步:选择根节点特征
各特征的信息增益和信息增益率汇总:
| 特征 | 信息增益 | 特征熵 | 信息增益率 |
|---|---|---|---|
| 天气 | 0.246 | 1.577 | 0.156 |
| 温度 | 0.075 | 1.564 | 0.048 |
| 湿度 | 0.151 | 1.000 | 0.151 |
| 风力 | 0.048 | 0.985 | 0.049 |
对比ID3和C4.5:
- ID3算法:选择信息增益最大的特征 → 天气(0.246)
- C4.5算法:选择信息增益率最大的特征 → 天气(0.156)
注意: 在这个例子中,C4.5和ID3选择了相同的特征,但信息增益率的值更小,说明它惩罚了取值较多的特征。
结论: 特征"天气"的信息增益率最大(0.156),因此选择"天气"作为根节点的分裂特征。
第六部分:决策树构建过程详解
6.1 第一层分裂:根节点
根据"天气"特征进行分裂:
[根节点:D(14个样本)]
H(D) = 0.940
|
[特征:天气]
GainRatio = 0.156
/ | \
[晴:5] [阴:4] [雨:5]
子集划分:
-
$D_{晴}$(5个样本):样本1,2,8,9,11
- "是":2个(样本9,11)
- "否":3个(样本1,2,8)
- $H(D_{晴}) = 0.971$
-
$D_{阴}$(4个样本):样本3,7,12,13
- "是":4个
- "否":0个
- $H(D_{阴}) = 0$(完全确定,已经是叶节点)
-
$D_{雨}$(5个样本):样本4,5,6,10,14
- "是":3个(样本4,5,10)
- "否":2个(样本6,14)
- $H(D_{雨}) = 0.971$
6.2 第二层分裂:处理"晴"分支
当前数据集: $D_{晴}$(5个样本)
计算信息熵:
$$
H(D_{晴}) = -\frac{2}{5} \log_2\left(\frac{2}{5}\right) - \frac{3}{5} \log_2\left(\frac{3}{5}\right) = 0.971
$$
计算各特征的信息增益率(在$D_{晴}$上):
6.2.1 特征"温度"的计算
| 温度 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 高 | 1,2 | 0 | 2 | 2 |
| 中 | 8,11 | 1 | 1 | 2 |
| 低 | 9 | 1 | 0 | 1 |
信息增益:
$$
H(D_{晴}|温度) = \frac{2}{5} \times 0 + \frac{2}{5} \times 1.000 + \frac{1}{5} \times 0 = 0.400
$$
$$
Gain(D_{晴}, 温度) = 0.971 - 0.400 = 0.571
$$
特征熵:
$$
IV(温度) = -\frac{2}{5} \log_2\left(\frac{2}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) - \frac{1}{5} \log_2\left(\frac{1}{5}\right)
$$
$$
IV(温度) = -0.4 \times (-1.322) - 0.4 \times (-1.322) - 0.2 \times (-2.322) = 0.529 + 0.529 + 0.464 = 1.522
$$
信息增益率:
$$
GainRatio(D_{晴}, 温度) = \frac{0.571}{1.522} = 0.375
$$
6.2.2 特征"湿度"的计算
| 湿度 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 高 | 1,2,8 | 0 | 3 | 3 |
| 正常 | 9,11 | 2 | 0 | 2 |
信息增益:
$$
H(D_{晴}|湿度) = \frac{3}{5} \times 0 + \frac{2}{5} \times 0 = 0
$$
$$
Gain(D_{晴}, 湿度) = 0.971 - 0 = 0.971
$$
特征熵:
$$
IV(湿度) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right)
$$
$$
IV(湿度) = -0.6 \times (-0.737) - 0.4 \times (-1.322) = 0.442 + 0.529 = 0.971
$$
信息增益率:
$$
GainRatio(D_{晴}, 湿度) = \frac{0.971}{0.971} = 1.000
$$
6.2.3 特征"风力"的计算
| 风力 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 弱 | 1,8,9 | 2 | 1 | 3 |
| 强 | 2,11 | 1 | 1 | 2 |
信息增益:
$$
H(D_{晴}|风力) = \frac{3}{5} \times 0.918 + \frac{2}{5} \times 1.000 = 0.951
$$
$$
Gain(D_{晴}, 风力) = 0.971 - 0.951 = 0.020
$$
特征熵:
$$
IV(风力) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) = 0.971
$$
信息增益率:
$$
GainRatio(D_{晴}, 风力) = \frac{0.020}{0.971} = 0.021
$$
信息增益率汇总:
| 特征 | 信息增益 | 特征熵 | 信息增益率 |
|---|---|---|---|
| 温度 | 0.571 | 1.522 | 0.375 |
| 湿度 | 0.971 | 0.971 | 1.000 |
| 风力 | 0.020 | 0.971 | 0.021 |
结论: 选择"湿度"作为分裂特征(信息增益率最大,为1.000)。
分裂结果:
-
$D_{晴,高}$(3个样本):样本1,2,8
- "是":0个
- "否":3个
- $H = 0$(完全确定,叶节点:否)
-
$D_{晴,正常}$(2个样本):样本9,11
- "是":2个
- "否":0个
- $H = 0$(完全确定,叶节点:是)
6.3 第二层分裂:处理"雨"分支
当前数据集: $D_{雨}$(5个样本)
计算信息熵:
$$
H(D_{雨}) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) = 0.971
$$
计算各特征的信息增益率(在$D_{雨}$上):
6.3.1 特征"温度"的计算
| 温度 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 中 | 4,10,14 | 2 | 1 | 3 |
| 低 | 5,6 | 1 | 1 | 2 |
信息增益:
$$
H(D_{雨}|温度) = \frac{3}{5} \times 0.918 + \frac{2}{5} \times 1.000 = 0.951
$$
$$
Gain(D_{雨}, 温度) = 0.971 - 0.951 = 0.020
$$
特征熵:
$$
IV(温度) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) = 0.971
$$
信息增益率:
$$
GainRatio(D_{雨}, 温度) = \frac{0.020}{0.971} = 0.021
$$
6.3.2 特征"湿度"的计算
| 湿度 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 高 | 4,14 | 1 | 1 | 2 |
| 正常 | 5,6,10 | 2 | 1 | 3 |
信息增益:
$$
H(D_{雨}|湿度) = \frac{2}{5} \times 1.000 + \frac{3}{5} \times 0.918 = 0.951
$$
$$
Gain(D_{雨}, 湿度) = 0.971 - 0.951 = 0.020
$$
特征熵:
$$
IV(湿度) = -\frac{2}{5} \log_2\left(\frac{2}{5}\right) - \frac{3}{5} \log_2\left(\frac{3}{5}\right) = 0.971
$$
信息增益率:
$$
GainRatio(D_{雨}, 湿度) = \frac{0.020}{0.971} = 0.021
$$
6.3.3 特征"风力"的计算
| 风力 | 样本ID | "是"数量 | "否"数量 | 总数 |
|---|---|---|---|---|
| 弱 | 4,5,10 | 3 | 0 | 3 |
| 强 | 6,14 | 0 | 2 | 2 |
信息增益:
$$
H(D_{雨}|风力) = \frac{3}{5} \times 0 + \frac{2}{5} \times 0 = 0
$$
$$
Gain(D_{雨}, 风力) = 0.971 - 0 = 0.971
$$
特征熵:
$$
IV(风力) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right) = 0.971
$$
信息增益率:
$$
GainRatio(D_{雨}, 风力) = \frac{0.971}{0.971} = 1.000
$$
信息增益率汇总:
| 特征 | 信息增益 | 特征熵 | 信息增益率 |
|---|---|---|---|
| 温度 | 0.020 | 0.971 | 0.021 |
| 湿度 | 0.020 | 0.971 | 0.021 |
| 风力 | 0.971 | 0.971 | 1.000 |
结论: 选择"风力"作为分裂特征(信息增益率最大,为1.000)。
分裂结果:
-
$D_{雨,弱}$(3个样本):样本4,5,10
- "是":3个
- "否":0个
- $H = 0$(完全确定,叶节点:是)
-
$D_{雨,强}$(2个样本):样本6,14
- "是":0个
- "否":2个
- $H = 0$(完全确定,叶节点:否)
6.4 完整的决策树结构
[根节点:D(14个样本)]
H(D) = 0.940
|
[特征:天气]
GainRatio = 0.156
/ | \
[晴:5] [阴:4] [雨:5]
/ | \
[湿度] [叶节点] [风力]
GainRatio=1.000 是 GainRatio=1.000
/ \ / \
[高:3] [正常:2] [弱:3] [强:2]
| | | |
[叶节点:否] [叶节点:是] [叶节点:是] [叶节点:否]
6.5 决策树的文本表示
如果 天气 = 阴:
返回 是
否则如果 天气 = 晴:
如果 湿度 = 高:
返回 否
否则(湿度 = 正常):
返回 是
否则(天气 = 雨):
如果 风力 = 弱:
返回 是
否则(风力 = 强):
返回 否
6.6 决策树的ASCII图示
┌─────────────────┐
│ 根节点(14样本) │
│ H(D) = 0.940 │
└────────┬────────┘
│
┌────────▼────────┐
│ 特征:天气 │
│ GainRatio=0.156 │
└───┬──────┬──────┘
│ │ │
┌───────────┘ │ └───────────┐
│ │ │
┌───────▼──────┐ ┌──────▼──────┐ ┌───────▼──────┐
│ 晴 (5样本) │ │ 阴 (4样本) │ │ 雨 (5样本) │
│ H = 0.971 │ │ H = 0.000 │ │ H = 0.971 │
└───────┬──────┘ └──────┬──────┘ └───────┬──────┘
│ │ │
│ ┌────▼────┐ │
│ │ 叶节点:是│ │
│ └─────────┘ │
┌───────▼────────┐ ┌───────▼────────┐
│ 特征:湿度 │ │ 特征:风力 │
│GainRatio=1.000 │ │GainRatio=1.000 │
└───┬──────┬─────┘ └───┬──────┬─────┘
│ │ │ │
┌───────▼──┐ ┌─▼───────┐ ┌───────▼──┐ ┌─▼───────┐
│ 高(3样本)│ │正常(2样本)│ │ 弱(3样本)│ │强(2样本)│
│ H = 0.000│ │ H = 0.000│ │ H = 0.000│ │ H = 0.000│
└───────┬──┘ └─┬───────┘ └───────┬──┘ └─┬───────┘
│ │ │ │
┌───▼───┐ ┌▼────┐ ┌───▼───┐ ┌▼────┐
│叶:否 │ │叶:是│ │叶:是 │ │叶:否│
└───────┘ └─────┘ └───────┘ └─────┘
6.7 ID3 vs C4.5对比
在这个例子中,ID3和C4.5构建了相同的树结构,但选择标准不同:
| 算法 | 选择标准 | 根节点特征 | 原因 |
|---|---|---|---|
| ID3 | 信息增益 | 天气 (0.246) | 信息增益最大 |
| C4.5 | 信息增益率 | 天气 (0.156) | 信息增益率最大 |
关键区别:
- ID3:直接使用信息增益,可能偏向取值较多的特征
- C4.5:使用信息增益率,通过除以特征熵来惩罚取值较多的特征
在这个例子中:
- 虽然"天气"有3个取值,但它的信息增益率仍然最大
- 说明"天气"确实是一个好的特征
- 但如果有一个特征取值更多(如"样本ID"),C4.5会通过特征熵惩罚它
6.8 验证决策树
让我们用几个样本验证决策树:
样本1: 天气=晴, 温度=高, 湿度=高, 风力=弱
- 路径:天气=晴 → 湿度=高 → 否 ✓(实际:否)
样本3: 天气=阴, 温度=高, 湿度=高, 风力=弱
- 路径:天气=阴 → 是 ✓(实际:是)
样本5: 天气=雨, 温度=低, 湿度=正常, 风力=弱
- 路径:天气=雨 → 风力=弱 → 是 ✓(实际:是)
样本6: 天气=雨, 温度=低, 湿度=正常, 风力=强
- 路径:天气=雨 → 风力=强 → 否 ✓(实际:否)
所有训练样本都能被正确分类!
第七部分:C4.5算法的优缺点
7.1 优点
-
解决信息增益偏向问题
- 使用信息增益率,避免选择取值过多的特征
- 更合理的特征选择
-
可以处理连续特征
- 通过二分法将连续特征离散化
- 比ID3更灵活
-
可以处理缺失值
- 有专门的缺失值处理策略
- 不需要预处理缺失值
-
剪枝机制
- 后剪枝防止过拟合
- 提高泛化能力
-
理论基础扎实
- 基于信息论
- 有严格的数学推导
7.2 缺点
-
计算复杂度高
- 需要计算特征熵
- 比ID3更耗时
-
特征熵为0的问题
- 当特征只有一个取值时,信息增益率未定义
- 需要特殊处理
-
多叉树结构
- 生成多叉树,可能不如二叉树简洁
- 树的结构可能较复杂
-
对噪声仍敏感
- 虽然有所改善,但仍对噪声敏感
- 需要剪枝来缓解
-
内存消耗
- 需要存储更多信息
- 对于大数据集可能内存不足
7.3 改进算法
C4.5之后,还发展出:
- C5.0:C4.5的商业版本,性能优化
- CART算法:使用基尼不纯度,生成二叉树
- 随机森林:集成多个决策树
- 梯度提升树:使用梯度提升方法
总结与回顾
核心概念回顾
-
信息熵 $H(X)$
- 衡量数据的不确定性
- 公式:$H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)$
-
条件熵 $H(X|Y)$
- 在已知条件 $Y$ 下,$X$ 的不确定性
- 公式:$H(X|Y) = \sum_{j=1}^{m} P(y_j) H(X|y_j)$
-
信息增益 $Gain(D, A)$
- 使用特征 $A$ 后,不确定性的减少量
- 公式:$Gain(D, A) = H(D) - H(D|A)$
- 问题:偏向取值较多的特征
-
特征熵 $IV(A)$(C4.5新增)
- 衡量特征本身的分裂程度
- 公式:$IV(A) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}$
- 取值越多,特征熵越大
-
信息增益率 $GainRatio(D, A)$(C4.5核心)
- 信息增益除以特征熵
- 公式:$GainRatio(D, A) = \frac{Gain(D, A)}{IV(A)}$
- 既要有帮助,又要避免过度分裂
关键公式汇总
信息熵:
$$
H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}
$$
条件熵:
$$
H(D|A) = \sum_{v=1}^{V} \frac{|D_v|}{|D|} H(D_v)
$$
信息增益:
$$
Gain(D, A) = H(D) - H(D|A)
$$
特征熵:
$$
IV(A) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}
$$
信息增益率:
$$
GainRatio(D, A) = \frac{Gain(D, A)}{IV(A)}
$$
其中:
- $D$:数据集
- $C_k$:第 $k$ 个类别的样本集合
- $A$:特征
- $D_v$:特征 $A$ 取值为 $v$ 的样本子集
- $K$:类别数量
- $V$:特征 $A$ 的取值数量
ID3 vs C4.5对比
| 方面 | ID3 | C4.5 |
|---|---|---|
| 选择标准 | 信息增益 | 信息增益率 |
| 特征类型 | 离散特征 | 离散+连续特征 |
| 缺失值 | 不支持 | 支持 |
| 剪枝 | 无 | 有 |
| 偏向问题 | 偏向取值多的特征 | 解决偏向问题 |
| 计算复杂度 | 较低 | 较高 |
学习要点
- 理解信息增益的偏向问题:为什么需要信息增益率
- 掌握特征熵的计算:这是C4.5的核心概念
- 理解信息增益率的物理意义:平衡信息增益和特征熵
- 注意特征熵为0的情况:需要特殊处理
实际应用建议
- 特征选择:C4.5会自动选择重要特征,避免过度分裂
- 连续特征:C4.5可以处理连续特征,但需要离散化
- 缺失值处理:C4.5有专门的缺失值处理策略
- 剪枝:使用剪枝防止过拟合
- 模型解释:决策树的可解释性是其优势
延伸学习
- C5.0算法:C4.5的商业优化版本
- CART算法:使用基尼不纯度,生成二叉树
- 连续特征处理:C4.5如何将连续特征离散化
- 缺失值处理:C4.5的缺失值处理策略
- 剪枝技术:C4.5的剪枝方法