决策树理论
本文先从熵说起,再到互信息,到信息增益。借助信息增益来确定决策树某节点的最优特征选择。使用递归的思想将决策树构建出来。
当树构建完成后,在使用此树做预测时,依然使用递归的思路。
所需基础
- 熵
- 数据结构-树
- 递归算法
熵
决策树理论中始终离不开熵的身影。
图1 熵
I(X;Y) = H(X) - H(X|Y) // 其中I(X;Y) 被称为互信息
上式在决策树中会被用到,请先记住。
决策树 Decision Tree
顾名思义,决策树是用于决策的树。举个例子先
图2 是否去相亲
这种思维用决策树表示出来,即是图2。在每个节点上都有一个feature,以此feature的数值来产生分支。而在新的分支上,又可有新的节点再做分支,直到叶子节点即决定是否见面。
当前问题
为什么最开始先以“年龄”为判断标准,然后是长相、收入、公务员?
解答
由于目前没有足够数据的支撑,此处解释为:当使用树中的这种判断顺序时,可最快的做出决策 或者说 最有效的对目标人选进行选择。
注意:知晓feature的优劣,是决策树的核心!
信息增益 Information Gain
我们使用信息增益来判断feature的优劣,以方便对feature做出选择。因为构建决策树时,必须知道每个节点处的feature是什么。
信息增益:表示得知feature A的信息,而使得类别X的信息的不确定性减少的程度。
结合相亲的案例对比的解释一下,见下表
相亲案例 | 算法中 | 特点 |
---|---|---|
所有的相亲待选男生 | 原始的dataset | 最混乱 |
使用某个属性比如年龄对待选者划分,分成了不大于30岁和大于30岁两个子群体 | 使用某个feature对dataset进行划分成多个subDataset | 每个子群体的混乱程度较低 |
信息增益就是:使用这个feature将dataset划分成subDataset,划分前与后的熵之差。
用公式写出来就是:
g(D,A) = H(D) - H(D|A)
g(D,A):对于数据集Dataset使用特征A之后的信息增益
H(D): 是Dataset的熵(称为经验熵)
H(D|A):Dataset在给定A情况下的条件熵(经验条件熵)
对比最开始提到的互信息和这里的信息增益,可看出来是一回事。
因此为了方便记忆和理解,可以把g(D,A)的公式和韦恩图图1结合起来。
类比如下:
互信息 | 信息增益 |
---|---|
I(X;Y) = H(X) - H(X|Y) | g(D,A) = H(D) - H(D|A) |
计算经验熵H(D)
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
l
o
g
∣
C
k
∣
∣
D
∣
H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}log\frac{|C_k|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log∣D∣∣Ck∣
上式中:
- ∣ C k ∣ |C_k| ∣Ck∣是第k个类别对应的采样数据集的数目
- ∣ C k ∣ / ∣ D ∣ |C_k|/|D| ∣Ck∣/∣D∣指第k个label的个数占总数比值
举例,数据集如下面的“贷款表”
ID | 年龄 | 是否有工作 | 是否有自己的房子 | 信贷情况 | 是否给贷款(label) |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 一般 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 一般 | 是 |
5 | 青年 | 否 | 否 | 一般 | 否 |
6 | 中年 | 否 | 否 | 一般 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 是 |
9 | 中年 | 否 | 是 | 很好 | 是 |
10 | 中年 | 否 | 是 | 很好 | 是 |
11 | 老年 | 否 | 是 | 很好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 很好 | 是 |
15 | 老年 | 否 | 否 | 一般 | 否 |
上表中,有两种label即 C 1 C_1 C1是和 C 2 C_2 C2否。其中,有9个是,6个否。则
∣ C 1 ∣ ∣ D ∣ = 9 / 15 \frac{|C_1|}{|D|}=9/15 ∣D∣∣C1∣=9/15, ∣ C 2 ∣ ∣ D ∣ = 6 / 15 \frac{|C_2|}{|D|}=6/15 ∣D∣∣C2∣=6/15
因此 H ( D ) = − 9 15 ∗ l o g ( 9 15 ) − 6 15 ∗ l o g ( 6 15 ) H(D) = -\frac{9}{15}*log(\frac{9}{15}) - \frac{6}{15}*log(\frac{6}{15}) H(D)=−159∗log(159)−156∗log(156)
计算经验条件熵H(D|A)
H ( D ∣ A ) = = ∑ i = 1 n p i ∑ k = 1 K H ( D k ∣ A i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ l o g ∣ D i k ∣ ∣ D i ∣ H(D|A)=\\[2ex] =\sum_{i=1}^np_i\sum_{k=1}^KH(D_k|A_i)\\[2ex] = -\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}log\frac{|D_{ik}|}{|D_i|} H(D∣A)==i=1∑npik=1∑KH(Dk∣Ai)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log∣Di∣∣Dik∣
其中:
- ∣ D i ∣ |D_i| ∣Di∣,当某个feature有多种取值 a 1 , a 2 , . . . , a i , . . . , a n a_1, a_2, ..., a_i, ..., a_n a1,a2,...,ai,...,an时,则 ∣ D i ∣ |D_i| ∣Di∣是这个feature的第i个取值的对应dataset数目
- ∣ D i k ∣ |D_{ik}| ∣Dik∣,在 D i D_i Di里 第 k k k个label的样本数量。
依然拿贷款表举例:
- 在贷款表中第1个feature是年龄,有3种取值是青年中年和老年,分别各有5个。则 ∣ D 1 ∣ |D_1| ∣D1∣=5, ∣ D 2 ∣ |D_2| ∣D2∣=5, ∣ D 3 ∣ |D_3| ∣D3∣=5
- 对于年龄是青年的群体,即对于 D 1 D_1 D1而言,数据有2种label “是”和“否”,“是”有2个(表中ID为3,4),“否”有3个(表中ID为1,2,5)。则 ∣ D 11 ∣ = 2 |D_{11}|=2 ∣D11∣=2, ∣ D 12 ∣ = 3 |D_{12}|=3 ∣D12∣=3
- 以此类推, ∣ D 21 ∣ = 3 , ∣ D 22 ∣ = 2 |D_{21}|=3, |D_{22}|=2 ∣D21∣=3,∣D22∣=2, ∣ D 31 ∣ = 4 , ∣ D 32 ∣ = 1 |D_{31}|=4, |D_{32}|=1 ∣D31∣=4,∣D32∣=1
- 最终对于特征A是‘’年龄“”时,
H ( D ∣ A 1 ) = − ∣ D 11 ∣ ∣ D 1 ∣ ∗ l o g ∣ D 11 ∣ ∣ D 1 ∣ − ∣ D 12 ∣ ∣ D 1 ∣ ∗ l o g ∣ D 12 ∣ ∣ D 1 ∣ = − 2 5 ∗ l o g 2 5 − 3 5 ∗ l o g 3 5 = 0.97095 H(D|A_1) =-\frac{|D_{11}|}{|D_1|}*log\frac{|D_{11}|}{|D_1|} - \frac{|D_{12}|}{|D_1|}*log\frac{|D_{12}|}{|D_1|} \\[2ex] =-\frac{2}{5}*log\frac{2}{5} - \frac{3}{5}*log\frac{3}{5}=0.97095 H(D∣A1)=−∣D1∣∣D11∣∗log∣D1∣∣D11∣−∣D1∣∣D12∣∗log∣D1∣∣D12∣=−52∗log52−53∗log53=0.97095
H ( D ∣ A 2 ) = − ∣ D 21 ∣ ∣ D 2 ∣ ∗ l o g ∣ D 21 ∣ ∣ D 2 ∣ − ∣ D 22 ∣ ∣ D 2 ∣ ∗ l o g ∣ D 22 ∣ ∣ D 2 ∣ = − 3 5 ∗ l o g 3 5 − 2 5 ∗ l o g 2 5 = 0.97095 H(D|A_2) =-\frac{|D_{21}|}{|D_2|}*log\frac{|D_{21}|}{|D_2|} - \frac{|D_{22}|}{|D_2|}*log\frac{|D_{22}|}{|D_2|}\\[2ex] =-\frac{3}{5}*log\frac{3}{5} -\frac{2}{5}*log\frac{2}{5}=0.97095 H(D∣A2)=−∣D2∣∣D21∣∗log∣D2∣∣D21∣−∣D2∣∣D22∣∗log∣D2∣∣D22∣=−53∗log53−52∗log52=0.97095
H
(
D
∣
A
3
)
=
−
∣
D
31
∣
∣
D
3
∣
∗
l
o
g
∣
D
31
∣
∣
D
3
∣
−
∣
D
32
∣
∣
D
3
∣
∗
l
o
g
∣
D
32
∣
∣
D
3
∣
=
−
4
5
∗
l
o
g
4
5
−
1
5
∗
l
o
g
1
5
=
0.72193
H(D|A_3) =-\frac{|D_{31}|}{|D_3|}*log\frac{|D_{31}|}{|D_3|} - \frac{|D_{32}|}{|D_3|}*log\frac{|D_{32}|}{|D_3|}\\[2ex] =-\frac{4}{5}*log\frac{4}{5} -\frac{1}{5}*log\frac{1}{5}=0.72193
H(D∣A3)=−∣D3∣∣D31∣∗log∣D3∣∣D31∣−∣D3∣∣D32∣∗log∣D3∣∣D32∣=−54∗log54−51∗log51=0.72193
最终:
H
(
D
∣
A
=
年
龄
)
=
p
1
∗
H
(
D
∣
A
1
)
+
p
2
∗
H
(
D
∣
A
2
)
+
p
3
∗
H
(
D
∣
A
3
)
=
∣
D
1
∣
∣
D
∣
∗
H
(
D
∣
A
1
)
+
∣
D
2
∣
∣
D
∣
∗
H
(
D
∣
A
2
)
+
∣
D
3
∣
∣
D
∣
∗
H
(
D
∣
A
3
)
=
5
/
15
∗
0.97095
+
5
/
15
∗
0.97095
+
5
/
15
∗
0.72193
=
0.88794
H(D|A=年龄)=p_1*H(D|A_1)+p_2*H(D|A_2)+p_3*H(D|A_3)\\[2ex] =\frac{|D_1|}{|D|}*H(D|A_1)+\frac{|D_2|}{|D|}*H(D|A_2)+\frac{|D_3|}{|D|}*H(D|A_3)\\[2ex]=5/15*0.97095+5/15*0.97095+5/15*0.72193\\[2ex] =0.88794
H(D∣A=年龄)=p1∗H(D∣A1)+p2∗H(D∣A2)+p3∗H(D∣A3)=∣D∣∣D1∣∗H(D∣A1)+∣D∣∣D2∣∗H(D∣A2)+∣D∣∣D3∣∗H(D∣A3)=5/15∗0.97095+5/15∗0.97095+5/15∗0.72193=0.88794
和经验熵相比,经验条件熵更复杂难懂些。笔者在这里对经验条件熵做一个简单的解释:
依据某个feature比如年龄的不同取值,将原始dataset分成多个subDataset即青年、中年、老年数据集, 则
H(D|A是年龄) =
青年数据集占比 * H(青年数据集)
+中年数据集占比 * H(中年数据集)
+老年数据集占比 * H(老年数据集)
构建树
第一步,
根据上面的方法,可以计算出所有feature的H(D|A)。
使用公式 gain=H(D)-H(D|A) 可求得 不同feature对应的gain。
最大gain的那个feature即是当前的最优feature,作为当前步的构建树的节点。
假设最优的是第一步使用的是“年龄”特征。
第二步,
有了第一个节点,依据年龄将dataset分成三个子集即青年数据集、中年数据集和老年数据集。
对各个子集分别再使用第一步中的方法(此处是递归思想),注意第一步用到的feature不考虑了。
接下来,就是使用递归继续构建树。
使用递归算法,终止条件为:
- 划分出的子集的熵为0,即子集都是同一个label
- 所有的feature都已经用完
三种构建决策树的方法
在上面的构建树的过程中,我们使用的是gain来确定最佳feature。这种方法是ID3。
其它的思路还有:
- C4.5
- CART
对新思路有兴趣的伙伴可自行学习。
有了ID3的基础,对C4.5和CART也不在话下。
决策树的使用
决策树使用的过程,就是不断决策然后在分支里再决策。
先使用决策树的根节点的feature,对该样本进行划分到不同分支,
在分支上再使用此对应的feature对样本继续分支,如此递归下去,当到达叶子节点时即输出。
可参照 图2 是否去相亲 去理解。
参考
https://blog.csdn.net/c406495762/article/details/75663451