【决策树】也没那么复杂嘛

1,062 阅读7分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

日后总结我的大学四年,虽然没有尽善尽美,但是真的尽心尽力地去做了每一件想做的事。

算法思想

决策树不止是一棵二叉树,还可以多叉。

二叉决策树 三叉决策树

简答来说,就是逐层判断从而得到最终结果

🥕 树形结构

椭圆是内部结点,代表了特征或属性,最上面的结点是根结点,所有分叉都从这里出发

矩形是叶结点,代表了

If-Then规则

信息增益

决策树是根据每个结点的特征来逐层判断从而得到最终分类结果,而信息增益的出现就是为了寻找出最优特征,该怎么给各个特征排序能够使最终判断出的结果是最合理的。

1.熵的概念

信息增益是由熵构建而成的。熵表示的是随机变量的不确定性,不确定性越大,代表着熵越大。

由于熵和随机变量的分布有关,我们可以得到:

H(p)=Σi=1npilogpiH(p)=-Σ_{i=1}^{n}p_ilog{p_i}

随机变量的取值等概率分布时,相应的熵最大。也就是说,特征的所有取值相同时,所包含的信息是最多的,此时就是不确定性最大的情况。

2.信息增益

输入:训练数据集D和特征A。

输出:特征A对训练数据集D的信息增益g(D,A)。

🚶‍♂️三步走~

step 1 计算数据集D的经验熵 H(D)

H(D)=Σk=1KCkDlog2CkDH(D)=-Σ_{k=1}^K\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}

step 2 计算特征A对数据集D的经验条件熵 H(D|A)

step 3 计算信息增益公式

g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D|A)

信息增益表示得知特征A而使类Y的信息的不确定性减少的程度。

公式很多,晕了?😅看例题马上就清楚啦~

3.例题解说

输入:训练数据集D

输出:通过计算信息增益来选出最优特征

step 1 计算经验熵公式

在本训练数据集中,D=15,最终分类情况有两类:是(9)、否(6)

代入计算得到经验熵:

step 2 计算经验条件熵公式

令 A1:年龄,A2:是否有工作,A3:是否有自己的房子,A4:信贷情况

① 年龄

代入计算分别得到青年、中年、老年的经验条件熵:

i=1青年时:

i=2中年时:

i=3老年时:

最终经验条件熵:

step 3 计算信息增益公式

同理,我们可计算出其他特征的信息增益

继续上面三步走的计算,将结果汇总到表格中:

可以看出,有自己的房子这一特征对应的经验条件熵最小,信息增益最大,意味着选择这个特征的话,对应的不确定性最小,分类选择最为明确,那么就可以设为最优特征👍

当然,细心的小伙伴会发现如果不同特征内的分类个数不同,有点是3个,比如年龄(青年、中年、老年),有的是2个,比如是否有自己的房子,分类个数较多时有可能计算出的信息增益会更大,可以看出,信息增益会更倾向于取值较多的特征。

🤔那该怎么降低取值较多的影响呢?

别急,信息增益比来啦~

信息增益比

训练数据集D关于特征A的熵:

HA(D)=Σi=1nDiDlog2DiDH_A(D)=Σ_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}

信息增益比:

gR(D,A)=g(D,A)HA(D)g_R(D,A)=\frac{g(D,A)}{H_A(D)}

那怎么计算HA(D)H_A(D)呢?

以特征A1=年龄A_1=年龄 为例:

同理,我们继续计算 A2,A3,A4 特征对应的信息增益比,列在表格中:

可以对比一下有工作和信贷情况这两个特征,可以看出从信息增益的角度出发,那么选择 信贷情况 作为最优特征最合适;而从信息增益比的角度出发,选择 有工作 作为最优特征更合适

综上,信息增益倾向于取值较多的特征,信息增益比倾向于取值较少的特征

决策树生成算法

1. ID3算法

输入:训练数据集DD,特征集AA,阈值 ε\varepsilon

输出:决策树TT

step 1 判断TT是否需要选择特征生成决策树

Case 1DD中所有实例属于同一类,则T为单结点数,记录实例类别CkC_k,以此作为该结点的类标记,并返回TT

Case 2DD中所有实例无任何特征(A=A=\emptyset),则TT为单结点树,记录DD中实例个数最多类别,并CkC_k根据多数表决原则,以此作为该结点的类标记,并返回TT

step 2 否则,计算A中各特征的信息增益,并选择信息增益最大的特征Ag

Case 1AgA_g的信息增益小于ε\varepsilon,则TT为单结点树,记录DD中实例个数最多类别CkC_k

Case 2 否则,按照AgA_g的每个可能值aia_i,将DD分为若干非空子集DiD_i,将DiD_i中的实例个数最多的类别作为标记,构建子结点,以结点和其子结点构成TT,并返回TT

step 3 第ii个子结点,以DiD_i为训练集,AAgA-A_g为特征集合,递归地调用以上步骤,得到子树TiT_i

晕了吧😏看例题就简单多啦~

例题解说

仍然是上次的例子

输入:训练数据集D

输出:决策树TT

step 1 判断TT是否需要选择特征生成决策树

  • 训练集中最终分类有2类
  • 训练集中存在年龄、有工作、有自己的房子和信贷情况多个特征

TT需要选择特征生成决策树

step 2 计算A中各特征的信息增益,并选择信息增益最大的特征Ag

可以人为地给定ε=0.001\varepsilon=0.001,而从上文已求出的信息增益值看出都大于ε\varepsilon,所以没有理由说这是单结点树

根据上文已经算出的各个特征的信息增益计算值

于是,我们可以确定根结点为信息增益最大的 是否有自己的房子 这一特征,可以根据这一特征将训练集划分为D1D_1D2D_2

特征A<sub>3</sub>=是否自己的房子 的统计表格可以看出有自己房子的D1D_1都是同意贷款,于是此时就可以得到一个单一的叶结点。而无自己的房子的D2D_2中既有同意贷款和不同意贷款,于是就需要根据特征选择(计算这三个特征下的最大信息增益)来找到内部结点所对应的特征。

首先,对于 年龄 这一特征:

从上表 是否有自己的房子训练集 中可以看出,没有自己的房子的实例共有9个,其中6个同意贷款,3个不同意贷款,则 经验熵

i=1i=1青年时:

i=2i=2中年时:

可以看出对于这个子集都是不同意贷款,那么它的经验条件熵就为0

i=3i=3老年时:

最终的经验条件熵H(D2A1)H(D_2|A_1)为:

年龄A1A_1的信息增益为:

同理,计算出是否有工作A2A_2、信贷情况A4A_4的信息增益,列出下表:

对比可得,其中信息增益最大的是 有工作 这一特征,那么我们下一个特征就选它。

生成的决策树

有工作这一特征下,若有工作,则全部同意贷款;若无工作,则不同意贷款,可发现 在这之下不再有其他的分类。

满足了单一叶结点的要求,因此决策树生成到这就结束啦~🎈

2. C4.5算法

如果你学会了ID3算法,那C4.5算法就超级简单。

C4.5算法与ID3算法很相似,区别就在于C4.5是用信息增益比来选择特征,选出信息增益比最大的作最优特征

以上例题的代码在👉 gitee.com/xin-yue-qin…

欢迎巨佬指点~

参考资料:简博士-决策树生成