决策树 — Decision Tree

决策树是一种分类算法。我们将通过一个经典的例子逐步了解决策树。假设我们要根据天气状况决策是否进行羽毛球训练,且有14天的历史数据供我们建立模型。如下:

DayOutlookTemperatureHumidityWindPlayTennis
D1SunnyHotHighWeakNo
D2SunnyHotHighStrongNo
D3OvercastHotHighWeakYes
D4RainMildHighWeakYes
D5RainCoolNormalWeakYes
D6RainCoolNormalStrongNo
D7OvercastCoolNormalStrongYes
D8SunnyMildHighWeakNo
D9SunnyCoolNormalWeakYes
D10RainMildNormalWeakYes
D11SunnyMildNormalStrongYes
D12OvercastMildHighStrongYes
D13OvercastHotNormalWeakYes
D14RainMildHighStrongNo

决策树,顾名思义,就是要构建出一棵树状模型,将训练集中的不同类数据分隔开,尽可能地让叶子节点包含”纯“的同类数据。内点(非叶子节点)是特征项,分支是父节点特征不同的取值,树叶(叶子节点)是分类结果。自此,迎来了构建决策树过程中的第一个问题,根节点如何选择?经典的ID3算法引入了概念——熵,并用信息增益的大小作为选择根节点的标准。

定义一:

熵,用以描述某一集合、状态的不确定性。集合中的样本越统一,熵值越小;样本越随机,熵值越大。状态越稳定,熵值越小,反之熵值越大。公式如下:
E n t r o p y ( S ) ≡ ∑ i = 1 c − p i log ⁡ 2 p i Entropy(S) \equiv \sum\limits_{i=1}^c -p_i \log_2 p_i Entropy(S)i=1cpilog2pi
其中, p i p_i pi表示某集合中类别 i i i所占比列,或者是某状态现象 i i i出现的概率。定义 0 log ⁡ 0 = 0 0 \log0 = 0 0log0=0

以文章开头的决策是否进行羽毛球训练为例。当历史数据中 P l a y T e n n i s PlayTennis PlayTennis全为 Y e s Yes Yes N o No No时,熵值为 0 0 0;当 P l a y T e n n i s PlayTennis PlayTennis一半为 Y e s Yes Yes,一半为 N o No No时,熵值为 1 1 1;其余情况,熵值在 0 0 0 1 1 1之间。如下图:
这里写图片描述

历史数据中的熵值为:
E n t r o p y ( [ 9 + , 5 − ] ) = − ( 9 / 14 ) log ⁡ 2 ( 9 / 14 ) − ( 5 / 14 ) log ⁡ 2 ( 5 / 14 ) = 0.940 Entropy([9+,5-]) = -(9/14)\log_2(9/14) - (5/14)\log_2(5/14) = 0.940 Entropy([9+,5])=(9/14)log2(9/14)(5/14)log2(5/14)=0.940

定义二:

集合 S S S在特征 A A A下的信息增益定义为集合 S S S通过特征 A A A分支演变成集合 S v S_v Sv的熵值减小(即集合 S S S中的样本由随机变得统一)。公式如下:
G a i n ( S , A ) ≡ E n t r o p y ( S ) − ∑ v ∈ V a l u e s ( A ) ∣ S v ∣ ∣ S ∣ E n t r o p y ( S v ) Gain(S, A) \equiv Entropy(S) - \sum\limits_{v \in Values(A)} \frac {\vert S_v \vert}{\vert S \vert}Entropy(S_v) Gain(S,A)Entropy(S)vValues(A)SSvEntropy(Sv)

以文章开头的决策是否进行羽毛球训练为例。历史数据在特征 W i n d Wind Wind下的信息增益计算如下:
V a l u e s ( W i n d ) = W e a k , S t r o n g S = [ 9 + , 5 − ] S W e a k ← [ 6 + , 2 − ] S S t r o n g ← [ 3 + , 3 − ] G a i n ( S , W i n d ) = E n t r o p y ( S ) − ∑ v ∈ [ W e a k , S t r o n g ] ∣ S v ∣ ∣ S ∣ E n t r o p y ( S v ) = E n t r o p y ( S ) − ( 8 / 14 ) E n t r o p y ( S W e a k ) − ( 6 / 14 ) E n t r o p y ( S S t r o n g ) = 0.940 − ( 8 / 14 ) 0.811 − ( 6 / 14 ) 1.00 = 0.048 Values(Wind) = Weak, Strong \\ S = [9+, 5-] \\ S_{Weak} \leftarrow [6+, 2-] \\ S_{Strong} \leftarrow [3+, 3-] \\ \begin{aligned} &Gain(S, Wind) = Entropy(S) - \sum\limits_{v \in [Weak, Strong]} \frac {\vert S_v \vert}{\vert S \vert}Entropy(S_v) \\ & = Entropy(S) - (8/14)Entropy(S_{Weak}) - (6/14)Entropy(S_{Strong}) \\ & = 0.940 - (8/14)0.811 - (6/14)1.00 \\ & = 0.048 \end{aligned} Values(Wind)=Weak,StrongS=[9+,5]SWeak[6+,2]SStrong[3+,3]Gain(S,Wind)=Entropy(S)v[Weak,Strong]SSvEntropy(Sv)=Entropy(S)(8/14)Entropy(SWeak)(6/14)Entropy(SStrong)=0.940(8/14)0.811(6/14)1.00=0.048

ID3算法通过计算每个特征的信息增益,选择信息增益最大(分类效果最好)的特征作为当前树的节点。构建过树节点的特征将不再加入到信息增益的计算中。以文章开头的决策是否进行羽毛球训练为例,构建决策树模型的根节点。先计算每个特征的信息增益:
G a i n ( S , O u t l o o k ) = 0.246 G a i n ( S , H u m i d i t y ) = 0.151 G a i n ( S , W i n d ) = 0.048 G a i n ( S , T e m p e r a t u r e ) = 0.029 Gain(S, Outlook) = 0.246 \\ Gain(S, Humidity) = 0.151 \\ Gain(S, Wind) = 0.048 \\ Gain(S, Temperature) = 0.029 Gain(S,Outlook)=0.246Gain(S,Humidity)=0.151Gain(S,Wind)=0.048Gain(S,Temperature)=0.029

计算得知,特征 O u t l o o k Outlook Outlook的信息增益最大,选其作为根节点。如下:
这里写图片描述

继续计算集合 S S u n n y S_{Sunny} SSunny在剩余特征下的信息增益:
G a i n ( S S u n n y , H u m i d i t y ) = 0.970 G a i n ( S S u n n y , T e m p e r a t u r e ) = 0.570 G a i n ( S S u n n y , W i n d ) = 0.019 Gain(S_{Sunny}, Humidity) = 0.970 \\ Gain(S_{Sunny}, Temperature) = 0.570 \\ Gain(S_{Sunny}, Wind) = 0.019 Gain(SSunny,Humidity)=0.970Gain(SSunny,Temperature)=0.570Gain(SSunny,Wind)=0.019

选择信息增益最大的 H u m i d i t y Humidity Humidity作为 S S u n n y S_{Sunny} SSunny的特征节点。如下:
这里写图片描述

如此重复,最后此例完整的决策树如下:
这里写图片描述

细心的读者会发现,尽管特征 D a y Day Day的信息增益最大, G a i n ( S , D a y ) = 0.940 Gain(S, Day) = 0.940 Gain(S,Day)=0.940,它并没有被用来当作根节点。因为特征 D a y Day Day会导致生成的决策树模型过拟合。然而,用信息增益的方式却无法识别、并避免这种情况。因此,引入信息增益率来选择特征节点。

定义三:

信息增益率,通过引入split information项来抵消过大的信息增益。split information公式如下:
S p l i t I n f o r m a t i o n ( S , A ) ≡ − ∑ i = 1 c ∣ S i ∣ ∣ S ∣ log ⁡ 2 ∣ S i ∣ ∣ S ∣ SplitInformation(S, A) \equiv - \sum\limits_{i=1}^c \frac {\vert S_i \vert}{\vert S \vert} \log_2 \frac {\vert S_i \vert}{\vert S \vert} SplitInformation(S,A)i=1cSSilog2SSi
信息增益率公式如下:
G a i n R a t i o ( S , A ) ≡ G a i n ( S , A ) S p l i t I n f o r m a t i o n ( S , A ) GainRatio(S, A) \equiv \frac {Gain(S, A)} {SplitInformation(S, A)} GainRatio(S,A)SplitInformation(S,A)Gain(S,A)

以羽毛球训练为例, G a i n R a t i o ( S , D a y ) = 0.940 3.807 = 0.247 GainRatio(S, Day) = \frac {0.940}{3.807} = 0.247 GainRatio(S,Day)=3.8070.940=0.247 G a i n R a t i o ( S , O u t l o o k ) = 0.246 1.577 = 0.156 GainRatio(S, Outlook) = \frac {0.246}{1.577} = 0.156 GainRatio(S,Outlook)=1.5770.246=0.156 G a i n R a t i o ( S , H u m i d i t y ) = 0.151 1.0 = 0.151 GainRatio(S, Humidity) = \frac {0.151}{1.0} = 0.151 GainRatio(S,Humidity)=1.00.151=0.151。通过计算可以发现,尽管没能避免特征 D a y Day Day被选作根节点,但是有效地降低了特征 D a y Day Day的影响。本例中 D a y Day Day是一个十分极端的个例,在实际应用中信息增益率比信息增益能更好地挑选特征节点。

除此之外,决策树的规模过大也会导致树模型过拟合。到一定程度,树模型的分类准确率会随着树规模的增大而递减。因此,决策树的建立需要受剪枝策略的限制。剪枝策略分为前剪枝和后剪枝:

  • 前剪枝:限制树的深度,或者规定叶子节点的最小样本数。(实施难度较小,但是很难提前预知树模型的最佳规模)
  • 后剪枝:先构建出一棵完整的决策树,再根据剪枝不影响树模型分类准确率的前提,对树进行剪枝。(理论上效果比前剪枝好,但是实施难度较大)

最后,除了可以通过信息增益和信息增益率来选择特征节点外,还可以基于某特征获取成本的考虑来选择特征节点。这是基于实际的考虑,例如:病人病症的分类预测。某些检查可能十分昂贵,因此,需要尽可能地利用普通检查的结果来做分类。此种考虑常用的计算公式如下:
G a i n 2 ( S , A ) C o s t ( A ) \frac {Gain^2(S,A)}{Cost(A)} Cost(A)Gain2(S,A)
或者:
2 G a i n ( S , A ) − 1 ( C o s t ( A ) + 1 ) w \frac {2^{Gain(S, A)} -1}{(Cost(A) +1)^w} (Cost(A)+1)w2Gain(S,A)1
其中, w ∈ [ 0 , 1 ] w \in [0,1] w[0,1]是一个常量,用以权衡成本和信息增益之间的重要性。

补充

除了将决策树应用于分类问题之外,还可以将其输出作为其它机器学习算法的输入,这个思想很重要!!!

构建一个大的决策树容易导致树模型过拟合。因此,我们可以基于特征的若干子集构建若干个小决策树,每个小决策树就像是它所处特征集里的“专家”。每个“专家”基于自己的知识给某条数据返回一个 { 0 , 1 } \{0,1\} {0,1}标签。例如:如果我们有100个小决策树,那么就有100个布尔值。这些布尔值构成了一个100维的特征向量。这个特征向量可以作为其它学习算法的输入!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值