决策树是一类常见的机器学习的方法,以二分类任务为例,我们希望从已知的训练集中训练出一个模型,使得该模型可以对新出现的实例进行分类;那么决策树的决策体现在哪里呢?首先考虑我们人在面对一些问题的时候,就会思考这样的问题,“这个问题是属于哪一方面的问题?”若属于A方面,则解决方法是一条路线,属于B则是另外一条路线,这是我们人在面临问题的时候很自然的一种处理机制,而决策树恰恰是根据人的思维习惯诞生的,在处理分类的问题的时候面对不同的类别会有不同的决策出现。那么决策树是如何生成的,生成决策树都需要注意哪些问题呢,让我们一起来看看吧!
提示:以下是本篇文章正文内容,笔者参考了 周志华的西瓜书 以及 “【一起啃书】机器学习西瓜书白话解读” 如有理解不到位的地方,欢迎指正
以周志华的西瓜书中的西瓜判好坏为例,我们最终的目的是判断这个西瓜是不是好瓜,但是影响我们进行判断的因素有多个,比如西瓜的色泽、根蒂、敲声等,如果我们挑选西瓜,首先看到的是西瓜的色泽,之后再观察这个西瓜的根蒂,再敲一敲这个西瓜看看声音如何,最终判定,这个瓜是不是好瓜?
那么根据我们的这个买瓜断瓜的思路,一棵简单的决策树就生成了,如下:
显然,通过决策树我们可以判断出西瓜的好坏,这棵树对于我们已经给的样例可能可以做出很准确的判断结果,但是我们希望的是这颗决策树在面对一些未知的“西瓜”的时候,也可以做出比较准确的判断,所以我们希望生成一颗泛化能力强的决策树;生成一颗决策树采取的策略就是“分而治之”,具体流程如下:
我们会发现决策树的生成是一个递归的过程,在生成决策树的过程中,有三种情况会导致递归返回:
(1)当前节点的样本全部属于同一个类别,无需划分;也就是说,当我们在判断西瓜的声音的时候,发现不论是什么声音都是好瓜,此时也就不用再向下分,再根据声音来判断西瓜的好坏了;
(2)当前节点属性集为空,或者所有样本在属性集上的取值都一样;即:当我们判断西瓜的色泽节点的时候,发现该节点的所有样例在色泽的取值都是青绿,也就无需进行后续划分了;
(3)当前节点包含的样本集为空,不能划分;
但是我们会发现,我们在做出某一决策的时候,都是在上一步决策的影响之下做出的,换句话说,我想买一个好西瓜,那么第一眼必须要看这个西瓜的颜色,如果颜色不合适,不论根蒂、声音再好也不买,这样显然是不合理的,所以我们如何进行节点的划分就是接下来要讨论的问题。
我们希望在生成决策树的时候,做出的第一个决策应该是尽可能合理的,而不是随意选一个属性作为决策的点,就好像我们买西瓜不能一开始就去判断西瓜的根蒂的形状,因为这个属性可能对于西瓜好坏的影响不是最大的,与此同时我们希望在决策树的生成过程中,生成节点的纯度应该越来越高,最好不需要再进行后续划分直接可以下结论;
想要达到这个目的,就需要用不同的参数来衡量划分节点的合理性。
“信息熵”是度量样本集合纯度最常用的一种指标,那么什么是“熵”?
熵就是指一种事物的不确定性,比如我想买一个西瓜,但是不知道应该挑选哪一个比较好;
那么这个不确定性到底该如何度量呢?可不可以量化成我们生活中好理解的东西呢?
用我们经常提及的抛硬币为例,我们抛出一枚硬币,其出现正反面的可能性是一样的,都是50%:
(1)如果我们要选择的事物出现各种情况的概率是等概率均匀分布:
1、如果会有8种情况,就相当于抛三个硬币出现的可能性,即此时的熵相当于抛三枚硬币;
2、若有10种情况,就相当于抛 log 2 10 \log_2 10 log210 枚硬币;
3、若有m种情况,则相当于抛 log 2 m \log_2 m log2m 枚硬币;
(2)若出现的情况概率不相等,熵的计算公式如下,其中|y|代表决策树决策结果的数目。如判断西瓜好坏,那么|y| = 2:
例如:某个事件发生会出现三种情况(A、B、C),出现A的概率为 1 3 \frac{1}{3} 31,出现B的概率为 1 2 \frac{1}{2} 21,出现C的概率为 1 6 \frac{1}{6} 61;如何处理这种情况呢?
我们可以将这三种情况拆解,转化为等概率的情形(图中绿色部分),如图所示:
转化为等概率的情况之后,通过计算,我们发现,等概率的情况下相当于抛 log 2 6 \log_2 6 log26 枚硬币,但是对于情况A来说,拆解成的二种情况相当于一种,也就是说,情况A相当于抛 log 2 6 \log_2 6 log26 - log 2 2 \log_2 2 log22 枚硬币,故
同理,
此时的熵的计算:
满足我们一开始提出的公式,并且信息熵的值越小表明样本的纯度越高
在实际生活中,我们在节点划分之后,可以根据公式(1)计算出每一个节点对应属性(比如属性a)的信息熵,但是由于每一个节点在同属性值上所包含的样本数目( D v D^v Dv)不同,所以我们需要为每一个节点赋予权重| D v D^v Dv|/|D| ,即包含样本数目越多的节点的影响越大,于是便可计算出用属性a对样本集进行划分所获得“信息增益”,其中V为根据某一属性进行划分产生的分支的数目:
一般而言信息增益越大,表明用该属性进行划分所获得的纯度提升越大,因此,我们可以通过计算信息增益来进行划分属性的选择。
例如西瓜书表4.1为例:
从表中可以发现,其中正例(好瓜)占 p 1 p_1 p1 = 8 17 \frac{8}{17} 178 ,反例占 p 2 p_2 p2 = 9 17 \frac{9}{17} 179 ,根据公式1 可计算出根节点的信息熵为:
之后我们要计算当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感},来计算每一个属性的信息增益;以色泽为例,若按照色泽进行属性划分,可分为三个子集,分别是 D 1 ( 青 绿 ) D^1(青绿) D1(青绿) 、 D 2 ( 乌 黑 ) D^2(乌黑) D2(乌黑) 、 D 3 ( 浅 白 ) D^3(浅白) D3(浅白):其中 D 1 ( 青 绿 ) D^1(青绿) D1(青绿)中包含样例{1,4,6,10,13,17},其中正例占 3 6 \frac{3}{6} 63,反例占 3 6 \frac{3}{6} 63,同理计算 D 2 D^2 D2以及 D 3 D^3 D3的正反例占比情况,计算三个子集的信息熵:
根据公式2计算出属性色泽的信息增益为:
同理,我们可以计算出其他属性的信息增益:
所以纹理属性的信息增益最大,故将其作为划分属性,并且得到三个分支及每个分支包含的样本集,如图所示;
我们再对每一个分支节点进行划分,需要注意的是,在进行划分,纹理不是划分属性集中的一员,故只需要计算{色泽,根蒂,敲声,脐部,触感}中每一个的信息增益,且其样本集为每一个分支的样本集,而非总样本D!
比如我们想要在稍糊的分支下继续进行划分,那么首先计算该节点的信息熵,其中共有九个样例,其中正例7个(7/9),反例2个(2/9),计算其熵;如果按照色泽进行划分,则会产生三个分支,其中乌黑(四个样例,正反比:3:1),青绿(四个样例,正反比:3:1),浅白(1个样例,正反比:1:0),以此计算;最终会得到一颗决策树,如图所示:
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种影响,著名的C4.5决策树算法不直接使用信息增益,而是使用增益率才选择最优划分属性;
其中
成为属性a 的固有值,a的可能取值数目越多(V越大),IV(a)的值通常就会越大;
不过增益率准则对可取值数目较少的属性会有所偏好,因此C4.5不是直接选择增益率大的属性进行划分,而是从候选属性中先找到一个信息增益高于平均水平的属性,再从中选择增益率高的。
通常我们会有不同的策略来进行属性的划分,CART决策树就是通过基尼指数来选择划分属性,数据集D的纯度可以用基尼指数来进行度量即:
那么如何理解基尼指数呢?直观来说,基尼指数反映了从数据集中随机抽取两个样本其类别标记不一致的概率,比如一袋子中有红球4个,白球6个,那么随机抽取两个球,颜色一样的概率是 ( 4 10 ) 2 (\frac{4}{10})^2 (104)2 + ( 6 10 ) 2 (\frac{6}{10})^2 (106)2,那么不一样的概率就是1 - ( 4 10 ) 2 (\frac{4}{10})^2 (104)2 - ( 6 10 ) 2 (\frac{6}{10})^2 (106)2
因此基尼指数越小,代表数据集的纯度越高;
属性a的基尼指数定义为:
所以我们在选择划分属性时,选择基尼指数最小的那个候选属性即可。
决策树是一种很常见也很常用的机器学习的方法,在生成一颗决策树的时候,如何选择划分属性就是一个十分关键的问题,我们可以依据 信息熵、信息增益、增益率以及基尼指数来解决该问题,但是决策树也是一个经过训练集训练生成的模型,那么就一定会遇到模型过拟合的问题,如何解决这个问题呢?
请继续阅读 决策树(下)
1、 机器学习(西瓜书) - 周志华
2、【一起啃书】机器学习西瓜书白话解读