决策树基础学习教育第二课:量化最优分裂——信息熵与基尼系数
决策树基础学习教育第二课:量化最优分裂——信息熵与基尼系数
目标:掌握决策树选择“最佳分裂特征”的核心方法,理解决策树如何通过数学指标(信息熵、基尼系数)量化数据纯度,进而优化分裂规则。
一、课程回顾:为什么要量化“最优分裂”?
在第一课中,我们了解到决策树的核心是通过递归分裂特征,将数据划分成“尽可能纯净的子集”(即同一子集中的样本尽量属于同一类别)。但问题来了:如何判断哪种分裂方式能让子集更纯净?
比如,现在有一组数据(特征:天气=晴/雨;温度=高/低;标签:是否去公园=是/否),我们需要从所有可能的特征(天气、温度)和取值(晴/雨、高/低)中,选出一个分裂点,使得分裂后的两个子集里,“去公园”和“不去公园”的样本尽可能“分开”——也就是子集更“纯净”。
这时候,就需要用数学工具来量化“纯净度”,最常见的两个指标是:信息熵(Entropy) 和 基尼系数(Gini Index)。
二、信息熵(Entropy):衡量混乱程度的经典指标
1. 信息熵的起源与定义
信息熵最早由香农(信息论之父)提出,用来衡量一个系统的“不确定性”或“混乱程度”。在决策树中,信息熵表示当前数据集中类别的混杂程度——熵值越高,说明样本类别越分散(越不纯净);熵值越低,说明样本类别越集中(越纯净)。
公式:
对于一个数据集 D,包含 C 个类别(比如分类任务中的“是/否”),每个类别的样本占比为 p_i(第 i 类样本数/总样本数),则信息熵 Ent(D) 的计算公式为:
Ent(D) = -\sum_{i=1}^{C} p_i \log_2 p_i
(注:对数的底数通常取2,单位是“比特”;若 p_i=0,约定 0 \log 0 = 0)
2. 举个例子:计算不同数据集的熵
假设我们有一个简单的数据集(标签:是否去公园),共4个样本:
情况1:全部样本都是“去公园”(4个“是”,0个“否”)→ 类别完全纯净。
p_{是}=4/4=1, p_{否}=0/4=0
Ent(D) = - (1 \times \log_2 1 + 0 \times \log_2 0) = - (1 \times 0 + 0) = 0 (熵为0,最纯净!)
情况2:2个“去公园”(是),2个“不去公园”(否)→ 类别均匀分布。
p_{是}=2/4=0.5, p_{否}=2/4=0.5
Ent(D) = - (0.5 \times \log_2 0.5 + 0.5 \times \log_2 0.5) = - (0.5 \times (-1) + 0.5 \times (-1)) = 1 (熵为1,中等混乱)
情况3:1个“是”,3个“否”→ 类别偏向“否”。
p_{是}=1/4=0.25, p_{否}=3/4=0.75
Ent(D) = - (0.25 \times \log_2 0.25 + 0.75 \times \log_2 0.75) \approx - (0.25 \times (-2) + 0.75 \times (-0.415)) \approx 0.811 (熵比情况2低,更纯净)
结论:熵值越小,数据越纯净;熵值越大,数据越混乱。决策树的目标就是通过分裂特征,让分裂后的子集熵值尽可能小。
三、基尼系数(Gini Index):另一种纯度度量方式
除了信息熵,决策树算法(如CART树)还常用基尼系数来衡量数据的不纯度。它的核心思想是:基尼值越小,数据越纯净。
公式:
对于数据集 D,基尼系数 Gini(D) 的计算公式为:
Gini(D) = 1 - \sum_{i=1}^{C} p_i^2
(p_i 仍是第 i 类样本的占比)
2. 举个例子:对比信息熵与基尼系数
还是用上面的4个样本数据(是否去公园):
情况1(全“是”):p_{是}=1, p_{否}=0 → Gini(D) = 1 - (1^2 + 0^2) = 0 (最纯净)。
情况2(2“是”+2“否”):p_{是}=0.5, p_{否}=0.5 → Gini(D) = 1 - (0.5^2 + 0.5^2) = 1 - 0.5 = 0.5。
情况3(1“是”+3“否”):p_{是}=0.25, p_{否}=0.75 → Gini(D) = 1 - (0.25^2 + 0.75^2) = 1 - (0.0625 + 0.5625) \approx 0.375。
对比信息熵的结果(情况2熵=1,情况3熵≈0.811),基尼系数的数值范围和熵不同,但趋势一致:值越小,数据越纯净。
四、决策树如何用熵/基尼系数选择最优分裂?
1. 核心逻辑:分裂后子集的总不纯度下降越多越好
决策树在尝试每个可能的特征和取值(比如“天气=晴天?”“温度=高温?”)时,会计算:
分裂前的总不纯度(当前节点的熵或基尼系数)。
分裂后的总不纯度(将数据分成多个子集后,每个子集的不纯度按样本数加权求和)。
不纯度的减少量(增益):分裂前的不纯度 - 分裂后的不纯度。
最优分裂点就是让这个“不纯度减少量”最大的那个特征和取值!
2. 具体步骤(以信息熵为例)
假设当前节点有 N 个样本,我们要尝试分裂特征 A(比如“天气”),它有 V 个取值(比如“晴”“雨”)。分裂过程如下:
按特征 A 的取值 v 划分子集:将数据分成 V 组(如“天气=晴”的子集 D_1,“天气=雨”的子集 D_2)。
计算每个子集的熵:Ent(D_v)(v=1,2,…,V)。
计算分裂后的加权熵:
Ent_{split}(D,A) = \sum_{v=1}^{V} \frac{|D_v|}{|D|} Ent(D_v)
(|D_v| 是子集 D_v 的样本数,|D| 是当前节点总样本数)。
计算信息增益(Information Gain):
Gain(D,A) = Ent(D) - Ent_{split}(D,A)
(即分裂前的熵 - 分裂后的加权熵,增益越大,说明分裂后子集更纯净)。
决策树算法(如ID3树)会选择让 Gain(D,A) 最大的特征 A 作为当前节点的分裂点!
(如果是CART树,则会选择让基尼系数减少最多的特征,即最大化 Gini(D) - Gini_{split}(D,A))。
五、举个实际例子:用熵选择“是否去公园”的分裂点
假设我们有5个样本(特征:天气=晴/雨;标签:是否去公园=是/否),数据如下:
样本 | 天气 | 是否去公园 |
---|---|---|
1 | 晴 | 是 |
2 | 晴 | 是 |
3 | 雨 | 否 |
4 | 雨 | 否 |
5 | 晴 | 是 |
步骤1:计算当前节点(未分裂)的熵
总样本数 |D|=5,其中“是”(去公园)4个,“否”1个。
p_{是}=4/5=0.8, p_{否}=1/5=0.2
Ent(D) = - (0.8 \times \log_2 0.8 + 0.2 \times \log_2 0.2) \approx - (0.8 \times (-0.322) + 0.2 \times (-2.322)) \approx 0.722
步骤2:尝试按“天气”分裂
子集1(天气=晴):样本1,2,5(共3个),“是”3个,“否”0个。
p_{是}=3/3=1, p_{否}=0/3=0 → Ent(D_{晴}) = - (1 \times \log_2 1 + 0 \times \log_2 0) = 0
子集2(天气=雨):样本3,4(共2个),“是”0个,“否”2个。
p_{是}=0/2=0, p_{否}=2/2=1 → Ent(D_{雨}) = - (0 \times \log_2 0 + 1 \times \log_2 1) = 0
分裂后的加权熵:
Ent_{split}(D,天气) = \frac{3}{5} \times 0 + \frac{2}{5} \times 0 = 0
信息增益:
Gain(D,天气) = Ent(D) - Ent_{split}(D,天气) = 0.722 - 0 = 0.722
(如果尝试其他特征,比如“温度”,计算出的增益可能更小——比如只有0.3,则“天气”就是当前最优分裂点!)
六、本课小结与课后思考
本课核心:
信息熵 和 基尼系数 是量化数据纯净度的数学工具——值越小,数据越纯净。
决策树通过计算每个可能分裂点的“信息增益”(或基尼减少量),选择让子集最纯净的特征和取值作为分裂规则。
核心公式:信息增益 Gain = Ent(D) - \sum \frac{|D_v|}{|D|} Ent(D_v),增益越大越好!
课后思考题:
如果一个数据集的所有样本都属于同一类别(比如5个全是“去公园”),它的信息熵是多少?为什么?
为什么决策树不直接用“分类准确率”来选择分裂点,而是用信息熵/基尼系数?
尝试用自己的生活例子(比如判断“明天穿什么衣服”),列出可能的特征(天气、温度…),并思考如何用熵来量化“穿外套”和“不穿外套”的子集纯度?
下一课预告:我们将动手实践!用Python的sklearn
库构建第一个决策树模型(分类任务),并可视化这棵树的规则,直观看到“信息熵如何指导分裂”! 🌳📊