决策树理论
本文先从熵说起,再到互信息,到信息增益。借助信息增益来确定决策树某节点的最优特征选择。使用递归的思想将决策树构建出来。
当树构建完成后,在使用此树做预测时,依然使用递归的思路。
所需基础
- 熵
- 数据结构-树
- 递归算法
熵
决策树理论中始终离不开熵的身影。

图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=1K∣Ck∣∣D∣log∣Ck∣∣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∣
上式中:
- ∣Ck∣|C_k|∣Ck∣是第k个类别对应的采样数据集的数目
- ∣Ck∣/∣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即C1C_1C1是和C2C_2C2否。其中,有9个是,6个否。则
∣C1∣∣D∣=9/15\frac{|C_1|}{|D|}=9/15∣D∣∣C1∣=9/15,∣C2∣∣D∣=6/15\frac{|C_2|}{|D|}=6/15∣D∣∣C2∣=6/15
因此H(D)=−915∗log(915)−615∗log(615)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=1npi∑k=1KH(Dk∣Ai)=−∑i=1n∣Di∣∣D∣∑k=1K∣Dik∣∣Di∣log∣Dik∣∣Di∣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∣
其中:
- ∣Di∣|D_i|∣Di∣,当某个feature有多种取值a1,a2,...,ai,...,ana_1, a_2, ..., a_i, ..., a_na1,a2,...,ai,...,an时,则∣Di∣|D_i|∣Di∣是这个feature的第i个取值的对应dataset数目
- ∣Dik∣|D_{ik}|∣Dik∣,在 DiD_iDi里 第kkk个label的样本数量。
依然拿贷款表举例:
- 在贷款表中第1个feature是年龄,有3种取值是青年中年和老年,分别各有5个。则∣D1∣|D_1|∣D1∣=5, ∣D2∣|D_2|∣D2∣=5, ∣D3∣|D_3|∣D3∣=5
- 对于年龄是青年的群体,即对于D1D_1D1而言,数据有2种label “是”和“否”,“是”有2个(表中ID为3,4),“否”有3个(表中ID为1,2,5)。则∣D11∣=2|D_{11}|=2∣D11∣=2, ∣D12∣=3|D_{12}|=3∣D12∣=3
- 以此类推,∣D21∣=3,∣D22∣=2|D_{21}|=3, |D_{22}|=2∣D21∣=3,∣D22∣=2, ∣D31∣=4,∣D32∣=1|D_{31}|=4, |D_{32}|=1∣D31∣=4,∣D32∣=1
- 最终对于特征A是‘’年龄“”时,
H(D∣A1)=−∣D11∣∣D1∣∗log∣D11∣∣D1∣−∣D12∣∣D1∣∗log∣D12∣∣D1∣=−25∗log25−35∗log35=0.97095H(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.97095H(D∣A1)=−∣D1∣∣D11∣∗log∣D1∣∣D11∣−∣D1∣∣D12∣∗log∣D1∣∣D12∣=−52∗log52−53∗log53=0.97095
H(D∣A2)=−∣D21∣∣D2∣∗log∣D21∣∣D2∣−∣D22∣∣D2∣∗log∣D22∣∣D2∣=−35∗log35−25∗log25=0.97095H(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.97095H(D∣A2)=−∣D2∣∣D21∣∗log∣D2∣∣D21∣−∣D2∣∣D22∣∗log∣D2∣∣D22∣=−53∗log53−52∗log52=0.97095
H(D∣A3)=−∣D31∣∣D3∣∗log∣D31∣∣D3∣−∣D32∣∣D3∣∗log∣D32∣∣D3∣=−45∗log45−15∗log15=0.72193H(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.72193H(D∣A3)=−∣D3∣∣D31∣∗log∣D3∣∣D31∣−∣D3∣∣D32∣∗log∣D3∣∣D32∣=−54∗log54−51∗log51=0.72193
最终:
H(D∣A=年龄)=p1∗H(D∣A1)+p2∗H(D∣A2)+p3∗H(D∣A3)=∣D1∣∣D∣∗H(D∣A1)+∣D2∣∣D∣∗H(D∣A2)+∣D3∣∣D∣∗H(D∣A3)=5/15∗0.97095+5/15∗0.97095+5/15∗0.72193=0.88794H(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.88794H(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.youkuaiyun.com/c406495762/article/details/75663451