决策树ID3算法
目录
- 引言:决策树是什么?
- 第一部分:核心概念基础
- 第二部分:信息熵详解
- 第三部分:条件熵与信息增益
- 第四部分:ID3算法原理
- 第五部分:完整实例演示
- 第六部分:决策树构建过程详解
- 第七部分:ID3算法的优缺点
- 总结与回顾
引言:决策树是什么?
生活中的决策过程
想象你是一位医生,需要根据病人的症状来判断是否患有某种疾病。你的决策过程可能是这样的:
如果 发烧 = 是:
如果 咳嗽 = 是:
如果 头痛 = 是:
诊断:可能是流感
否则:
诊断:可能是普通感冒
否则:
诊断:可能是其他疾病
否则:
如果 咳嗽 = 是:
诊断:可能是过敏
否则:
诊断:需要进一步检查
这就是一个决策树!它通过一系列"如果...那么..."的判断,最终得出结论。
什么是决策树?
决策树(Decision Tree)是一种监督学习算法,用于分类和回归任务。它通过一系列规则对数据进行分类,这些规则形成了一个树状结构:
- 根节点(Root Node):树的顶部,包含所有数据
- 内部节点(Internal Node):表示一个特征或属性
- 叶节点(Leaf Node):表示最终的分类结果
- 分支(Branch):表示一个决策规则
为什么需要ID3算法?
构建决策树的关键问题是:如何选择最佳的特征进行分裂?
ID3(Iterative Dichotomiser 3)算法使用信息增益来选择最优特征,而信息增益基于信息熵的概念。
类比理解:
- 信息熵:衡量数据的"混乱程度"或"不确定性"
- 信息增益:衡量使用某个特征后,不确定性减少了多少
- 选择信息增益最大的特征,就是选择最能"减少混乱"的特征
第一部分:核心概念基础
1.1 决策树的基本结构
决策树由节点和边组成:
[根节点:所有数据]
|
[特征A = ?]
/ \
[值1] [值2]
/ \
[子节点1] [子节点2]
| |
[特征B = ?] [叶节点:类别1]
/ \
[值1] [值2]
| |
[类别2] [类别3]
1.2 数据集表示
在机器学习中,数据集通常表示为:
| 样本ID | 特征1 | 特征2 | ... | 特征m | 类别 |
|---|---|---|---|---|---|
| 1 | $x_{11}$ | $x_{12}$ | ... | $x_{1m}$ | $y_1$ |
| 2 | $x_{21}$ | $x_{22}$ | ... | $x_{2m}$ | $y_2$ |
| ... | ... | ... | ... | ... | ... |
| n | $x_{n1}$ | $x_{n2}$ | ... | $x_{nm}$ | $y_n$ |
1.3 信息论基础
ID3算法基于信息论,核心概念包括:
- 信息量(Information):事件发生的不确定性
- 信息熵(Entropy):所有可能事件的平均信息量
- 条件熵(Conditional Entropy):在已知某个条件下,事件的不确定性
- 信息增益(Information Gain):使用特征后,不确定性减少的量
第二部分:信息熵详解
2.1 信息量的定义
信息量:事件 $x$ 发生的信息量定义为:
$$
I(x) = -\log_2 P(x)
$$
其中 $P(x)$ 是事件 $x$ 发生的概率。
理解:
- 概率越小的事件,信息量越大(越意外,信息越多)
- 概率为1的事件,信息量为0(确定发生,没有信息)
- 使用 $\log_2$ 是为了让信息量以"比特"为单位
例子:
- 抛硬币正面朝上:$P = 0.5$,$I = -\log_2(0.5) = 1$ 比特
- 太阳从东方升起:$P \approx 1$,$I \approx 0$ 比特
概率的取值范围:
概率 $P(x)$ 的取值范围是 $[0, 1]$:
$P(x) = 1$:事件必然发生
$P(x) = 0$:事件不可能发生
$P(x) = 0.5$:事件发生的可能性中等
对数函数的性质:
当 $P(x) \in [0, 1]$ 时,$\log_2 P(x)$ 的值:
如果 $P(x) = 1$,则 $\log_2(1) = 0$
如果 $P(x) = 0.5$,则 $\log_2(0.5) = -1$
如果 $P(x) = 0.25$,则 $\log_2(0.25) = -2$
如果 $P(x) = 0$,则 $\log_2(0) = -\infty$
关键观察:$\log_2 P(x)$ 在 $[0, 1]$ 区间内是负数或零。
信息量的直观要求:
我们希望信息量满足:
概率越大 → 信息量越小(常见事件,信息量小)
概率越小 → 信息量越大(罕见事件,信息量大)
信息量应该是非负数(便于度量)
负号的作用:
不加负号:$\log_2 P(x)$ 在 $[0, 1]$ 上是负数或零,且概率越大值越大(与直觉相反)
加负号:$-\log_2 P(x)$ 在 $[0, 1]$ 上是非负数,且概率越大值越小(符合直觉)
具体例子:
| 事件概率 $P(x)$ | $\log_2 P(x)$ | $-\log_2 P(x)$ (信息量) | 直观解释 |
|---|---|---|---|
| 1.0 (必然发生) | 0 | 0 比特 | 没有信息,因为已经确定 |
| 0.5 (抛硬币) | -1 | 1 比特 | 需要1位来表示结果 |
| 0.25 (4选1) | -2 | 2 比特 | 需要2位来表示结果 |
| 0.125 (8选1) | -3 | 3 比特 | 需要3位来表示结果 |
| 0.01 (罕见) | ≈ -6.64 | ≈ 6.64 比特 | 罕见事件,信息量大 |
数学验证:
当 $P(x) = 1$:$-\log_2(1) = 0$(必然事件,信息量为 0)
当 $P(x) = 0.5$:$-\log_2(0.5) = 1$(需要 1 比特)
当 $P(x) \to 0$:$-\log_2 P(x) \to +\infty$(极罕见事件,信息量极大)
2.2 信息熵的定义
信息熵:衡量随机变量的不确定性,定义为所有可能事件的信息量的期望值:
$$
H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)
$$
其中:
- $X$ 是随机变量
- $x_i$ 是 $X$ 的第 $i$ 个可能取值
- $P(x_i)$ 是 $x_i$ 发生的概率
- $n$ 是可能取值的数量
2.3 信息熵的性质
- 非负性:$H(X) \geq 0$
- 确定性:当某个 $P(x_i) = 1$ 时,$H(X) = 0$(完全确定,无不确定性)
- 对称性:概率分布的顺序不影响熵值
- 最大值:当所有事件概率相等时,熵达到最大值
最大熵定理:
对于 $n$ 个可能的事件,当 $P(x_i) = \frac{1}{n}$ 对所有 $i$ 成立时,熵达到最大值:
$$
H_{max}(X) = \log_2 n
$$
2.4 信息熵的直观理解
信息熵衡量数据的"混乱程度":
- 熵 = 0:数据完全纯净,所有样本属于同一类
- 熵 = 最大值:数据完全混乱,各类别均匀分布
- 熵越大:数据越混乱,越难分类
例子:
假设有10个样本,分类为"是"或"否":
| 情况 | "是"的数量 | "否"的数量 | 熵值 |
|---|---|---|---|
| 情况1 | 10 | 0 | $H = 0$(完全确定) |
| 情况2 | 5 | 5 | $H = 1$(最大混乱) |
| 情况3 | 8 | 2 | $H \approx 0.72$(较确定) |
| 情况4 | 3 | 7 | $H \approx 0.88$(较混乱) |
2.5 信息熵的计算示例
示例1:二分类问题
假设数据集 $D$ 中有14个样本:
- 9个属于类别"是"(正类)
- 5个属于类别"否"(负类)
计算信息熵:
$$
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
$$
示例2:三分类问题
假设数据集 $D$ 中有15个样本:
- 5个属于类别A
- 5个属于类别B
- 5个属于类别C
计算信息熵:
$$
P(A) = P(B) = P(C) = \frac{5}{15} = \frac{1}{3}
$$
$$
H(D) = -\sum_{i=A,B,C} P(i) \log_2 P(i)
$$
$$
H(D) = -3 \times \frac{1}{3} \times \log_2\left(\frac{1}{3}\right)
$$
$$
H(D) = -\log_2\left(\frac{1}{3}\right) = \log_2(3) \approx 1.585
$$
第三部分:条件熵与信息增益
3.1 条件熵的定义
条件熵:在已知随机变量 $Y$ 的条件下,随机变量 $X$ 的不确定性:
$$
H(X|Y) = -\sum_{j=1}^{m} P(y_j) \sum_{i=1}^{n} P(x_i|y_j) \log_2 P(x_i|y_j)
$$
其中:
- $Y$ 是条件变量(通常是特征)
- $X$ 是目标变量(通常是类别)
- $P(y_j)$ 是 $Y = y_j$ 的概率
- $P(x_i|y_j)$ 是在 $Y = y_j$ 条件下 $X = x_i$ 的条件概率
简化形式(在决策树中):
$$
H(D|A) = \sum_{v=1}^{V} \frac{|D_v|}{|D|} H(D_v)
$$
其中:
- $D$ 是数据集
- $A$ 是特征
- $V$ 是特征 $A$ 的可能取值数量
- $D_v$ 是特征 $A$ 取值为 $v$ 的子集
- $|D_v|$ 是子集 $D_v$ 的样本数量
- $|D|$ 是数据集 $D$ 的样本数量
3.2 条件熵的直观理解
条件熵衡量:在已知某个特征的情况下,类别的不确定性
- 条件熵 = 0:使用该特征后,类别完全确定
- 条件熵 = 原始熵:该特征对分类没有帮助
- 条件熵越小:该特征对分类的帮助越大
3.3 信息增益的定义
信息增益:使用特征 $A$ 后,信息熵的减少量:
$$
Gain(D, A) = H(D) - H(D|A)
$$
其中:
- $H(D)$ 是数据集 $D$ 的原始信息熵
- $H(D|A)$ 是使用特征 $A$ 后的条件熵
3.4 信息增益的直观理解
信息增益衡量:使用某个特征后,不确定性减少了多少
- 信息增益 = 0:该特征对分类没有帮助
- 信息增益 = 原始熵:该特征能完全确定类别
- 信息增益越大:该特征对分类的帮助越大
ID3算法的核心思想:
选择信息增益最大的特征作为分裂特征!
3.5 信息增益的计算步骤
步骤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)$
步骤3: 计算信息增益:$Gain(D, A) = H(D) - H(D|A)$
步骤4: 选择信息增益最大的特征
第四部分:ID3算法原理
4.1 ID3算法的基本思想
ID3算法采用自顶向下的贪心策略构建决策树:
- 从根节点开始,包含所有训练样本
- 选择最优特征:计算每个特征的信息增益,选择信息增益最大的特征
- 分裂节点:根据选定的特征,将数据分成多个子集
- 递归构建:对每个子集递归执行步骤2-3
- 停止条件:
- 所有样本属于同一类别
- 没有剩余特征可用
- 信息增益小于阈值
4.2 ID3算法的伪代码
函数 ID3(数据集D, 特征集A):
如果 D中所有样本属于同一类别:
返回 叶节点(类别)
如果 A为空 或 D中所有样本的特征值相同:
返回 叶节点(D中多数类)
选择信息增益最大的特征 a* = argmax(Gain(D, a))
创建节点,标记为特征 a*
对于特征 a* 的每个取值 v:
创建分支,对应 D_v = {样本 | 样本的特征a* = v}
如果 D_v 为空:
添加叶节点(D中多数类)
否则:
递归调用 ID3(D_v, A - {a*})
返回 节点
4.3 ID3算法的特点
优点:
- 算法简单,易于理解
- 构建的树结构直观,可解释性强
- 不需要数据预处理(如归一化)
- 可以处理多分类问题
缺点:
- 只能处理离散特征
- 容易过拟合
- 对噪声敏感
- 倾向于选择取值较多的特征(信息增益偏向)
第五部分:完整实例演示
5.1 数据集描述
我们使用一个经典的天气预测是否打网球的数据集:
| 样本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 |
计算条件熵:
对于"晴":
$$
P(晴) = \frac{5}{14}
$$
$$
H(D_{晴}) = -\frac{2}{5} \log_2\left(\frac{2}{5}\right) - \frac{3}{5} \log_2\left(\frac{3}{5}\right)
$$
$$
H(D_{晴}) = -0.4 \times (-1.322) - 0.6 \times (-0.737) = 0.529 + 0.442 = 0.971
$$
对于"阴":
$$
P(阴) = \frac{4}{14}
$$
$$
H(D_{阴}) = -\frac{4}{4} \log_2\left(\frac{4}{4}\right) - \frac{0}{4} \log_2\left(\frac{0}{4}\right) = 0
$$
(注意:$0 \times \log_2(0) = 0$)
对于"雨":
$$
P(雨) = \frac{5}{14}
$$
$$
H(D_{雨}) = -\frac{3}{5} \log_2\left(\frac{3}{5}\right) - \frac{2}{5} \log_2\left(\frac{2}{5}\right)
$$
$$
H(D_{雨}) = -0.6 \times (-0.737) - 0.4 \times (-1.322) = 0.442 + 0.529 = 0.971
$$
计算条件熵:
$$
H(D|天气) = P(晴) \times H(D_{晴}) + P(阴) \times H(D_{阴}) + P(雨) \times H(D_{雨})
$$
$$
H(D|天气) = \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0 + \frac{5}{14} \times 0.971
$$
$$
H(D|天气) = 0.347 + 0 + 0.347 = 0.694
$$
计算信息增益:
$$
Gain(D, 天气) = H(D) - H(D|天气) = 0.940 - 0.694 = 0.246
$$
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
$$
$$
H(D|温度) = 0.286 + 0.347 + 0.232 = 0.865
$$
计算信息增益:
$$
Gain(D, 温度) = H(D) - H(D|温度) = 0.940 - 0.865 = 0.075
$$
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.493 + 0.296 = 0.789
$$
计算信息增益:
$$
Gain(D, 湿度) = H(D) - H(D|湿度) = 0.940 - 0.789 = 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.463 + 0.429 = 0.892
$$
计算信息增益:
$$
Gain(D, 风力) = H(D) - H(D|风力) = 0.940 - 0.892 = 0.048
$$
5.4 第三步:选择根节点特征
各特征的信息增益汇总:
| 特征 | 信息增益 |
|---|---|
| 天气 | 0.246 |
| 温度 | 0.075 |
| 湿度 | 0.151 |
| 风力 | 0.048 |
结论: 特征"天气"的信息增益最大(0.246),因此选择"天气"作为根节点的分裂特征。
第六部分:决策树构建过程详解
6.1 第一层分裂:根节点
根据"天气"特征进行分裂:
[根节点:D(14个样本)]
H(D) = 0.940
|
[特征:天气]
Gain = 0.246
/ | \
[晴: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
$$
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
$$
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.551 + 0.400 = 0.951
$$
$$
Gain(D_{晴}, 风力) = 0.971 - 0.951 = 0.020
$$
信息增益汇总:
| 特征 | 信息增益 |
|---|---|
| 温度 | 0.571 |
| 湿度 | 0.971 |
| 风力 | 0.020 |
结论: 选择"湿度"作为分裂特征(信息增益最大)。
分裂结果:
-
$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.551 + 0.400 = 0.951
$$
$$
Gain(D_{雨}, 温度) = 0.971 - 0.951 = 0.020
$$
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.400 + 0.551 = 0.951
$$
$$
Gain(D_{雨}, 湿度) = 0.971 - 0.951 = 0.020
$$
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
$$
信息增益汇总:
| 特征 | 信息增益 |
|---|---|
| 温度 | 0.020 |
| 湿度 | 0.020 |
| 风力 | 0.971 |
结论: 选择"风力"作为分裂特征(信息增益最大)。
分裂结果:
-
$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
|
[特征:天气]
Gain = 0.246
/ | \
[晴:5] [阴:4] [雨:5]
/ | \
[湿度] [叶节点] [风力]
Gain=0.971 是 Gain=0.971
/ \ / \
[高:3] [正常:2] [弱:3] [强:2]
| | | |
[叶节点:否] [叶节点:是] [叶节点:是] [叶节点:否]
6.5 决策树的文本表示
如果 天气 = 阴:
返回 是
否则如果 天气 = 晴:
如果 湿度 = 高:
返回 否
否则(湿度 = 正常):
返回 是
否则(天气 = 雨):
如果 风力 = 弱:
返回 是
否则(风力 = 强):
返回 否
6.6 决策树的ASCII图示
┌─────────────────┐
│ 根节点(14样本) │
│ H(D) = 0.940 │
└────────┬────────┘
│
┌────────▼────────┐
│ 特征:天气 │
│ Gain = 0.246 │
└───┬──────┬──────┘
│ │ │
┌───────────┘ │ └───────────┐
│ │ │
┌───────▼──────┐ ┌──────▼──────┐ ┌───────▼──────┐
│ 晴 (5样本) │ │ 阴 (4样本) │ │ 雨 (5样本) │
│ H = 0.971 │ │ H = 0.000 │ │ H = 0.971 │
└───────┬──────┘ └──────┬──────┘ └───────┬──────┘
│ │ │
│ ┌────▼────┐ │
│ │ 叶节点:是│ │
│ └─────────┘ │
┌───────▼────────┐ ┌───────▼────────┐
│ 特征:湿度 │ │ 特征:风力 │
│ Gain = 0.971 │ │ Gain = 0.971 │
└───┬──────┬─────┘ └───┬──────┬─────┘
│ │ │ │
┌───────▼──┐ ┌─▼───────┐ ┌───────▼──┐ ┌─▼───────┐
│ 高(3样本)│ │正常(2样本)│ │ 弱(3样本)│ │强(2样本)│
│ H = 0.000│ │ H = 0.000│ │ H = 0.000│ │ H = 0.000│
└───────┬──┘ └─┬───────┘ └───────┬──┘ └─┬───────┘
│ │ │ │
┌───▼───┐ ┌▼────┐ ┌───▼───┐ ┌▼────┐
│叶:否 │ │叶:是│ │叶:是 │ │叶:否│
└───────┘ └─────┘ └───────┘ └─────┘
6.7 验证决策树
让我们用几个样本验证决策树:
样本1: 天气=晴, 温度=高, 湿度=高, 风力=弱
- 路径:天气=晴 → 湿度=高 → 否 ✓(实际:否)
样本3: 天气=阴, 温度=高, 湿度=高, 风力=弱
- 路径:天气=阴 → 是 ✓(实际:是)
样本5: 天气=雨, 温度=低, 湿度=正常, 风力=弱
- 路径:天气=雨 → 风力=弱 → 是 ✓(实际:是)
样本6: 天气=雨, 温度=低, 湿度=正常, 风力=强
- 路径:天气=雨 → 风力=强 → 否 ✓(实际:否)
所有训练样本都能被正确分类!
第七部分:ID3算法的优缺点
7.1 优点
-
算法简单直观
- 易于理解和实现
- 决策过程清晰,可解释性强
-
不需要数据预处理
- 不需要特征缩放或归一化
- 可以处理缺失值(需要额外处理)
-
可以处理多分类问题
- 不仅限于二分类
-
特征选择明确
- 基于信息论,有理论支撑
-
构建速度快
- 对于小到中等规模的数据集,构建速度较快
7.2 缺点
-
只能处理离散特征
- 连续特征需要先离散化
- 这是ID3的主要限制
-
容易过拟合
- 没有剪枝机制
- 可能生成过于复杂的树
-
对噪声敏感
- 训练数据中的噪声会影响树的结构
-
信息增益偏向
- 倾向于选择取值较多的特征
- 可能导致不合理的特征选择
-
不能处理缺失值
- 需要预处理缺失值
-
不稳定
- 数据的小幅变化可能导致树结构的显著变化
7.3 改进算法
为了解决ID3的缺点,后续发展出:
- 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)$
- 信息增益越大,特征越重要
-
ID3算法流程
- 计算数据集的信息熵
- 对每个特征计算信息增益
- 选择信息增益最大的特征进行分裂
- 递归构建子树
- 直到满足停止条件
关键公式汇总
信息熵:
$$
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)
$$
其中:
- $D$:数据集
- $C_k$:第 $k$ 个类别的样本集合
- $A$:特征
- $D_v$:特征 $A$ 取值为 $v$ 的样本子集
- $K$:类别数量
- $V$:特征 $A$ 的取值数量
学习要点
- 理解信息熵的物理意义:衡量不确定性,熵越大越混乱
- 掌握信息增益的计算:这是ID3算法的核心
- 理解递归构建过程:每个节点独立选择最优特征
- 注意停止条件:避免无限递归
实际应用建议
- 数据预处理:确保特征是离散的
- 特征选择:ID3会自动选择重要特征
- 过拟合控制:考虑使用剪枝或限制树深度
- 模型解释:决策树的可解释性是其优势
延伸学习
- C4.5算法:改进ID3,处理连续特征
- CART算法:使用基尼不纯度,支持回归
- 随机森林:集成多个决策树
- 剪枝技术:防止过拟合的方法