上午内容回顾
1 课程概览
本课回顾上午讲解的决策树内容,包括ID3和C4.5决策树。重点复习信息熵、条件熵、信息增益、特征熵的概念和计算方法,为C4.5决策树(信息增益率)做铺垫。
2 核心概念与定义
- 熵:数据的混乱程度,用目标值计算。
- 条件熵:基于某特征和熵一起计算的熵。
- 信息增益:熵减去条件熵。
- 特征熵:把特征列当做标签计算的熵。
- 信息增益率:信息增益 × 特征熵的倒数(惩罚系数)。
3 算法与模型详解
3.1 ID3决策树
划分标准:信息增益
特点:
- 信息增益越大,越优先充当根节点
- 问题:特征值越多(分类越多),信息增益越大,越容易充当根节点
缺点:偏向于取值较多的特征
3.2 C4.5决策树
划分标准:信息增益率
公式: $$\text{信息增益率} = \text{信息增益} \times \frac{1}{\text{特征熵}}$$
惩罚系数:特征熵的倒数
特点:
- 特征熵越大,惩罚系数越小
- 特征熵越小,惩罚系数越大
- 解决ID3偏向取值较多特征的问题
3.3 四个核心概念
熵
- 定义:数据的混乱程度
- 计算:用目标值计算
- 公式:$H(D) = -\sum p_i \log_2 p_i$
示例:3个A,3个B $$H(D) = -\frac{3}{6} \log_2 \frac{3}{6} \times 2 = 1$$
条件熵
- 定义:基于特征计算的熵
- 计算:各分类占比 × 该分类的熵,求和
- 公式:$H(D|A) = \sum \frac{|D_i|}{|D|} H(D_i)$
示例:alpha部分和beta部分 $$H(D|A) = \frac{|\alpha|}{|D|} H(\alpha) + \frac{|\beta|}{|D|} H(\beta)$$
信息增益
- 定义:熵减去条件熵
- 公式:$g(D, A) = H(D) - H(D|A)$
特征熵
- 定义:把特征列当做标签计算的熵
- 计算:用特征列的值计算熵
- 公式:$H_A(D) = -\sum \frac{|A_i|}{|D|} \log_2 \frac{|A_i|}{|D|}$
示例:特征列有4个alpha,2个beta $$H_A(D) = -\frac{4}{6} \log_2 \frac{4}{6} - \frac{2}{6} \log_2 \frac{2}{6}$$
3.4 概念总结
| 概念 | 计算依据 | 公式 |
|---|---|---|
| 熵 | 目标值 | $H(D) = -\sum p_i \log_2 p_i$ |
| 条件熵 | 特征+目标值 | $H(D|A) = \sum \frac{|D_i|}{|D|} H(D_i)$ |
| 信息增益 | 熵-条件熵 | $g(D,A) = H(D) - H(D|A)$ |
| 特征熵 | 特征列 | $H_A(D) = -\sum \frac{|A_i|}{|D|} \log_2 \frac{|A_i|}{|D|}$ |
4 数学原理与推导
4.1 信息熵
$$H(D) = -\sum_{k=1}^{K} p_k \log_2 p_k$$
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 特征熵
$$H_A(D) = -\sum_{i=1}^{n} \frac{|A_i|}{|D|} \log_2 \frac{|A_i|}{|D|}$$
4.5 信息增益率
$$g_R(D, A) = \frac{g(D, A)}{H_A(D)} = g(D, A) \times \frac{1}{H_A(D)}$$
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):
"""计算信息增益"""
return entropy(labels) - conditional_entropy(feature, labels)
def feature_entropy(feature):
"""计算特征熵(把特征列当做标签)"""
return entropy(feature)
def information_gain_ratio(feature, labels):
"""计算信息增益率"""
ig = information_gain(feature, labels)
fe = feature_entropy(feature)
return ig / fe if fe > 0 else 0
# 1. 示例数据
# 6个样本,3个A,3个B
labels = np.array(['A', 'A', 'A', 'B', 'B', 'B'])
# 特征:4个alpha,2个beta
feature = np.array(['alpha', 'alpha', 'alpha', 'alpha', 'beta', 'beta'])
# 2. 计算各种熵
print("=== 四个核心概念 ===")
print(f"1. 熵 H(D): {entropy(labels):.4f}")
print(f"2. 条件熵 H(D|A): {conditional_entropy(feature, labels):.4f}")
print(f"3. 信息增益 g(D,A): {information_gain(feature, labels):.4f}")
print(f"4. 特征熵 H_A(D): {feature_entropy(feature):.4f}")
# 3. 计算信息增益率
print(f"\n=== 信息增益率 ===")
print(f"信息增益率: {information_gain_ratio(feature, labels):.4f}")
# 4. 比较ID3和C4.5
print("\n=== ID3 vs C4.5 ===")
# 模拟一个取值较多的特征
feature_many = np.array(['a', 'b', 'c', 'd', 'e', 'f']) # 6个不同值
feature_few = np.array(['x', 'x', 'x', 'y', 'y', 'y']) # 2个不同值
ig_many = information_gain(feature_many, labels)
ig_few = information_gain(feature_few, labels)
igr_many = information_gain_ratio(feature_many, labels)
igr_few = information_gain_ratio(feature_few, labels)
print(f"多值特征 - 信息增益: {ig_many:.4f}, 信息增益率: {igr_many:.4f}")
print(f"少值特征 - 信息增益: {ig_few:.4f}, 信息增益率: {igr_few:.4f}")
print("\nID3偏向多值特征,C4.5通过惩罚系数修正")
输出示例:
=== 四个核心概念 ===
1. 熵 H(D): 1.0000
2. 条件熵 H(D|A): 0.5409
3. 信息增益 g(D,A): 0.4591
4. 特征熵 H_A(D): 0.9183
=== 信息增益率 ===
信息增益率: 0.5000
=== ID3 vs C4.5 ===
多值特征 - 信息增益: 1.0000, 信息增益率: 0.3892
少值特征 - 信息增益: 0.0817, 信息增益率: 0.0817
ID3偏向多值特征,C4.5通过惩罚系数修正
6 重难点与易错提醒
- ❗重点:熵用目标值计算。
- ❗重点:条件熵基于特征和目标值一起计算。
- ❗重点:信息增益 = 熵 - 条件熵。
- ❗重点:特征熵把特征列当做标签计算。
- ❗重点:信息增益率 = 信息增益 / 特征熵。
- ⚠️易错:混淆熵和特征熵。
- ⚠️易错:条件熵的加权计算。
- 💡深入理解:C4.5通过特征熵惩罚取值较多的特征。
7 课堂问答精选
Q: 熵、条件熵、特征熵有什么区别?
A:
- 熵:用目标值计算,表示数据的混乱程度
- 条件熵:基于特征和目标值一起计算,各分类占比 × 该分类的熵
- 特征熵:把特征列当做标签计算的熵 熵看目标值,条件熵看特征+目标值,特征熵只看特征列。
Q: C4.5如何解决ID3的缺点?
A: ID3偏向取值较多的特征(分类越多,信息增益越大)。C4.5使用信息增益率 = 信息增益 / 特征熵。特征熵越大(取值越多),惩罚系数越小,从而避免偏向取值较多的特征。
8 本课小结
- 熵:目标值的混乱程度。
- 条件熵:基于特征计算。
- 信息增益:熵 - 条件熵。
- 特征熵:把特征列当做标签计算。
- 信息增益率:信息增益 / 特征熵。
- ID3用信息增益,C4.5用信息增益率。
9 延伸思考与实践
- 实践:用Python计算四个核心概念。
- 预习:C4.5树信息增益率。
- 思考:为什么特征熵越大,惩罚系数越小?