【机器学习】深刻理解决策树-动手计算ID3算法
一、决策树概述
决策树算法易于理解、可解释性强,是一个非常常见并且优秀的机器学习算法,可分类,也可回归。现在许多最优秀的集成模型,基础也是决策树。因此,决策树系列算法是机器学习绕不过的大山。需要进行非常系统化、深刻化的学习和理解。
在信息论中一个属性的信息增益越大,表明该属性对样本的熵减少能力越强,也就是说确定这个属性会使系统越稳定有序(熵越小系统越稳定),那么该分区的纯度也就越高。
不论一个数据集有多少特征,每次划分数据集时只能选一个特征,那么第一次选择哪个特征作为划分的参考属性才能将数据更快的分类呢?
答案一定是分类能力最好的那个特征,但问题来了,如何判断哪一个特征分类能力最好呢?可以引入一个比较感性的概念,就是纯度,分裂后越纯越好,衡量纯度有三种常见的方法,不同的衡量方法可能会导致不同的分裂。
1) ID3 算 法:Iterative Dichotomiser3,迭代二叉树三代,是最早提出的决策树算法,用信息增益作为分裂准则。
2) C4.5 算 法:C4.5由J.Ross Quinlan在ID3的基础上提出的,他是 ID3 的改进版,用信息增益率作为分类准则。
3) CART算法:Classification and Regression Tree,分类回归树,用基尼指数作为分裂准则,这种算法即可以用于分类,也可以用于回归问题。
今天我们要讲的就是第一个算法:ID3 算 法,其余两种算法将会后续推出详细的讲解,在下面的文章中,我会带着大家一步步的计算信息增益,让大家彻底理解ID3算法的原理。如果有不懂的,也可以加我交流:wuzhx2014
二、数据集介绍
下面是本例采用的数据集,包含了过去 14 天的天气因素 Outlook(天气),Temp.(温度),Humidity(湿度)、Wind(风力) 4 个特征、14 个样本,来学习一个是否去室外打球的决策树。
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
1 |
Sunny |
Hot |
High |
Weak |
No |
2 |
Sunny |
Hot |
High |
Strong |
No |
3 |
Overcast |
Hot |
High |
Weak |
Yes |
4 |
Rain |
Mild |
High |
Weak |
Yes |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
6 |
Rain |
Cool |
Normal |
Strong |
No |
7 |
Overcast |
Cool |
Normal |
Strong |
Yes |
8 |
Sunny |
Mild |
High |
Weak |
No |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
12 |
Overcast |
Mild |
High |
Strong |
Yes |
13 |
Overcast |
Hot |
Normal |
Weak |
Yes |
14 |
Rain |
Mild |
High |
Strong |
No |
对于决策树ID3算法,只有两个核心公式,计算经验熵和条件熵,我们简单回顾下:
经 验 熵:Entropy(S) = -∑ p(i) * log2p(i)
条 件 熵:Entropy(S|A) = ∑ [ p(S|A) * Entropy(S|A) ]
信息增益:Gain(S, A) = Entropy(S) -∑ [ p(S|A)* Entropy(S|A) ]
这些公式看起来可能会让人迷惑,我们从实际计算中,一步步来理解这些公式,理解了上面的三个公式,基本上也就理解了决策树这个算法。
三、经验熵计算
首先,我们需要计算整个数据集的经验熵,也就是固有的熵,数据集包含14个样本和两个类别:Yes and No,9个样本是Yes,5个样本是No。
标签 |
Yes |
No |
汇总 |
样本数 |
9 |
5 |
14 |
概率值 |
9/14 |
5/14 |
14/14 |
根据上述公式和统计数据,我们可以计算出数据集的经验熵
from math import log2
Entropy(S)
= -p(Yes)*log2p(Yes)-p(No)*log2p(No)
= -(9/14)*log2(9/14)-(5/14)*log2(5/14)
= 0.9402859586706311
经验熵计算完了,现在,我们要计算每个特征的条件熵,以及对应的信息增益,并对信息增益进行排序,选择增益最大的特征作为第一个分裂点进行分裂。
四、条件熵计算
完成了数据集经验熵的计算,就该计算每个特征分别的条件熵,以及对应的信息增益。
第一层分裂决策
数据集有四个特征,需要分别计算每个特征的条件熵,Outlook(天气),Temp.(温度),Humidity(湿度)、Wind(风力) 。
1、Wind条件熵
wind这个特征包含两个属性,weak and strong
Gain(Decision, Wind)
= Entropy(Decision)- ∑ [ p(Decision|Wind)* Entropy(Decision|Wind)]
= Entropy(Decision)-[p(Decision|Wind=Weak)*Entropy(Decision|Wind=Weak)]-[p(Decision|Wind=Strong)*Entropy(Decision|Wind=Strong)]
我们需要分别计算 (Decision|Wind=Weak) 和 (Decision|Wind=Strong)
Wind |
Yes |
No |
样本数 |
Weak |
6 |
2 |
8 |
Strong |
3 |
3 |
6 |
1)Weak 属性熵计算
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
1 |
Sunny |
Hot |
High |
Weak |
No |
3 |
Overcast |
Hot |
High |
Weak |
Yes |
4 |
Rain |
Mild |
High |
Weak |
Yes |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
8 |
Sunny |
Mild |
High |
Weak |
No |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
13 |
Overcast |
Hot |
Normal |
Weak |
Yes |
Wind=Weak这个属性的子集,共有8个样本,其中2个No和8个Yes,计算该子集的熵如下:
Entropy(Decision|Wind=Weak)
= –p(No)* log2p(No)–p(Yes) * log2p(Yes)
= -(6/8)*log2(6/8)-(2/8)*log2(2/8)
= 0.8112781244591328
注意:如果类的实例数为0,而实例总数为n,则需要计算-(0/n) .log2(0/n),定义0log20=0,熵只依赖于X的分布,与X的取值无关。这里,log(0)将等于-∞, 我们不能计算0次∞. 这是决策树应用程序中经常出现的一种特殊情况。即使编译器不能计算这个运算,我们也可以用微积分来计算,如果你想知道如何计算这个方程,请阅读这篇文章。
https://sefiks.com/2018/08/25/indeterminate-forms-and-lhospitals-rule-in-decision-trees/
2)Strong 属性熵计算
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
2 |
Sunny |
Hot |
High |
Strong |
No |
6 |
Rain |
Cool |
Normal |
Strong |
No |
7 |
Overcast |
Cool |
Normal |
Strong |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
12 |
Overcast |
Mild |
High |
Strong |
Yes |
14 |
Rain |
Mild |
High |
Strong |
No |
Wind = Strong 这个子集,一共有6个样本,其中3个Yes,3个No,计算其熵如下
Entropy(Decision|Wind=Strong)
= –p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(3/6)*log2(3/6)-(3/6)*log2(3/6)
= 1.0
3)汇总计算
Wind |
Yes |
No |
样本数 |
Weak |
6 |
2 |
8 |
Strong |
3 |
3 |
6 |
根据上面的统计数据,现在我们可以计算Wind特征的信息增益了
Gain(Decision,Wind)
= Entropy(Decision)-[p(Decision|Wind=Weak)*Entropy(Decision|Wind=Weak)]
-[p(Decision|Wind=Strong).Entropy(Decision|Wind=Strong)]
= 0.940–[(8/14).0.811 ]–[(6/14). 1]
= 0.940-(8/14)*0.811-(6/14)* 1
= 0.04799999999999999
Wind(风力)这个特征的信息增益计算结束了,现在,我们需要对其他特征应用相同的计算方法,计算出剩余每个特征的风险增益。
2、Outlook 条件熵
Outlook 这个特征有Sunny、Overcast、Rain这三个属性,分别计算每个属性的熵,然后再进行加权得到条件熵。
Outlook |
Yes |
No |
样本数 |
Sunny |
2 |
3 |
5 |
Overcast |
4 |
0 |
4 |
Rain |
3 |
2 |
5 |
1)Overcast
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
3 |
Overcast |
Hot |
High |
Weak |
Yes |
7 |
Overcast |
Cool |
Normal |
Strong |
Yes |
12 |
Overcast |
Mild |
High |
Strong |
Yes |
13 |
Overcast |
Hot |
Normal |
Weak |
Yes |
这个属性全部只有一个标签Yes,可以按下面的计算,但是会报错,可以直接按上面的规则计算(0/4)*log2(0/4)=0,所以可以知道Entropy(Decision|Outlook=Overcast)=0
Entropy(Decision|Outlook=Overcast)
=–p(No)*log2p(No)–p(Yes)*log2p(Yes)
=-(0/4)*log2(0/4)-(4/4)*log2(4/4)
ValueError: math domain error
2)Rain
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
4 |
Rain |
Mild |
High |
Weak |
Yes |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
6 |
Rain |
Cool |
Normal |
Strong |
No |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
14 |
Rain |
Mild |
High |
Strong |
No |
Rain这个属性有5个样本,其中2个No,3个Yes,按下面的方法计算该子集的熵
Entropy(Decision|Outlook=Rain)
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(2/5)*log2(2/5)-(3/5)*log2(3/5)
= 0.9709505944546686
3)Sunny
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
1 |
Sunny |
Hot |
High |
Weak |
No |
2 |
Sunny |
Hot |
High |
Strong |
No |
8 |
Sunny |
Mild |
High |
Weak |
No |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
Sunny这个属性也有有5个样本,其中2个No,3个Yes,按下面的方法计算该子集的熵
Entropy(Decision|Outlook=Sunny)
= -p(No) * log2p(No) - p(Yes) *log2p(Yes)
= -(2/5) * log2(2/5) - (3/5) *log2(3/5)
= 0.9709505944546686
现在我们可以计算Outlook特征的信息增益了
Gain(Decision, Outlook)
= Entropy(Decision)–[p(Decision|Outlook=Overcast)*Entropy(Decision|Outlook=Overcast)]–[p(Decision|Outlook=Rain)*Entropy(Decision|Outlook=Rain) –[p(Decision|Outlook=Sunny)*Entropy(Decision|Outlook=Sunny)]
= 0.940-(5/14)*0-(5/14)*0.9709-(5/14)*0.9709
= 0.24649999999999994
通过上面的计算,得到Outlook这个特征的信息增益为:Gain(Decision, Outlook)= 0.246,是不是非常简单呢。
3、Temp 特征的条件熵
Temp |
Yes |
No |
样本数 |
Cool |
3 |
1 |
4 |
Hot |
2 |
2 |
4 |
Mild |
4 |
2 |
6 |
1)Cool
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
7 |
Overcast |
Cool |
Normal |
Strong |
Yes |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
6 |
Rain |
Cool |
Normal |
Strong |
No |
Temp=Cool这个属性,一共有4个样本,3个Yes,1个No,计算熵如下:
Entropy(Decision|Temp=Cool)
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(3/4)*log2(3/4)-(1/4)*log2(1/4)
= 0.8112781244591328
2)Hot
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
3 |
Overcast |
Hot |
High |
Weak |
Yes |
13 |
Overcast |
Hot |
Normal |
Weak |
Yes |
1 |
Sunny |
Hot |
High |
Weak |
No |
2 |
Sunny |
Hot |
High |
Strong |
No |
Temp=Hot这个属性,一共有4个样本,2个Yes,2个No,计算熵如下:
Entropy(Decision|Temp=Hot)
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(2/4)*log2(2/4)-(2/4) *log2(2/4)
= 1.0
3)Mild
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
4 |
Rain |
Mild |
High |
Weak |
Yes |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
12 |
Overcast |
Mild |
High |
Strong |
Yes |
8 |
Sunny |
Mild |
High |
Weak |
No |
14 |
Rain |
Mild |
High |
Strong |
No |
Temp=Mild这个属性,一共有6个样本,4个Yes,2个No,计算熵如下:
Entropy(Decision|Temp=Mild)
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(4/6)*log2(4/6)-(2/6)*log2(2/6)
= 0.9182958340544896
4)汇总计算
Temp |
Yes |
No |
样本数 |
Cool |
3 |
1 |
4 |
Hot |
2 |
2 |
4 |
Mild |
4 |
2 |
6 |
通过统计数据可以看到,Cool占比4/14,Hot占比4/14,Mild占比6/14,加权上面的熵,得到下面的计算:
Gain(Decision,Temp.)
= Entropy(Decision)–[p(Decision|Temp.=Cool)*Entropy(Decision|Temp.=Cool)]–[p(Decision|Temp.=Hot)*Entropy(Decision|Temp.=Hot) –[p(Decision|Temp.=Mild)*Entropy(Decision|Temp.=Mild)]
= 0.940-(4/14)*0.8112-(4/14)*1.0-(6/14)*0.9182
= 0.029000000000000026
通过上面的计算,得到Outlook这个特征的信息增益为:Gain(Decision, Temp) = 0.029,又完成了一个,我们接着算下面一个一个特征Humidity 的条件熵。
4、Humidity 特征条件熵
Humidity |
Yes |
No |
样本数 |
High |
3 |
4 |
7 |
Normal |
6 |
1 |
7 |
1)High属性的熵
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
3 |
Overcast |
Hot |
High |
Weak |
Yes |
12 |
Overcast |
Mild |
High |
Strong |
Yes |
4 |
Rain |
Mild |
High |
Weak |
Yes |
1 |
Sunny |
Hot |
High |
Weak |
No |
2 |
Sunny |
Hot |
High |
Strong |
No |
14 |
Rain |
Mild |
High |
Strong |
No |
8 |
Sunny |
Mild |
High |
Weak |
No |
Humidity=High这个属性,一共有7个样本,3个Yes,4个No,计算熵如下:
Entropy(Decision|Humidity=High)
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(4/7)*log2(4/7)-(3/7)*log2(3/7)
= 0.9852281360342516
2)Normal属性的熵
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
7 |
Overcast |
Cool |
Normal |
Strong |
Yes |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
13 |
Overcast |
Hot |
Normal |
Weak |
Yes |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
6 |
Rain |
Cool |
Normal |
Strong |
No |
Humidity=High这个属性,一共有7个样本,6个Yes,1个No,计算熵如下:
Entropy(Decision|Humidity=High)
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(1/7)*log2(1/7)-(6/7)*log2(6/7)
= 0.5916727785823275
5、汇总计算
Humidity |
Yes |
No |
样本数 |
High |
3 |
4 |
7 |
Normal |
6 |
1 |
7 |
Gain(Decision,Humidity)
= Entropy(Decision)–[p(Decision|Humidity=High)*Entropy(Decision|Humidity=High)]–[p(Decision|Humidity=Normal)*Entropy(Decision|Humidity=Normal)
= 0.940-(7/14)*0.98522-(7/14)*0.5916
= 0.15158999999999995
通过上面的计算,得到Humidity这个特征的信息增益为:Gain(Decision, Humidity) = 0.151 ,又完成了一个,我们接着算下面一个一个特征Humidity 的条件熵。
到此我们完成了所有特征的信息增益的计算,对所有特征进行排序,找增益最大的进行分列
排序后分裂
Feature |
Gain |
排名 |
Outlook |
0.246 |
1 |
Temperature |
0.029 |
4 |
Humidity |
0.151 |
2 |
Wind |
0.048 |
3 |
所以我们选择 outlook 这个特征作为第一次分裂特征,也是就决策树的根
Root decision on the tree
现在,我们需要进一步计算第二层的分裂特征的选择,在outlook分裂后的子集中计算。
第二层分裂决策
第一层分裂的特征决定了,那就要根据分裂的结果,进行第二层的分裂,同第一层,也是需要计算每个子集的经验熵 + 条件熵。
数据集第一步被Outlook 这个特征分裂成三个节点,现在需要对每个节点计算下一步的分裂特征。
1、Outlook -Overcast 节点
在overcast这个分支上,标签全部是yes,也就是已经彻底的完成了分裂了,这个就可以作为叶子节点,无需继续分裂。
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
3 |
Overcast |
Hot |
High |
Weak |
Yes |
7 |
Overcast |
Cool |
Normal |
Strong |
Yes |
12 |
Overcast |
Mild |
High |
Strong |
Yes |
13 |
Overcast |
Hot |
Normal |
Weak |
Yes |
无需继续分裂!!
2、Outlook-Sunny节点
在sunny 这个属性下面,还存在5个样本,包含3/5 的No, 2/5 的Yes,还需要继续分裂,所以这一层,我们重复上述的步骤,先计算这个子集的经验熵,然后计算每个特征的信息增益,找到最佳的分割特征。
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
1 |
Sunny |
Hot |
High |
Weak |
No |
2 |
Sunny |
Hot |
High |
Strong |
No |
8 |
Sunny |
Mild |
High |
Weak |
No |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
1)计算子集经验熵
首先我们计算Outlook=Sunny子集的经验熵
Entropy(Outlook=Sunny )
= -p(No)*log2p(No)-p(Yes)*log2p(Yes)
= -(3/5)*log2(3/5)-(2/5) *log2(2/5)
= 0.97095
下面计算每个特征的经验熵和信息增益。
2)Gain(Outlook=Sunny|Temp.)
Temp. |
Yes |
No |
样本数 |
Hot |
0 |
2 |
2 |
Cool |
1 |
0 |
1 |
Mild |
1 |
1 |
2 |
根据上面的统计数据,计算特征Temp.的条件熵
Entropy(Outlook=Sunny|Temp.) =
2/5*(-(0/2)*log2(0/2)-(2/2)*log2(2/2))+
1/5*(-(1/1)*log2(1/1)-(0/1)*log2(0/1))+
2/5*(-(1/2)*log2(1/2)-(1/2)*log2(1/2))
= 0.4
计算得到Temp.特征的信息增益
Gain(Outlook=Sunny|Temp.) =
Entropy(Outlook=Sunny)-Entropy(Outlook=Sunny|Temp.)
= 0.97095-0.4
= 0.57095
根据上面的计算,可以得到最终的信息增益为:Gain(Outlook=Sunny|Temp.)=0.570
3)Gain(Outlook=Sunny|Humidity)
Humidity |
Yes |
No |
样本数 |
High |
0 |
3 |
3 |
Normal |
2 |
0 |
2 |
根据上面的统计数据,计算特征Humidity的条件熵
Entropy(Outlook=Sunny|Humidity) =
3/5*(-(0/3)*log2(0/3)-(3/3)*log2(3/3))+
2/5*(-(2/2)*log2(2/2)-(0/2)*log2(0/2))+
= 0
计算得到Temp.特征的信息增益
Gain(Outlook=Sunny|Humidity) = Entropy(Outlook=Sunny)-Entropy(Outlook=Sunny|Humidity)
= 0.97095-0
= 0.97095
4)Gain(Outlook=Sunny|Wind)
Wind |
Yes |
No |
样本数 |
Weak |
1 |
2 |
3 |
Strong |
1 |
1 |
2 |
根据上面的统计数据,计算特征Temp.的条件熵
Entropy(Outlook=Sunny|Humidity) =
3/5*(-(1/3)*log2(1/3)-(2/3)*log2(2/3))+
2/5*(-(1/2)*log2(1/2)-(1/2)*log2(1/2))+
= 0.9509775004326937
计算得到Temp.特征的信息增益
Gain(Outlook=Sunny|Humidity)
= Entropy(Outlook=Sunny)-Entropy(Outlook=Sunny|Humidity)
= 0.97095-0.9509775004326937 = 0.01997249956730629
5)增益排序
Gain(Outlook=Sunny|Temp.) = 0.570
Gain(Outlook=Sunny|Humidity) = 0.970
Gain(Outlook=Sunny|Wind) = 0.019
可以看到,humidity 是增益最高的,我们就按这个特征进行分裂,分裂结果如下,两个分支都是纯度百分百了
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
1 |
Sunny |
Hot |
High |
Weak |
No |
2 |
Sunny |
Hot |
High |
Strong |
No |
8 |
Sunny |
Mild |
High |
Weak |
No |
On the other hand, decision will always be yes if humidity were normal
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
9 |
Sunny |
Cool |
Normal |
Weak |
Yes |
11 |
Sunny |
Mild |
Normal |
Strong |
Yes |
3、Outlook -Rain 节点
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
4 |
Rain |
Mild |
High |
Weak |
Yes |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
6 |
Rain |
Cool |
Normal |
Strong |
No |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
14 |
Rain |
Mild |
High |
Strong |
No |
1)计算子集经验熵
我们计算Outlook=Rain子集的经验熵,在Outlook=Rain这个节点下,一共有5个样本,3个Yes,2个No,我们可以算出这个子集的经验熵。
Entropy(Outlook=Rain)
= – p(No)*log2p(No)–p(Yes)*log2p(Yes)
= - (2/5)*log2(2/5)-(3/5)*log2(3/5)
= 0.97095
2)Gain(Outlook=Rain | Temp)
Temp. |
Yes |
No |
样本数 |
Cool |
1 |
1 |
2 |
Mild |
2 |
1 |
3 |
根据上面的统计数据,可以计算出子集的熵
Entropy(Outlook=Rain|Temp)
= 2/5*(-(1/2)*log2(1/2)-(1/2)*log2(1/2))+3/5*(-(2/3)*log2(2/3)-(1/3)*log2(1/3))
= 0.9509775
Gain(Outlook=Rain|Temp)
= Entropy(Outlook=Rain)-Entropy(Outlook=Rain|Temperature)
= 0.97095-0.9509775
= 0.01997
计算得到Temp特征的信息增益为:Gain(Outlook=Rain | Temp)=0.01997
3)Gain(Outlook=Rain | Humidity)
Humidity |
Yes |
No |
样本数 |
High |
1 |
1 |
2 |
Normal |
2 |
1 |
3 |
根据上面的统计数据,可以计算出子集的熵
Entropy(Outlook=Rain|Humidity)
= 2/5*(-(1/2)*log2(1/2)-(1/2)*log2(1/2))+\3/5*(-(2/3)*log2(2/3) - (1/3) * log2(1/3))
= 0.9509775Gain(Outlook=Rain | Humidity)
= Entropy(Outlook=Rain)-Entropy(Outlook=Rain|Temperature)
= 0.97095-0.9509775 = 0.01997
计算得到Humidity特征的信息增益为:Gain(Outlook=Rain | Humidity)=0.01997,与上面的Temperature特征一样
4)Gain(Outlook=Rain | Wind)
Wind |
Yes |
No |
样本数 |
Weak |
3 |
0 |
3 |
Strong |
0 |
2 |
2 |
根据上面的统计数据,可以计算出子集的熵
Entropy(Outlook=Rain|Wind)
= 3/5*(-(0/3)*log2(0/3)-(3/3)*log2(3/3))+2/5*(-(0/2)*log2(0/2)-(2/2) * log2(2/2))
= 0Gain(Outlook=Rain | Humidity)
= Entropy(Outlook=Rain)-Entropy(Outlook=Rain|Wind)
= 0.97095-0
= 0.97095
计算得到Wind特征的信息增益为:Gain(Outlook=Rain | Wind) =0.97095
综上,可以得到下面的结论,因此Wind的信息增益最大,选做本节点的分列特征
Gain(Outlook=Rain | Temperature) = 0.0199730940219748
Gain(Outlook=Rain | Humidity) = 0.0199730940219748
Gain(Outlook=Rain | Wind) = 0.9709505944546686
分列后得到下面两个叶子节点,叶子节点的纯度都为100%,也就是只有一个标签类型,因此无需继续分列。
Wind = Weak
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
4 |
Rain |
Mild |
High |
Weak |
Yes |
5 |
Rain |
Cool |
Normal |
Weak |
Yes |
10 |
Rain |
Mild |
Normal |
Weak |
Yes |
Wind = Strong
Day |
Outlook |
Temp. |
Humidity |
Wind |
Decision |
6 |
Rain |
Cool |
Normal |
Strong |
No |
14 |
Rain |
Mild |
High |
Strong |
No |
五、决策树生成
综合第一、第二层的计算,我们得到了最终的决策树如下:
Final version of decision tree
往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件
本站qq群955171419,加入微信群请扫码:
【机器学习】深刻理解决策树-动手计算ID3算法相关推荐
- 自编程实现决策树(使用ID3算法)
自编程实现决策树(使用ID3算法) 不使用sklearn中的决策树方法,根据以下数据集自己编写决策树构建程序(建议用python语言). Tid Refund Marital Status Taxab ...
- 决策树的生成—ID3算法
决策树的生成-ID3算法 算法由来: 决策树算法最开始是由Hunt Earl B提出的CLS(Concept Learning System),但是没有给出采用什么方法选择最优特征,后面罗斯昆(J. ...
- 机器学习:决策树(Decision Tree)--ID3算法
决策树的主要算法 构建决策树的关键:按照什么样的次序来选择变量(属性/特征)作为分类依据. 根据不同的目标函数,建立决策树主要有以下三种算法 ID3(J.Ross Quinlan-1975) 核心:信 ...
- 决策树模型 - (ID3算法、C4.5算法) - Python代码实现
目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 ...
- 十五、机器学习中的决策树和随机森林算法
@Author:Runsen 决策树是解决分类和回归问题的一种常见的算法.决策树算法采用树形结构,每一次选择最优特征,来实现最终的分类,因此决策树是一种递归的算法.但是,决策树很容易产生过拟合现象,最 ...
- 决策树的生成-ID3算法生成_例题详解
数据集: 判断特征集是否是空集,进行下一步 选择信息增益最大的那个特征作为根节点,以"有自己的房子"作为限定条件看其他特征 D1(有自己的房子)不确定性为0,以D2(没有自己的房子 ...
- 利用计算机语言实现ID3算法,机器学习之决策树学习-id3算法-原理分析及c语言代码实现.pdf...
机器学习之决策树学习-id3算法-原理分析及c语言代码实现.pdf 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保 ...
- 决策树(1)——ID3算法与C4.5算法的理论基础与python实现
1.前言 决策树是一种常用的机器学习算法,既可以做分类任务也可以做回归任务,本文主要讨论用于分类任务的决策树.决策树与数据结构中的树相同,也是由一个根结点.若干个内部结点和若干个叶结点构成.这里我 ...
- 使用ID3算法构造决策树——python
任务描述 本关任务:补充python代码,完成DecisionTree类中的fit和predict函数. 相关知识 为了完成本关任务,你需要掌握: ID3算法构造决策树的流程 如何使用构造好的决策树进 ...
最新文章
- MYSQL连接字符串参数详细解析(大全参考)
- 每个程序员都应该了解的内存知识
- 使用PHP处理Kafka消息
- 北漂周记--第2记--培训开始
- 1、jquery事件绑定和委托的实现
- centos6.5 安装多个mysql_在centos6,5(64位)系统安装多实例mysql5.6
- AppTheme 属性详解
- Spring 5的最终功能发行版即将来临
- Python通过WMI读取主板BIOS信息
- Linux 上关于iptables
- VB连接ACCESS数据库
- 运放输入偏置电流方向_运放-输入偏置电流与输入失调电流
- 我孩子的毛毯教会了我关于技术和古希腊人的知识
- 英雄无敌6服务器在哪个文件夹,魔法门英雄无敌6:生物-墓园资料
- wordpress初体验
- 计算机毕业设计(75)php小程序毕设作品之网上销售小程序商城系统
- fractal php,为 Laravel 应用程序构建的 Fractal
- shell参数带有空格问题
- turtle实现一团乱麻和甜甜圈
- MySQL数据库程序设计(二)
热门文章
- Java Dom解析xml
- C++求解最大子序列和问题
- 阶段1 语言基础+高级_1-2 -面向对象和封装_9两个引用指向同一个对象空间
- MySQL数据库“十宗罪”(十大经典错误案例)
- 一霎清明雨,实现考勤管理。
- bzoj2875: [Noi2012]随机数生成器
- [原创]位运算符实现两个整数加法运算
- 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core
- CTO 比普通程序员强在哪?
- mysql merge表介绍