行莫
行莫
发布于 2025-12-12 / 5 阅读
0
0

决策树C4.5算法

决策树C4.5算法

目录

  1. 引言:C4.5是什么?
  2. 第一部分:C4.5与ID3的关系
  3. 第二部分:核心概念回顾
  4. 第三部分:特征熵与信息增益率
  5. 第四部分:C4.5算法原理
  6. 第五部分:完整实例演示
  7. 第六部分:决策树构建过程详解
  8. 第七部分:C4.5算法的优缺点
  9. 总结与回顾

引言:C4.5是什么?

ID3算法的问题

在ID3算法中,我们使用信息增益来选择最优特征。但是,信息增益存在一个严重的问题:

信息增益偏向问题: 信息增益倾向于选择取值较多的特征。

例子:
假设有一个特征"样本ID",每个样本的ID都不同。如果使用这个特征进行分裂:

  • 每个子集只包含1个样本
  • 每个子集的熵都是0(完全确定)
  • 条件熵 = 0
  • 信息增益 = 原始熵(最大值)

但显然,"样本ID"这个特征对分类没有任何帮助!它只是把每个样本分到不同的子集,并没有学到任何有用的模式。

C4.5算法的改进

C4.5算法是ID3算法的改进版本,由Ross Quinlan在1993年提出。主要改进包括:

  1. 使用信息增益率:解决信息增益偏向问题
  2. 处理连续特征:可以处理数值型特征
  3. 处理缺失值:可以处理数据中的缺失值
  4. 剪枝机制:防止过拟合

本文重点讲解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个取值:

天气取值样本数量比例
55/14
44/14
55/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 信息增益率的直观理解

信息增益率 = 信息增益 / 特征熵

为什么这样设计?

  1. 信息增益:衡量特征对分类的帮助

    • 越大越好
    • 但偏向取值较多的特征
  2. 特征熵:衡量特征的分裂程度

    • 取值越多,特征熵越大
    • 过度分裂不是好事
  3. 信息增益率:平衡两者

    • 既要信息增益大(有帮助)
    • 又要特征熵小(不过度分裂)
    • 从而避免选择取值过多的特征

例子对比:

假设有两个特征:

  • 特征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$,信息增益率未定义。

解决方案:

  1. 跳过该特征:如果特征的取值数量 < 2,不计算信息增益率
  2. 使用信息增益:如果所有特征的特征熵都为0,回退到使用信息增益
  3. 设置阈值:只考虑特征熵大于某个阈值的特征

在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算法采用自顶向下的贪心策略构建决策树:

  1. 从根节点开始,包含所有训练样本
  2. 选择最优特征
    • 计算每个特征的信息增益率
    • 如果特征熵太小,回退到信息增益
    • 选择信息增益率(或信息增益)最大的特征
  3. 分裂节点:根据选定的特征,将数据分成多个子集
  4. 递归构建:对每个子集递归执行步骤2-3
  5. 停止条件
    • 所有样本属于同一类别
    • 没有剩余特征可用
    • 信息增益率小于阈值
    • 样本数量小于阈值
  6. 剪枝:构建完成后进行剪枝,防止过拟合

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的改进:

  1. 信息增益率:解决信息增益偏向问题
  2. 连续特征处理:可以处理数值型特征(通过二分法)
  3. 缺失值处理:可以处理数据中的缺失值
  4. 剪枝机制:防止过拟合

仍然存在的问题:

  1. 计算复杂度:比ID3更复杂
  2. 多叉树:生成多叉树,可能不如二叉树简洁
  3. 对噪声敏感:虽然有所改善,但仍对噪声敏感

第五部分:完整实例演示

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,11235
3,7,12,13404
4,5,6,10,14325

计算条件熵:

对于"晴":

$$
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,13224
4,8,10,11,14325
5,6,7,9314

计算条件熵:

$$
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,14347
正常5,6,7,9,10,11,13617

计算条件熵:

$$
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,13628
2,6,7,11,12,14336

计算条件熵:

$$
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.2461.5770.156
温度0.0751.5640.048
湿度0.1511.0000.151
风力0.0480.9850.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,2022
8,11112
9101

信息增益:

$$
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,8033
正常9,11202

信息增益:

$$
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,9213
2,11112

信息增益:

$$
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.5711.5220.375
湿度0.9710.9711.000
风力0.0200.9710.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,14213
5,6112

信息增益:

$$
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,14112
正常5,6,10213

信息增益:

$$
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,10303
6,14022

信息增益:

$$
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.0200.9710.021
湿度0.0200.9710.021
风力0.9710.9711.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)信息增益率最大

关键区别:

  1. ID3:直接使用信息增益,可能偏向取值较多的特征
  2. C4.5:使用信息增益率,通过除以特征熵来惩罚取值较多的特征

在这个例子中:

  • 虽然"天气"有3个取值,但它的信息增益率仍然最大
  • 说明"天气"确实是一个好的特征
  • 但如果有一个特征取值更多(如"样本ID"),C4.5会通过特征熵惩罚它

6.8 验证决策树

让我们用几个样本验证决策树:

样本1: 天气=晴, 温度=高, 湿度=高, 风力=弱

  • 路径:天气=晴 → 湿度=高 → ✓(实际:否)

样本3: 天气=阴, 温度=高, 湿度=高, 风力=弱

  • 路径:天气=阴 → ✓(实际:是)

样本5: 天气=雨, 温度=低, 湿度=正常, 风力=弱

  • 路径:天气=雨 → 风力=弱 → ✓(实际:是)

样本6: 天气=雨, 温度=低, 湿度=正常, 风力=强

  • 路径:天气=雨 → 风力=强 → ✓(实际:否)

所有训练样本都能被正确分类!


第七部分:C4.5算法的优缺点

7.1 优点

  1. 解决信息增益偏向问题

    • 使用信息增益率,避免选择取值过多的特征
    • 更合理的特征选择
  2. 可以处理连续特征

    • 通过二分法将连续特征离散化
    • 比ID3更灵活
  3. 可以处理缺失值

    • 有专门的缺失值处理策略
    • 不需要预处理缺失值
  4. 剪枝机制

    • 后剪枝防止过拟合
    • 提高泛化能力
  5. 理论基础扎实

    • 基于信息论
    • 有严格的数学推导

7.2 缺点

  1. 计算复杂度高

    • 需要计算特征熵
    • 比ID3更耗时
  2. 特征熵为0的问题

    • 当特征只有一个取值时,信息增益率未定义
    • 需要特殊处理
  3. 多叉树结构

    • 生成多叉树,可能不如二叉树简洁
    • 树的结构可能较复杂
  4. 对噪声仍敏感

    • 虽然有所改善,但仍对噪声敏感
    • 需要剪枝来缓解
  5. 内存消耗

    • 需要存储更多信息
    • 对于大数据集可能内存不足

7.3 改进算法

C4.5之后,还发展出:

  • C5.0:C4.5的商业版本,性能优化
  • CART算法:使用基尼不纯度,生成二叉树
  • 随机森林:集成多个决策树
  • 梯度提升树:使用梯度提升方法

总结与回顾

核心概念回顾

  1. 信息熵 $H(X)$

    • 衡量数据的不确定性
    • 公式:$H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)$
  2. 条件熵 $H(X|Y)$

    • 在已知条件 $Y$ 下,$X$ 的不确定性
    • 公式:$H(X|Y) = \sum_{j=1}^{m} P(y_j) H(X|y_j)$
  3. 信息增益 $Gain(D, A)$

    • 使用特征 $A$ 后,不确定性的减少量
    • 公式:$Gain(D, A) = H(D) - H(D|A)$
    • 问题:偏向取值较多的特征
  4. 特征熵 $IV(A)$(C4.5新增)

    • 衡量特征本身的分裂程度
    • 公式:$IV(A) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}$
    • 取值越多,特征熵越大
  5. 信息增益率 $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对比

方面ID3C4.5
选择标准信息增益信息增益率
特征类型离散特征离散+连续特征
缺失值不支持支持
剪枝
偏向问题偏向取值多的特征解决偏向问题
计算复杂度较低较高

学习要点

  1. 理解信息增益的偏向问题:为什么需要信息增益率
  2. 掌握特征熵的计算:这是C4.5的核心概念
  3. 理解信息增益率的物理意义:平衡信息增益和特征熵
  4. 注意特征熵为0的情况:需要特殊处理

实际应用建议

  1. 特征选择:C4.5会自动选择重要特征,避免过度分裂
  2. 连续特征:C4.5可以处理连续特征,但需要离散化
  3. 缺失值处理:C4.5有专门的缺失值处理策略
  4. 剪枝:使用剪枝防止过拟合
  5. 模型解释:决策树的可解释性是其优势

延伸学习

  • C5.0算法:C4.5的商业优化版本
  • CART算法:使用基尼不纯度,生成二叉树
  • 连续特征处理:C4.5如何将连续特征离散化
  • 缺失值处理:C4.5的缺失值处理策略
  • 剪枝技术:C4.5的剪枝方法

评论