决策树知识点总结

本章介绍关于决策树的知识,理论部分来自周老师的西瓜书,代码部分来自《机器学习实战》,有位作者对代码实现已经做了很好的介绍,有兴趣的朋友可以看一下,感谢作者。(https://www.cnblogs.com/dennis-liucd/p/7905793.html)。

一、基本流程

顾名思义,决策树是基于树结构来进行决策的,这也是人类在面临决策问题时一种很自然的处理机制。决策过程中提出的每一个问题都是对某个属性的“测试”,每个测试或是导出最终结论(分类结果),或是导出进一步需要判定的问题,其考虑范围是在上次决策结果的限定范围内进行的。

一般地,一棵决策树包含一个根结点、若干内部结点和若干叶结点;叶结点对应决策结果(样本最终的分类),其他每个结点则对应一个属性测试;每个结点包含的样本集合依据所选属性的取值被划分到相应的叶结点中去;根结点包含全部的样本。从根结点到每个叶结点的路径对应了一个判定测试序列。决策树的学习算法是一个递归算法:

在决策树算法中,有三中情况会导致递归返回:(1)当前结点包含的样本全属于一个类别,无需划分;(2)当前属性集为空,或者所有样本在所选属性上的取值都相同,无法划分(解决思路:把当前结点标记为叶结点,将其类别设定为所含样本类别最多的类别);(3)当前结点包含的样本集合为空(解决思路:把当前结点标记为叶结点,将其类别设置为其父结点中所含样本数目最多的类别)。

二、划分选择

由上面的决策树算法知,决策树学习的关键是第8行,即如何选取最优的划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。

2.1信息增益

“信息熵”是度量样本集合纯度最常用的一种指标。假定当前集合D中第k类样本所占的比例为{p_{k}}^{}(k=1,2,...,|y|)(k =1,2,...,n),则D的信息熵定义为:

                                                                                 Ent(D)=-\sum_{k=1}^{n}p_{k} log_{2}p_{k}

Ent(D)的值越小,则D的纯度越高。

假定离散属性aV个可能的取值{{ a^{1},a^{2},...,a^{V}}},若使用a来对集合进行划分,则会产生V个分支结点,其中第v个分支结点包含了集合D中所有属性a上取值为a^{v}的样本,记为D^{v }。我们有上面的公式可以计算出该集合的信息熵,再考虑到不同的分支结点所包含的样本数目不同,给每个分支结点赋予权重|D^{v }|/|D|,即样本数越大,对分支结点的影响也就越大,于是可以计算出用属性a对样本集D进行划分所获得的“信息增益”:

                                                                  Gain(D,a)=Ent(D)-\sum_{v=1}^{V}|D^{v}/D|Ent(D^{v})

一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。因此,我们在进行划分时,依次计算每个属性的信息增益,选取增益最大的特征作为最优划分属性。(著名的ID3算法就是如此)

2.2增益率

当决策树产生的分支结点太多时,就出现了过拟合问题,这样的决策树不具有泛化能力。实际上,信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,著名的C4.5决策树算法不直接使用信息增益,而是使用“增益率”来选择最优划分属性。信息增益率定义为:

                                                          

其中,属性a的可能取值的数目越多,IV(a)的取值就越大。

需要注意,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的属性作为划分属性。

2.3基尼指数

CART决策树(分类回归树,可用于分类和回归)使用“基尼指数”来选择划分属性。同样是基于决策树的生成是希望分支结点的纯度越高越好这样一个原则,我们还可以通过基尼系数这一指标来衡量样本集合的纯度,基尼系数定义为:

                                                                           

从概率论来看,Gini(D)反应了从数据集D中抽取两个样本,其类别不一致的概率。因此基尼系数越大,则表示样本集合的纯度越低。属性a的基尼指数定义为:

                                                     。

于是,我们在属性候选集合A中选择那个使得划分后基尼指数最小的属性作为最优划分属性。

三、剪枝处理

现在来考虑一个问题:决策树是不是形态越丰富,分支越多,越复杂,分类越准确呢?显然是否定的。学习算法中存在着一个需要特别注意的问题:“过拟合”。换句话说就是学习过程中过度的学习了训练集的特点,把训练集自身的一些特点当作所有样本数据都具有的一般性质,也就是学的太过了,有一些不应该继续分支的结点继续进行划分了,导致分支过多过冗余。这样子反而会降低学习算法的泛化能力。剪枝对于决策树的泛化性能的提升是显著的,有实验研究表明[Mingers,1989a],在数据带有噪声时,通过剪枝甚至可以将决策树的泛化性能提高25%。

所以剪枝这一名词也因此得来,因为剪枝的目的就是剪去过多的分支!决策树剪枝的基本策略有“预剪枝”和“后剪枝”,两者的界定就是一个发生在决策树生成过程中,一个是发生在决策树生成后。

3.1预剪枝

预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将该结点标记为叶结点。

我们可以通过留出法来对泛化性能进行评估。将样本集合分为训练集和验证集。在基于前面提到的几种属性划分选择的基础上,对比划分前后的验证集的准确率来进行泛化性能的评估。如果经过划分后,验证集的准确率提高了,则认为当前结点的划分对于泛化性能的提升是有意义的,否则不计划分。

通过预剪枝,不仅可以降低过拟合的风险,同时因为限制了无意义的结点划分,在训练和测试的计算成本上也有所优化。由以上论述,我们可以认识到预剪枝是判断当前结点对于泛化性能的影响,并没有考虑当前结点的后续结点是否有机会能够提升泛化性能,这是一种“贪心”的本质。这个策略带来的问题就是有可能会丢失那些在后续确实能提高泛化性能的结点,因此预剪枝带来欠拟合的风险。

3.2后剪枝

后剪枝是发生于决策树生成完成以后,从由底至上考虑每个非叶节点,若将该结点替换为叶节点能够给决策树带来泛化性能的提升的话,则将该结点替换为叶节点。因为后剪枝是在一棵完整的决策树的基础上从底至上考虑每个非叶节点,相对于预剪枝来说欠拟合风险很小,不过训练时间开销是比较大的。

四、连续与缺失值

4.1连续值处理

由于连续属性的可取值的数目不再有限,所以需要新的方法来对该属性进行划分。最简单的策略是采用二分法对连续属性进行处理,C4.5决策树就是采用这种方法。

划分的基本思路是选取一个划分点 t,将数据集  划分成D_{t}^{-} 和D_{t}^{+}两个子集(也就是划分后的子结点),其中D_{t}^{-}包含属性a的取值不大于t的那些样本,D_{t}^{+}包含了属性 a 不小于 t 的那些样本。那么,如何选择划分点 t 呢?

首先,将  中样本的属性a的所有取值按从小到大的顺序排列,记为{a1,a2,...,an};

然后,选取每个子区间[a_i{} ,a_i+1{})的中点作为备选的划分点集合,即

                                                                        

最后,基于使划分后的信息增益最大的原则,在备选集合 Ta 中选出最优的划分点 

                                                               

在这里有一点需要注意的是:

离散属性的划分中,作为当前结点划分依据的属性,再其分支结点将不再作为划分考虑。例如在判别西瓜的好坏分类中,我们第一个结点通过色泽分出了亮和暗,得出了亮和暗两个分支结点。那么接下来这两个分支结点将不再考虑西瓜的色泽属性了,因为在第一个结点已经明确划分出了哪些瓜是“亮”属性,哪些瓜是“暗“属性,离散属性的划分重点是判别”是什么“,所以不存在多次重复判别。

而连续属性不同,连续属性例如通过二分法来离散化,划分重点不是”是什么“,而是”区间内属性值的大小关系“,这是可以多次划分多次比较的。例如在区间0到1,第一个结点是以t=0.5进行划分,得出两个分支结点v1,v2。 在v1中0到0.5,我们可以再次选定一个划分点t=0.25,再次划分出分支结点。

这是连续属性与离散数学在划分时的一个区别。

4.2缺失值处理

在前面的讨论中,我们都是假定样本属性的值都不是缺失的,但现实情况下还是存在一些样本是缺失的。例如由于测试成本,隐私保护等等。

如果缺失属性样本较多的话,并且不做任何处理,简单的放弃不完整样本的话,显然对数据信息是极其浪费的。样本不能放弃,但是属性缺失我们不得不放弃,因为本身就缺失,我们不可能凭空随便插入一个值,所以我们只能在划分过程中进行处理,减小划分误差。总的来说需要我们考虑的问题有两个:

(1)如何在属性值缺失的情况下进行划分属性选择?

(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

先讨论问题(1):

我们给定训练集D和属性a,令表示D中在属性a上没有缺失值的样本集合,显然我们只能通过来判断属性a的优劣。假定属性a有V个可取值,令表示在属性a上取值为的样本子集,表示中属于第k类(k=1,2,...,|y|)的样本子集。假定我们为每个样本x赋予一个权重Wx,初值为1。同时定义:

,表示对于属性a,无缺失的样本比例;

,表示无缺失样本中,第k类所占比例;

,表示无缺失样本在属性a上取值为的样本的比例;

基于上述推论,我们可以将信息增益的计算时推广为:

                                                          

其中Ent(\widetilde{D})=-\sum_{k=1}^{|y|} \widetilde{p_{k}}log_2{}\widetilde{p_{k}}

对于问题(2):

出于缺失值的样本终归还是不是理想样本,估我们还是希望这样的非理想样本对于决策树的贡献减小,因此我们有如下策略:

若样本 x 在划分属性a上的取值已知,则将x划入与其对应的分支结点,并保持样本权重Wx不变。若样本x在划分属性a上的取值未知,则将样本x划入所有分支结点,且样本权重调整为\widetilde{r_{v}}\cdot w_{x}

五、多变量决策树

想象一下,若我们把样本的每个属性都视为坐标空间中的一个坐标轴,则由d个属性描述的样本就对应了d维空间中的一个数据点。对样本的分类就意味着在这个坐标空间中寻找不同类样本之间的分类边界。而我们前面提到的决策树在d维空间中形成的分类边界有一个特点:轴平行,如图4.11所示,这个样本集的属性只包括两个连续属性(密度,含糖率),它的分类边界由若干个与坐标轴平行的分段组成的。

                                                        

                                                        

如图4.10以及4.11所示,在图4.10的决策树上有几个分支结点,对应图4.11则有几段关于轴平行的分类边界。这样的分类边界的确取得了很好的解释性,但是这仅仅是二维小样本容量上的应用。如果样本很复杂,是多维的大样本,那么必须通过很多很多段的划分才能取得较好的近似,例如图4.10中的决策树需要4段分类边界。通过多段的分类边界去划分,显然时间开销是很大的,因此假如我们不局限于平行与轴的分类边界,考虑使用斜的划分边界,如图4.12所示,此时就引入了“多变量决策树”。

                                                     

“多变量决策树”与“普通决策树”相比,关键在于分支结点的属性测试的区别。“多变量决策树”的属性测试不再是单一的属性测试,而是对多个属性的线性组合进行测试。换句话说,对于分支结点的属性测试,我们不再是为每个结点寻找一个最优划分属性了,而是对每个分支结点建立一个合适的线性分类器(\sum_{i=1}^{d}w_{i}a_{i}\leqslant t),例如图4.10中的数据集,我们通过多变量决策树生成如图4.13所示的决策树,并且其分类边界如图4.14所示。

                                                  

                                                    

六.常见的决策树分类方法

(1)、CLS算法:是最原始的决策树分类算法,基本流程是,从一棵空数出发,不断的从决策表选取属性加入数的生长过程中,直到决策树可以满足分类要求为止。CLS算法存在的主要问题是在新增属性选取时有很大的随机性。

(2)、ID3算法:对CLS算法的最大改进是摒弃了属性选择的随机性,利用信息熵的下降速度作为属性选择的度量。ID3是一种基于信息熵的决策树分类学习算法,以信息增益和信息熵,作为对象分类的衡量标准。ID3算法结构简单、学习能力强、分类速度快适合大规模数据分类。但同时由于信息增益的不稳定性,容易倾向于众数属性导致过度拟合,算法抗干扰能力差。

ID3算法的核心思想:根据样本子集属性取值的信息增益值的大小来选择决策属性(即决策树的非叶子结点),并根据该属性的不同取值生成决策树的分支,再对子集进行递归调用该方法,当所有子集的数据都只包含于同一个类别时结束。最后,根据生成的决策树模型,对新的、未知类别的数据对象进行分类。

ID3算法优点:方法简单、计算量小、理论清晰、学习能力较强、比较适用于处理规模较大的学习问题。

ID3算法缺点:倾向于选择那些属性取值比较多的属性,在实际的应用中往往取值比较多的属性对分类没有太大价值、不能对连续属性进行处理、对噪声数据比较敏感、需计算每一个属性的信息增益值、计算代价较高。

(3)、C4.5算法:基于ID3算法的改进,主要包括:使用信息增益率替换了信息增益下降度作为属性选择的标准;在决策树构造的同时进行剪枝操作;避免了树的过度拟合情况;可以对不完整属性和连续型数据进行处理;使用k交叉验证降低了计算复杂度;针对数据构成形式,提升了算法的普适性。

(4)、SLIQ算法:该算法具有高可扩展性和高可伸缩性特质,适合对大型数据集进行处理。

(5)、CART(Classification and RegressionTrees, CART)算法:是一种二分递归分割技术,把当前样本划分为两个子样本,使得生成的每个非叶子节点都有两个分支,因此,CART算法生成的决策树是结构简洁的二叉树。

分类回归树算法(Classification and Regression Trees,简称CART算法)是一种基于二分递归分割技术的算法。该算法是将当前的样本集,分为两个样本子集,这样做就使得每一个非叶子节点最多只有两个分支。因此,使用CART算法所建立的决策树是一棵二叉树,树的结构简单,与其它决策树算法相比,由该算法生成的决策树模型分类规则较少。

CART分类算法的基本思想是:对训练样本集进行递归划分自变量空间,并依次建立决策树模型,然后采用验证数据的方法进行树枝修剪,从而得到一颗符合要求的决策树分类模型。

CART分类算法和C4.5算法一样既可以处理离散型数据,也可以处理连续型数据。CART分类算法是根据基尼(gini)系数来选择测试属性,gini系数的值越小,划分效果越好。设样本集合为T,则T的gini系数值可由下式计算:

                                                                      

其中,pj是指类别j在样本集T中出现的概率。若我们将T划分为T1、T2两个子集,则此次划分的gini系数的值可由下式计算:

                                               

其中,s为样本集T中总样本的个数,s1为属于子集T1的样本个数,s2为属于子集T2的样本个数。

CART算法优点:除了具有一般决策树的高准确性、高效性、模式简单等特点外,还具有一些自身的特点。如,CART算法对目标变量和预测变量在概率分布上没有要求,这样就避免了因目标变量与预测变量概率分布的不同造成的结果;CART算法能够处理空缺值,这样就避免了因空缺值造成的偏差;CART算法能够处理孤立的叶子结点,这样可以避免因为数据集中与其它数据集具有不同的属性的数据对进一步分支产生影响;CART算法使用的是二元分支,能够充分地运用数据集中的全部数据,进而发现全部树的结构;比其它模型更容易理解,从模型中得到的规则能获得非常直观的解释。

CART算法缺点:CART算法是一种大容量样本集挖掘算法,当样本集比较小时不够稳定;要求被选择的属性只能产生两个子结点,当类别过多时,错误可能增加得比较快。

猜你喜欢

转载自blog.csdn.net/qq_41951186/article/details/82793631