【Python机器学习】3.2. 决策树理论(进阶):ID3算法、信息熵原理、信息增益

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

本文承接 3.1. 决策树理论(基础),没看过的建议先看前文。

3.2.1. ID3算法数学原理

ID3方法利用信息熵原理 选择信息增益最大的属性作为分类属性,递归地拓展决策树的分支,完成决策树的构造。

信息熵(entropy)是度量随机变量不确定性的指标。熵越大,变量的不确定性就越大。假定当前样本集合 D D D中第 k k k类样本所占的比例为 p k p_k pk,则 D D D的信息熵为:
Ent ( D ) = − ∑ k = 1 ∣ y ∣ p k log ⁡ 2 p k \text{Ent}(D) = - \sum_{k=1}^{|y|} p_k \log_2 p_k Ent(D)=−k=1∑∣y∣pklog2pk
E n t ( D ) Ent(D) Ent(D)的值越小,变量的不确定性越小。 p k = 1 p_k=1 pk=1时,就只有一种情况,代表没有不确定性,所以熵就是 E n t ( D ) = 0 Ent(D) = 0 Ent(D)=0。

根据信息熵,可以计算以属性 a a a进行样本划分带来的信息增益:
Gain ( D , a ) = Ent ( D ) − ∑ v = 1 V D v D Ent ( D v ) \text{Gain}(D, a) = \text{Ent}(D) - \sum_{v=1}^{V} \frac{D^v}{D} \text{Ent}(D^v) Gain(D,a)=Ent(D)−v=1∑VDDvEnt(Dv)

  • V V V为根据属性 a a a划分出的类别数
  • D D D为当前样本总数
  • D v D^v Dv为类别 v v v样本数,也就是属性 a a a取值 v v v时的子数据集。

其中:

  • Ent ( D ) \text{Ent}(D) Ent(D)是划分前的信息熵,在划分前,数据集 D D D可能包含多个类别

  • ∑ v = 1 V D v D Ent ( D v ) \sum_{v=1}^{V} \frac{D^v}{D} \text{Ent}(D^v) ∑v=1VDDvEnt(Dv)是划分后的信息熵:

    • 通过属性 a a a进行划分后, D D D被分割成多个子集 D 1 D^1 D1, D 2 D^2 D2, ... \dots ..., D V D^V DV,每个子集有各自的信息熵 Ent ( D v ) \text{Ent}(D^v) Ent(Dv)
    • 计算时,每个子集的信息熵按其占总数据集的比例 D v D \frac{D^v}{D} DDv进行加权求和

假如我们有以下数据:

ID 动力 想提升能力 有兴趣 时间 类别
1 一般
2 一般
3 很强
4 一般
5 一般
6 一般
7 一般
8 一般
9 很强
10 很弱

假如我们要算动力的信息增益:

  • 属性 a a a就是动力
  • 类别数 V V V就是3(动力有一般、很强、很弱三个类别)
  • 样本总数 D D D就是10

3.2.2. 举例计算

使用ID3的目标就是划分后样本分布不确定性尽可能小,即划分后信息熵小,信息增益大。

我们就使用上文表格里的数据来计算该使用哪一个因子作为顶点节点。

为了判断属性,我们得计算每一个属性下对应的信息增益。

先计算进行属性划分之前的信息熵,套用公式:

  • 总共有两个类别------"是"和"否"
  • "否"一共有6
  • 所以 p 1 = 6 / 10 p_1 = 6/10 p1=6/10, p 2 = 4 / 10 p_2 = 4/10 p2=4/10

代入公式:
Ent ( D ) = − ( 6 10 log ⁡ 2 6 10 + 4 10 log ⁡ 2 4 10 ) ≈ 0.971 \text{Ent}(D) = - \left( \frac{6}{10} \log_2 \frac{6}{10} + \frac{4}{10} \log_2 \frac{4}{10} \right) \approx 0.971 Ent(D)=−(106log2106+104log2104)≈0.971

这是属性划分之前的信息熵,接下来计算划分之后的,这里我们取兴趣这个属性为例:

属性有两种划分------"是"和"否",那我们就分别计算"是"和"否"对应的信息熵然后乘上比例再求和:

"否"有5个,且每当兴趣为"否"时最后的类别一栏的值就是"否",没有其它可能性,就代表 E n t ( D 1 ) = 0 Ent(D_1) = 0 Ent(D1)=0。

"是"有5个,且当兴趣为"否"时最后的类别一栏的值有1个是"否",4个是"是",也就是 p 1 = 1 / 5 p_1 = 1/5 p1=1/5, p 2 = 2 / 5 p_2 = 2/5 p2=2/5,带入计算 E n t ( D 2 ) Ent(D_2) Ent(D2):
Ent ( D 2 ) = − ( 1 5 log ⁡ 2 1 5 + 2 5 log ⁡ 2 2 5 + 2 5 log ⁡ 2 2 5 ) ≈ 1.52 \text{Ent}(D_2) = - \left( \frac{1}{5} \log_2 \frac{1}{5} + \frac{2}{5} \log_2 \frac{2}{5} + \frac{2}{5} \log_2 \frac{2}{5} \right) \approx 1.52 Ent(D2)=−(51log251+52log252+52log252)≈1.52

有了这些信息就可以计算划分后的信息熵:
∑ v = 1 V D v D Ent ( D v ) = − [ 5 10 × E n t ( D 1 ) + 5 10 × E n t ( D 2 ) ] \sum_{v=1}^{V} \frac{D^v}{D} \text{Ent}(D^v) = -[ \frac{5}{10} \times Ent(D_1) + \frac{5}{10} \times Ent(D_2)] v=1∑VDDvEnt(Dv)=−[105×Ent(D1)+105×Ent(D2)]

最后的结果是:
∑ v = 1 V D v D Ent ( D v ) ≈ − 0.361 \sum_{v=1}^{V} \frac{D^v}{D} \text{Ent}(D^v) \approx - 0.361 v=1∑VDDvEnt(Dv)≈−0.361

再把这个结果带入计算信息增益的函数即可:
G a i n = E n t ( D ) − ∑ v = 1 V D v D Ent ( D v ) ≈ 0.971 − 0.341 = 0.61 Gain = Ent(D) - \sum_{v=1}^{V} \frac{D^v}{D} \text{Ent}(D^v) \approx 0.971 - 0.341 = 0.61 Gain=Ent(D)−v=1∑VDDvEnt(Dv)≈0.971−0.341=0.61

我们把其他也算出来,方法同上,我就只展示结果不展示过程了:

动力 能力 兴趣 时间
Ent 0.6 0.55 0.36 0.55
Gain 0.37 0.42 0.61 0.42

我们发现以兴趣进行划分的信息增益最大,也就是以兴趣作为节点划分的结果不确定性是最小的,所以我们应该把兴趣作为第一个节点。

3.2.3. 最终效果

我们可以看一下决策树算法最后算出来的效果:
兴趣 ≤ 0.5 entropy = 0.971 samples = 10 value = [6, 4] class = 不合适 entropy = 0.0 samples = 5 value = [5, 0] class = 不合适 时间 ≤ 0.5 entropy = 0.722 samples = 5 value = [1, 4] class = 合适 entropy = 0.0 samples = 1 value = [1, 0] class = 不合适 entropy = 0.0 samples = 4 value = [0, 4] class = 合适

可以看到,原本有4个属性,但是这里只是用了2个属性就把所有可能性划分出来了(基于表格提供的数据)。

相关推荐
钢铁男儿1 小时前
Python 生成数据(随机漫步)
开发语言·python·信息可视化
赛卡1 小时前
自动驾驶背后的数学:特征提取中的线性变换与非线性激活
人工智能·python·机器学习·自动驾驶·numpy
正经教主1 小时前
【菜鸟飞】在vsCode中安装python的ollama包出错的问题
开发语言·人工智能·vscode·python·ai·编辑器
猎人everest1 小时前
机器学习之MNIST手写数据集
人工智能·机器学习
Conqueror7121 小时前
机器学习丨八股学习分享 EP2
人工智能·机器学习
WBingJ2 小时前
深度学习零碎知识
人工智能·机器学习
ylfhpy2 小时前
Java面试黄金宝典1
java·开发语言·算法·面试·职场和发展
墨绿色的摆渡人3 小时前
pytorch小记(十):pytorch中torch.tril 和 torch.triu 详解
人工智能·pytorch·python
神秘的土鸡3 小时前
Centos搭建Tomcat服务器:我的实战经验分享(成功版本 详细!)
linux·开发语言·python·tomcat·web
Shawn_Shawn3 小时前
从 0 到 1:机器学习小白的起航指南
人工智能·机器学习