一步一步学习 ID3 算法

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


决策树算法将原始数据转换为基于规则的决策树。这里 ID3 是最常见的决策树算法之一。首先,它于 1986 年推出,它是 Iterative Dichotomiser 的首字母缩写。

首先,二分法意味着,我们会把东西分成两个完全相反的东西。这就是为什么,算法迭代地将属性分为两组,这两组是最主要的属性,另一组是构造树。然后,它计算每个属性的熵和信息增益。通过这种方式,可以建立最主要的属性。在那之后,最主要的一个被放在树上作为决策节点。此后,将在其他属性中再次计算熵和增益分数。因此,找到了下一个最主要的属性。最后,这个过程一直持续到该分支的结束位置,这就是为什么它被称为 Iterative Dichotomiser。所以,我们将在这篇文章中逐步提到算法。

例如,下表通知了在过去 14 天内在外面打网球的决策因素。

DayOutlookTemp.HumidityWindDecision
1SunnyHotHighWeakNo
2SunnyHotHighStrongNo
3OvercastHotHighWeakYes
4RainMildHighWeakYes
5RainCoolNormalWeakYes
6RainCoolNormalStrongNo
7OvercastCoolNormalStrongYes
8SunnyMildHighWeakNo
9SunnyCoolNormalWeakYes
10RainMildNormalWeakYes
11SunnyMildNormalStrongYes
12OvercastMildHighStrongYes
13OvercastHotNormalWeakYes
14RainMildHighStrongNo

我们可以总结 ID3 算法,如下所示:

E n t r o p y ( S ) = ∑ − p ( x ) ∗ l o g 2 p ( x ) Entropy(S) = \sum - p(x) * log_2p(x) Entropy(S)=p(x)log2p(x)

G a i n ( S , A ) = E n t r o p y ( S ) − ∑ [ p ( S ∣ A ) ∗ E n t r o p y ( S ∣ A ) ] Gain(S, A) = Entropy(S) - \sum[p(S|A)*Entropy(S|A)] Gain(S,A)=Entropy(S)[p(SA)Entropy(SA)]

这些公式可能现在会让你大吃一惊,但是后续我们会让他变得更加简单。

熵(Entropy)

我们需要先计算熵,上面的表中决策列由 14 个实例组成,包括两个标签:yes 和 no。他们有 9 个 yes 和 5 个 no 组成。

E n t r o p y ( D e c i s i o n ) = − p ( y e s ) ∗ l o g 2 p ( y e s ) − p ( n o ) ∗ l o g 2 p ( n o ) = − 9 14 ∗ l o g 2 9 14 − 5 14 ∗ l o g 2 5 14 = 0.940 Entropy(Decision) = -p(yes) * log_2p(yes) - p(no)*log_2p(no) = -\frac{9}{14} * log_2\frac{9}{14}-\frac{5}{14}*log_2\frac{5}{14} = 0.940 Entropy(Decision)=p(yes)log2p(yes)p(no)log2p(no)=149log2149145log2145=0.940

现在,我们需要找到决策最主要的因素。

Wind 因素对决定的影响

G a i n ( D e c i s i o n , W i n d ) = E n t r o p y ( D e c i s i o n ) − ∑ [ p ( D e c i s i o n ∣ W i n d ) ∗ E n t r o p y ( D e c i s i o n ∣ W i n d ) ] Gain(Decision, Wind) = Entropy(Decision) - \sum[p(Decision|Wind) * Entropy(Decision|Wind)] Gain(Decision,Wind)=Entropy(Decision)[p(DecisionWind)Entropy(DecisionWind)]

Wind 属性有两个标签:weak 和 strong。我们会将其反映在公式中。

G a i n ( D e c i s i o n , W i n d ) = E n t r o p y ( D e c i s i o n ) − [ p ( D e c i s i o n ∣ W i n d = w e a k ) ∗ E n t r o p y ( D e c i s i o n ∣ W i n d = w e a k ) ] − [ p ( D e c i s i o n ∣ W i n d = s t r o n g ) ∗ E n t r o p y ( D e c i s i o n ∣ W i n d = s t r o n g ) ] Gain(Decision, Wind) = Entropy(Decision) - [p(Decision|Wind=weak)*Entropy(Decision|Wind=weak)] - [p(Decision|Wind=strong) * Entropy(Decision|Wind=strong)] Gain(Decision,Wind)=Entropy(Decision)[p(DecisionWind=weak)Entropy(DecisionWind=weak)][p(DecisionWind=strong)Entropy(DecisionWind=strong)]

现在,我们需要分别计算 (Decision|Wind=weak) 和 (Decision|Wind=strong) 。

weak wind因素决定

DayOutlookTemp.HumidityWindDecision
1SunnyHotHighWeakNo
3OvercastHotHighWeakYes
4RainMildHighWeakYes
5RainCoolNormalWeakYes
8SunnyMildHighWeakNo
9SunnyCoolNormalWeakYes
10RainMildNormalWeakYes
13OvercastHotNormalWeakYes

weak 因子有 8 个例子。其中,2个是 no 的决定,6 个是 yes 的决定,如上图所示。

E n t r o p y ( D e c i s i o n ∣ W i n d = W e a k ) = − p ( n o ) ∗ l o g 2 p ( n o ) − p ( y e s ) ∗ l o g 2 p ( y e s ) = − 2 8 ∗ l o g 2 2 8 − 6 8 ∗ l o g 2 6 8 = 0.811 Entropy(Decision|Wind=Weak)=-p(no)*log_2p(no)-p(yes)*log_2p(yes) = -\frac{2}{8}*log_2\frac{2}{8} - \frac{6}{8}*log_2\frac{6}{8} = 0.811 Entropy(DecisionWind=Weak)=p(no)log2p(no)p(yes)log2p(yes)=82log28286log286=0.811

strong wind因素决定

DayOutlookTemp.HumidityWindDecision
2SunnyHotHighStrongNo
6RainCoolNormalStrongNo
7OvercastCoolNormalStrongYes
11SunnyMildNormalStrongYes
12OvercastMildHighStrongYes
14RainMildHighStrongNo

这里有 6 个 strong 因子,Decision 也被分为了两部分:

E n t r o p y ( D e c i s i o n ∣ W i n d = s t r o n g ) = − p ( n o ) ∗ l o g 2 p ( n o ) − p ( y e s ) ∗ l o g 2 p ( y e s ) = − 3 6 ∗ l o g 2 3 6 − 3 6 ∗ l o g 2 36 = 1 Entropy(Decision | Wind = strong) = -p(no)*log_2p(no) - p(yes)*log_2p(yes) = -\frac{3}{6}*log_2\frac{3}{6} - \frac{3}{6}*log_2{3}{6} = 1 Entropy(DecisionWind=strong)=p(no)log2p(no)p(yes)log2p(yes)=63log26363log236=1

现在,我们可以回到 G a i n ( D e c i s i o n , W i n d ) Gain(Decision, Wind) Gain(Decision,Wind) 方式。

G a i n ( D e c i s i o n , W i n d ) = E n t r o p y ( D e c i s i o n ) − [ p ( D e c i s i o n ∣ W i n d = w e a k ) ∗ E n t r o p y ( D e c i s i o n ∣ W i n d = W e a k ) ] − [ p ( D e c i s i o n ∣ W i n d = s t r o n g ) ∗ E n t r o p y ( D e c i s i o n ∣ W i n d = S t r o n g ) ] = 0.940 − [ 8 14 ∗ 0.811 ] − [ 6 14 ∗ 1 ] = 0.048 Gain(Decision, Wind) = Entropy(Decision)-[p(Decision|Wind=weak)*Entropy(Decision|Wind=Weak)]-[p(Decision|Wind=strong)*Entropy(Decision|Wind=Strong)] = 0.940-[\frac{8}{14}*0.811]-[\frac{6}{14}*1]=0.048 Gain(Decision,Wind)=Entropy(Decision)[p(DecisionWind=weak)Entropy(DecisionWind=Weak)][p(DecisionWind=strong)Entropy(DecisionWind=Strong)]=0.940[1480.811][1461]=0.048

所以 wind 因子的计算结束了,现在,我们可以对其它列进行相同的计算,以找到最主要的因素。

另外因子如下计算

我们可以用相同的方法计算 Outlook,Temperature和Humidity 因子的信息增益。

G a i n ( D e c i s i o n , O u t l o o k ) = 0.246 Gain(Decision, Outlook) = 0.246 Gain(Decision,Outlook)=0.246

G a i n ( D e c i s i o n , T e m p e r a t u r e ) = 0.029 Gain(Decision, Temperature)=0.029 Gain(Decision,Temperature)=0.029

G a i n ( D e c i s i o n , H u m i d i t y ) = 0.151 Gain(Decision, Humidity)=0.151 Gain(Decision,Humidity)=0.151

正如我们所看到的,outlook 因子是拥有最高的分数。这也是为什么,outlook 因子会出现在树的根节点的原因。

在这里插入图片描述

现在,我们需要测试 outlook 因子的自定义子集的数据集。

overcast 因子对 outlook 的决策

基本上,如果 outlook = overcast,那么 decision 一直是 yes 。

DayOutlookTemp.HumidityWindDecision
3OvercastHotHighWeakYes
7OvercastCoolNormalStrongYes
12OvercastMildHighStrongYes
13OvercastHotNormalWeakYes
sunny 因子作为 outlook 的决策
DayOutlookTemp.HumidityWindDecision
1SunnyHotHighWeakNo
2SunnyHotHighStrongNo
8SunnyMildHighWeakNo
9SunnyCoolNormalWeakYes
11SunnyMildNormalStrongYes

这里有 5 个 outlook = sunny 的实例,decision = yes 的概率是2/5,decision=no 的概率是 3/5 。

E n t r o p y ( O u t l o o k = S u n n y ) = − 3 5 ∗ l o g 2 3 5 − 2 5 ∗ l o g 2 2 5 = 0.971 Entropy(Outlook=Sunny) = -\frac{3}{5}*log_{2}{\frac{3}{5}}-\frac{2}{5}*log_{2}{\frac{2}{5}} = 0.971 Entropy(Outlook=Sunny)=53log25352log252=0.971

E n t r o p y ( O u t l o o k = S u n n y ∣ T e m p . = H o t ) = − 0 − 2 2 ∗ l o g 2 2 2 = 0 Entropy(Outlook=Sunny | Temp. = Hot) = -0-\frac{2}{2}*log_{2}{\frac{2}{2}} = 0 Entropy(Outlook=SunnyTemp.=Hot)=022log222=0

E n t r o p y ( O u t l o o k = S u n n y ∣ T e m p . = C o o l ) = 0 Entropy(Outlook=Sunny|Temp. = Cool)=0 Entropy(Outlook=SunnyTemp.=Cool)=0

E n t r o p y ( O u t l o o k = S u n n y ∣ T e m p . = M i l d ) = − 1 2 ∗ l o g 2 1 2 − 1 2 ∗ l o g 2 1 2 = 1 Entropy(Outlook=Sunny|Temp.=Mild)=-\frac{1}{2}*log_{2}{\frac{1}{2}}-\frac{1}{2}*log_{2}{\frac{1}{2}}=1 Entropy(Outlook=SunnyTemp.=Mild)=21log22121log221=1

G a i n ( O u t l o o k = S u n n y ∣ T e m p . ) = E n t r o p y ( O u t l o o k = S u n n y ) − [ p ( O u t l o o k = S u n n y ∣ T e m p . = H o t ) ∗ E n t r o p y ( O u t l o o k = S u n n y ∣ T e m p . = H o t ) + p ( O u t l o o k = S u n n y ∣ T e m p . = C o o l ) ∗ E n t r o p y ( O u t l o o k = S u n n y ∣ T e m p . = C o o l ) + p ( O u t l o o k = S u n n y ∣ T e m p . = M i l d ) ∗ E n t r o p y ( O u t l o o k = S u n n y ∣ T e m p . = M i l d ) = 0.571 Gain(Outlook=Sunny|Temp.) = Entropy(Outlook=Sunny)-[p(Outlook=Sunny|Temp.=Hot)*Entropy(Outlook=Sunny|Temp.=Hot)+p(Outlook=Sunny|Temp.=Cool)*Entropy(Outlook=Sunny|Temp.=Cool)+p(Outlook=Sunny|Temp.=Mild)*Entropy(Outlook=Sunny|Temp.=Mild)=0.571 Gain(Outlook=SunnyTemp.)=Entropy(Outlook=Sunny)[p(Outlook=SunnyTemp.=Hot)Entropy(Outlook=SunnyTemp.=Hot)+p(Outlook=SunnyTemp.=Cool)Entropy(Outlook=SunnyTemp.=Cool)+p(Outlook=SunnyTemp.=Mild)Entropy(Outlook=SunnyTemp.=Mild)=0.571

同理,我们可以计算出:

G a i n ( O u t l o o k = S u n n y ∣ H u m i d i t y ) = 0.970 Gain(Outlook=Sunny|Humidity)=0.970 Gain(Outlook=SunnyHumidity)=0.970

G a i n ( O u t l o o k = S u n n y ∣ W i n d ) = 0.019 Gain(Outlook=Sunny|Wind)=0.019 Gain(Outlook=SunnyWind)=0.019

现在,我们选择 humidity 作为决策因子,因为它拥有最高分,从表中我们可以看出,如果 humidity=High,那么我们一直不会去打网球。

DayOutlookTemp.HumidityWindDecision
1SunnyHotHighWeakNo
2SunnyHotHighStrongNo
8SunnyMildHighWeakNo

从另一方面说,如果 humidity=Normal,那么我们就一定会去打网球。

DayOutlookTemp.HumidityWindDecision
9SunnyCoolNormalWeakYes
11SunnyMildNormalStrongYes

最后,这意味着,如果 outlook = Sunny,那么我们只需要检查 humidity 就行了。

rain 因子作为 outlook 的决策
DayOutlookTemp.HumidityWindDecision
4RainMildHighWeakYes
5RainCoolNormalWeakYes
6RainCoolNormalStrongNo
10RainMildNormalWeakYes
14RainMildHighStrongNo

G a i n ( O u t l o o k = R a i n ∣ T e m p . ) = ? ? ? Gain(Outlook=Rain|Temp.) = ??? Gain(Outlook=RainTemp.)=???

G a i n ( O u t l o o k = R a i n ∣ H u m i d i t y ) = ? ? ? Gain(Outlook=Rain|Humidity)=??? Gain(Outlook=RainHumidity)=???

G a i n ( O u t l o o k = R a i n ∣ W i n d ) = ? ? ? Gain(Outlook=Rain|Wind)=??? Gain(Outlook=RainWind)=???

大家可以自己计算一下,如果 outlook=rain,那么 wind 因子将会获得最高的分数,这也是为什么我们需要把 wind 因子作为第二层节点。

因此,如果wind=weak,outlook=rain,那么决策将永远是肯定的。

DayOutlookTemp.HumidityWindDecision
4RainMildHighWeakYes
5RainCoolNormalWeakYes
10RainMildNormalWeakYes

更重要的是,如果wind=strong,outlook=rain,那么决策将永远是否定的,即我不会出去打网球。

DayOutlookTemp.HumidityWindDecision
6RainCoolNormalStrongNo
14RainMildHighStrongNo

因此,决策树的构建已经结束了,我们可以使用下图来表示。

在这里插入图片描述

结论

因此,决策树算法将原始数据转换为基于规则的机制。在这篇文章中,我们提到了一种最常见的决策树算法,名为 ID3。他们可以直接使用特征属性来进行分类,而大多数常见的机器学习算法都是不能的。但是,需要在 ID3 中将数字特征转换为标量。尽管决策树算法功能强大,但是他们的训练时间很长。另一方面,他们倾向于过度拟合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值