上集回顾
今天我们继续学习决策树的相关知识。这里首先回顾一下上期的知识。在上一期里面我们主要讲到了:
- 什么是决策树
- 决策树的训练过程
- 熵和Gini系数的计算
这里如果忘记或者忘记这些知识的可以去回顾一下。特别是熵和Gini系数的计算!!!因为接下来我将围绕他们去手动构建一棵完整的决策树。
决策树的构建过程
这里首先提一下决策树的构造思路。随着树深度的增加,节点的熵值要迅速的降低(速度越快越好),这样我们有希望得到一棵高度最矮的决策树。那么为什么要最矮呢?其实是因为随着决策树深度的增加,我们的模型就会约复杂。我相信假如效果是一致的情况下,其实没有人想要将事情做负责的对不对。有了这个思路之后,我们就开始举例子,然后手动构建一棵决策树了。
假设小坤是一个热爱篮球的男生,他放假经常去打篮球。但决定他去打篮球的因素其实还有很多。
outlook | temperature | humidity | windy | play |
---|---|---|---|---|
sunny | hot | high | false | no |
sunny | hot | high | true | no |
overcast | hot | high | false | yes |
rainy | mild | high | false | yes |
rainy | cool | normal | false | yes |
rainy | cool | normal | true | no |
overcast | cool | normal | true | yes |
sunny | mild | high | false | no |
sunny | cool | normal | false | yes |
rainy | mild | normal | false | yes |
sunny | mild | normal | true | yes |
overcast | mild | high | true | yes |
overcast | hot | normal | false | yes |
rainy | mild | high | true | no |
这里可以看到,小坤打不打篮球的先决条件一共有4个。他们分别是天气、温度、湿度、是否大风。好,接下来我们就结合熵或Gini系数来构建一颗决策树。为了方便大家回顾,这里还是列一些熵的公式:
熵
=
−
∑
i
=
1
n
p
i
∗
l
o
g
2
(
p
i
)
熵 = -\sum_{i=1}^np_i*log_2(p_i)
熵=−i=1∑npi∗log2(pi)
步骤一:这里我们可以得到:
{
P
(
打
篮
球
)
=
9
14
P
(
不
打
篮
球
)
=
5
14
\begin{cases} P(打篮球) = \frac{9}{14}\\ P(不打篮球) =\frac{5}{14} \end{cases}
{P(打篮球)=149P(不打篮球)=145
忽略所有因素不算,我们只关注是否打篮球,这样我们可以得到一个初始的熵值
熵
(
初
始
)
=
−
(
9
14
∗
l
o
g
2
(
9
14
)
+
5
14
∗
l
o
g
2
(
5
14
)
)
≈
0.94
熵(初始)=- (\frac{9}{14}*log_2(\frac{9}{14})+\frac{5}{14}*log_2(\frac{5}{14}))\approx0.94
熵(初始)=−(149∗log2(149)+145∗log2(145))≈0.94
步骤二:以outlook为例,我们可以得到
当outlook为sunny的时候,对应的熵值为:
熵
(
s
u
n
n
y
)
=
−
(
2
5
∗
l
o
g
2
(
2
5
)
+
3
5
∗
l
o
g
2
(
3
5
)
)
≈
0.971
熵(sunny) = - (\frac{2}{5}*log_2(\frac{2}{5})+\frac{3}{5}*log_2(\frac{3}{5}))\approx0.971
熵(sunny)=−(52∗log2(52)+53∗log2(53))≈0.971
熵
(
o
v
e
r
c
a
s
t
)
=
−
(
1
∗
l
g
(
1
)
)
=
0
熵(overcast)=-(1*lg(1))=0
熵(overcast)=−(1∗lg(1))=0
熵
(
r
a
i
n
y
)
=
−
(
2
5
∗
l
o
g
2
(
2
5
)
+
3
5
∗
l
o
g
2
(
3
5
)
)
≈
0.971
熵(rainy) = - (\frac{2}{5}*log_2(\frac{2}{5})+\frac{3}{5}*log_2(\frac{3}{5}))\approx0.971
熵(rainy)=−(52∗log2(52)+53∗log2(53))≈0.971
这里我给出利用python计算上述公式的代码,大家只要套进去就好,不需要再按计算机了,以熵(sunny)为例子:
import math
a = -((2/5)*math.log((2/5),2)+(3/5)*math.log((3/5), 2))
print(a)
最后,我们可以把outlook的每一个因素的熵整合起来。同样的使用熵的公式:
熵
(
o
u
t
l
o
o
k
)
=
P
(
s
u
n
n
y
)
∗
熵
(
s
u
n
n
y
)
+
P
(
o
v
e
r
c
a
s
t
)
∗
熵
(
o
v
e
r
c
a
s
t
)
+
P
(
r
a
i
n
y
)
∗
熵
(
r
a
i
n
y
)
熵(outlook)=P(sunny)*熵(sunny)+P(overcast)*熵(overcast)+P(rainy)*熵(rainy)
熵(outlook)=P(sunny)∗熵(sunny)+P(overcast)∗熵(overcast)+P(rainy)∗熵(rainy)
熵
(
o
u
t
l
o
o
k
)
=
5
14
∗
0.971
+
4
14
∗
0
+
5
14
∗
0.971
≈
0.693
熵(outlook)=\frac{5}{14}*0.971+\frac{4}{14}*0+\frac{5}{14}*0.971\approx0.693
熵(outlook)=145∗0.971+144∗0+145∗0.971≈0.693
如此做法,假如我们使用outlook这个因素进行第一次分支,我已使整体熵值从0.94减少到0.639。换句话说,他的信息增益(信息增益就是熵值下降的幅度,所以实际项目中,信息增益值越大越好)就是
G
a
i
n
(
o
u
t
l
o
o
k
)
=
0.94
−
0.693
=
0.247
Gain(outlook)=0.94-0.693=0.247
Gain(outlook)=0.94−0.693=0.247
同样的手法,我们可以得到:
{
G
a
i
n
(
o
u
t
l
o
o
k
)
=
0.247
G
a
i
n
(
t
e
m
p
e
r
a
t
u
r
e
)
=
0.029
G
a
i
n
(
h
u
m
i
d
i
t
y
)
=
0.152
G
a
i
n
(
w
i
n
d
y
)
=
0.048
\begin{cases} Gain(outlook)=0.247\\ Gain(temperature)=0.029\\ Gain(humidity)=0.152\\ Gain(windy)=0.048 \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧Gain(outlook)=0.247Gain(temperature)=0.029Gain(humidity)=0.152Gain(windy)=0.048
所以,我们应该从outlook开始作为决策树的分支。以及最终的数据应该是
- outlook
- humidity
- windy
- temperature
决策树相关算法
现在,我们已经讲完决策树的构建过程。以及我们已经可以手动的构建一棵属于我们自己的决策树。那么接下来我就提一下决策树常用的算法。当然这里就不展开说明了,假如有需要的小伙伴,可以自行查阅资料。一般来讲,决策树有如下集中算法:
算法 | 分支依据 | 说明 |
---|---|---|
ID3 | 信息增益 | 这是上面我们手动算的这个算法。最开始的决策树构建就以来于他,所以他属于决策树元组的算法。 |
C4.5 | 信息增益率 | 信息增益率=信息增益/自身的熵值。通常情况下只依赖信息增益判断节点是不靠谱的,所以引入信息增益率。信息增益率越大越好。 |
GART | Gini系数 | 具体的计算方式我有在上期的知识说过,可以点击翻一下 |
总结
这次我们主要学习了决策树的最初是的算法。以及假如给我们简单的数据,我们如何手动构建一棵决策树。当然啦,这在实际项目中是不需要的。但手动构建决策树,可以让我们更假迅速的了解决策树的原理。然后基于它学习决策树的优化。
没错,下一篇文章我们将学习决策树的优化。这里线抱歉,本来想2篇文章讲完决策树,但最后发现内容还是有点多。但我想控制一篇文章2000~3000字左右,这样内容不会太多,比较记住。没关系,我们还是分三章慢慢学吧。下一篇文章我将分享的剪枝叶以及代码实现。
参考文献
https://www.bilibili.com/video/av26086646?p=4