决策树之信息增益计算
1 课程概览
本课讲解信息增益的计算过程。信息增益 = 信息熵 - 条件熵。通过6个样本的案例,详细演示如何计算信息熵和条件熵,最终得到信息增益。ID3决策树根据信息增益划分节点。
2 核心概念与定义
- 信息增益:特征A对训练集D的信息增益,记作g(D,A)。
- 信息熵:集合D的熵。
- 条件熵:特征A给定条件下D的熵。
- 信息增益公式:信息增益 = 信息熵 - 条件熵。
3 算法与模型详解
3.1 信息增益定义
定义:特征A对训练集D的信息增益,定义为集合D的信息熵与特征A给定条件下D的熵之差
公式: $$g(D, A) = H(D) - H(D|A)$$
其中:
- $H(D)$:集合D的信息熵
- $H(D|A)$:特征A给定条件下D的条件熵
3.2 条件熵计算
公式: $$H(D|A) = \sum_{i=1}^{n} \frac{|D_i|}{|D|} H(D_i)$$
其中:
- $\frac{|D_i|}{|D|}$:分类占比
- $H(D_i)$:该分类的熵
理解:条件熵 = 分类占比 × 特征熵 的累加
3.3 案例计算
数据:6个样本
- 目标值:3个A,3个B
- 特征A(alpha)划分:
- alpha部分:3个A,1个B(共4个)
- beta部分:0个A,2个B(共2个)
步骤1:计算信息熵H(D)
$$H(D) = -\frac{3}{6} \log_2 \frac{3}{6} - \frac{3}{6} \log_2 \frac{3}{6}$$
$$= -\frac{1}{2} \log_2 \frac{1}{2} - \frac{1}{2} \log_2 \frac{1}{2}$$
$$= -\frac{1}{2} \times (-1) - \frac{1}{2} \times (-1) = \frac{1}{2} + \frac{1}{2} = 1$$
结果:$H(D) = 1$
步骤2:计算条件熵H(D|A)
alpha部分(4个样本:3A, 1B): $$H(D_{alpha}) = -\frac{3}{4} \log_2 \frac{3}{4} - \frac{1}{4} \log_2 \frac{1}{4}$$
beta部分(2个样本:0A, 2B): $$H(D_{beta}) = -\frac{0}{2} \log_2 \frac{0}{2} - \frac{2}{2} \log_2 \frac{2}{2} = 0$$
条件熵: $$H(D|A) = \frac{4}{6} H(D_{alpha}) + \frac{2}{6} H(D_{beta})$$
$$= \frac{4}{6} \times H(D_{alpha}) + \frac{2}{6} \times 0$$
$$= \frac{4}{6} \times H(D_{alpha})$$
步骤3:计算信息增益
$$g(D, A) = H(D) - H(D|A) = 1 - H(D|A)$$
3.4 ID3决策树
划分规则:信息增益越大,越优先作为划分节点
特点:
- 根据信息增益划分节点
- 信息增益 = 信息熵 - 条件熵
4 数学原理与推导
4.1 信息熵
$$H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}$$
4.2 条件熵
$$H(D|A) = \sum_{i=1}^{n} \frac{|D_i|}{|D|} H(D_i)$$
4.3 信息增益
$$g(D, A) = H(D) - H(D|A)$$
4.4 对数计算
$$\log_2 \frac{1}{2} = -1$$
$$\log_2 \frac{3}{4} \approx -0.415$$
$$\log_2 \frac{1}{4} = -2$$
5 代码示例
import numpy as np
def entropy(labels):
"""计算信息熵"""
_, counts = np.unique(labels, return_counts=True)
probabilities = counts / len(labels)
return -np.sum(probabilities * np.log2(probabilities))
def conditional_entropy(feature, labels):
"""计算条件熵"""
unique_values = np.unique(feature)
total = len(labels)
cond_ent = 0
for value in unique_values:
# 获取该特征值对应的所有标签
subset = labels[feature == value]
# 计算占比
weight = len(subset) / total
# 累加: 占比 * 该子集的熵
cond_ent += weight * entropy(subset)
return cond_ent
def information_gain(feature, labels):
"""计算信息增益"""
# 信息熵
ent = entropy(labels)
# 条件熵
cond_ent = conditional_entropy(feature, labels)
# 信息增益 = 信息熵 - 条件熵
return ent - cond_ent
# 1. 案例数据
# 6个样本,3个A,3个B
labels = np.array(['A', 'A', 'A', 'B', 'B', 'B'])
# 特征A:alpha(前4个), beta(后2个)
feature = np.array(['alpha', 'alpha', 'alpha', 'alpha', 'beta', 'beta'])
# 2. 计算信息熵
ent = entropy(labels)
print(f"信息熵 H(D): {ent:.4f}") # 1.0
# 3. 计算条件熵
cond_ent = conditional_entropy(feature, labels)
print(f"条件熵 H(D|A): {cond_ent:.4f}")
# 4. 计算信息增益
ig = information_gain(feature, labels)
print(f"信息增益 g(D,A): {ig:.4f}")
# 5. 详细计算过程
print("\n=== 详细计算过程 ===")
print(f"数据: labels={labels}")
print(f"特征: feature={feature}")
# 信息熵
print(f"\n1. 信息熵 H(D):")
unique_labels, label_counts = np.unique(labels, return_counts=True)
for label, count in zip(unique_labels, label_counts):
p = count / len(labels)
print(f" {label}: {count}/{len(labels)} = {p:.4f}, -{p}*log2({p}) = {-p * np.log2(p):.4f}")
print(f" H(D) = {ent:.4f}")
# 条件熵
print(f"\n2. 条件熵 H(D|A):")
for value in np.unique(feature):
subset = labels[feature == value]
subset_ent = entropy(subset)
weight = len(subset) / len(labels)
print(f" {value}: {len(subset)}/{len(labels)} = {weight:.4f}, H={subset_ent:.4f}")
print(f" 贡献: {weight:.4f} * {subset_ent:.4f} = {weight * subset_ent:.4f}")
print(f" H(D|A) = {cond_ent:.4f}")
# 信息增益
print(f"\n3. 信息增益:")
print(f" g(D,A) = H(D) - H(D|A) = {ent:.4f} - {cond_ent:.4f} = {ig:.4f}")
# 6. 比较不同特征的信息增益
print("\n=== 比较不同特征的信息增益 ===")
features = {
'特征1': np.array(['alpha', 'alpha', 'alpha', 'alpha', 'beta', 'beta']),
'特征2': np.array(['alpha', 'alpha', 'beta', 'beta', 'alpha', 'alpha']),
'特征3': np.array(['alpha', 'beta', 'alpha', 'beta', 'alpha', 'beta'])
}
for name, feat in features.items():
ig = information_gain(feat, labels)
print(f"{name}: 信息增益 = {ig:.4f}")
输出示例:
信息熵 H(D): 1.0000
条件熵 H(D|A): 0.5409
信息增益 g(D,A): 0.4591
=== 详细计算过程 ===
数据: labels=['A' 'A' 'A' 'B' 'B' 'B']
特征: feature=['alpha' 'alpha' 'alpha' 'alpha' 'beta' 'beta']
1. 信息熵 H(D):
A: 3/6 = 0.5000, -0.5*log2(0.5) = 0.5000
B: 3/6 = 0.5000, -0.5*log2(0.5) = 0.5000
H(D) = 1.0000
2. 条件熵 H(D|A):
alpha: 4/6 = 0.6667, H=0.8113
贡献: 0.6667 * 0.8113 = 0.5409
beta: 2/6 = 0.3333, H=0.0000
贡献: 0.3333 * 0.0000 = 0.0000
H(D|A) = 0.5409
3. 信息增益:
g(D,A) = H(D) - H(D|A) = 1.0000 - 0.5409 = 0.4591
=== 比较不同特征的信息增益 ===
特征1: 信息增益 = 0.4591
特征2: 信息增益 = 0.0817
特征3: 信息增益 = 0.0000
6 重难点与易错提醒
- ❗重点:信息增益 = 信息熵 - 条件熵。
- ❗重点:信息熵只看目标值,与特征无关。
- ❗重点:条件熵 = 分类占比 × 特征熵 的累加。
- ❗重点:ID3根据信息增益划分节点,越大越优先。
- ⚠️易错:信息熵和条件熵的计算混淆。
- ⚠️易错:条件熵的加权计算。
- 💡深入理解:信息增益越大,特征对分类越重要。
7 课堂问答精选
Q: 如何计算信息增益?
A: 信息增益 = 信息熵 - 条件熵
- 计算信息熵H(D):只看目标值的分布
- 计算条件熵H(D|A):按特征A分组,计算每组的熵,加权求和
- 信息增益g(D,A) = H(D) - H(D|A)
Q: 信息增益的作用是什么?
A: 信息增益用于ID3决策树的节点划分。信息增益越大,说明该特征对分类越重要,越优先作为划分节点。通过比较不同特征的信息增益,选择最大的作为当前节点的划分特征。
8 本课小结
- 信息增益:g(D,A) = H(D) - H(D|A)。
- 信息熵:只看目标值分布。
- 条件熵:按特征分组,加权求和。
- ID3:根据信息增益划分节点,越大越优先。
9 延伸思考与实践
- 实践:用Python计算不同特征的信息增益。
- 预习:C4.5决策树(信息增益率)。
- 思考:信息增益有什么缺点?