机器学习(西瓜书)学习笔记(三)---------决策树

1、基本流程

      决策树通常从一个最基本的问题出发,通过这个判定问题来对某个“属性”进行“测试”,根据测试的结果来决定导出结论还是导出进一步的判定问题,当然,这个判定范围是在上次决策结果的限定范围之内的。

      出发点一般称为根节点,其他的判定位置称为节点,得到的结果一般称为叶,不同的判定导致的不同走向称为枝,这样,一颗完整的决策树就呈现了出来。

      决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树,相关伪代码如下图:

        很明显,决策树的生成是一个递归过程,有三种情况会导致递归返回。

2、划分选择

         决策树的决策关键在于枝点的最优属性划分,选择的合理划分的结果也相对更准确。

2.1  信息增益

       信息熵是度量样本集合纯度(混乱度)最常用的一种指标。假定当前样本集合D中第k类样本所占比例为p_{k},则D的信息熵定义为:

                                                       Ent(D) = -\sum_{k=1}^{|y|} p_{k}log_{2} p_{k} .       注意:此处约定p=0时,plog_{2}p = 0.

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

       假定离散属性a有V个可能的取值,当使用其中某一个对样本集D进行划分时将产生V个分支节点,其中,第v个分支节点包含了D中所有在属性a上取值的样本,记为D^{v},给分支节点赋予权重|D^{v}|/|D|,这样就可以计算出用属性a对样本集D进行划分所得的信息增益:

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

因此,可以看出信息增益越大,则意味着使用属性a来划分所得的“纯度提升”越大,故而选择该属性来划分数据集是最佳选择,著名的ID3算法就是这样做的。

公式比较抽象,结合例子就能明白:

2.2   增益率

         信息增益准则有一个明显的缺点就是对可取值数目较多的属性有所偏好,比如上面的西瓜数据集序号那一列,如果计算它的信息增益的话肯定是最大的,根据他来划分显然没有什么意义;著名的C4.5算法使用“增益率”来选择最优划分属性,从而解决信息增益的缺陷。

                           Gain_ratio(D,a) = \frac{Gain(D, a)}{IV(a)},      其中    IV(a) = -\sum_{v=1}^{V} \frac{|D^{v}|}{|D|} log_{2} \frac{|D^{v}|}{|D|}   称为属性a的“固有值”。

需要注意的是,增益率准则对可取值数目较少的属性有所偏好,基于此,C4.5算法并不是直接选取增益率最大的属性进行划分,而是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选取增益率最高的。

2.3  基尼指数

         CART决策树(Classification and Regression Tree)是一种著名的决策树学习算法,分类和回归任务都可以用,它使用“基尼指数”来选择划分属性。

                                         Gini(D) = \sum_{k=1}^{|y|}\sum_{k^{'}\neq k}p_{k}p_{k^{'}} = 1 - \sum_{k=1}^{|y|} p_{k}^{2} .

直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,表明数据集D纯度越高。

属性a的基尼指数定义为:

                                                       Gini_index(D,a) = \sum_{v=1}^{V} \frac{|D^{v}|}{|D|} Gini(D^{v}) .

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

3、剪枝处理

          剪枝是决策树学习过程中对付“过拟合”的主要手段,决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是在决策树生产过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶节点;后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能的提升,则将该子树替换为叶节点。

        如何判断决策树泛化性能是否提升?可以使用第二章介绍的性能评估方法,在这里我们采用留出法来进行讨论。将原始数据进行划分如下:

采用信息增益准则对属性进行划分。

3.1  预剪枝

          当采用某个属性来对训练集进行划分时,这一步是否必要?即是否应该进行这个划分?这时候,预剪枝要对划分前后的泛化性能进行估计。相关图示如下:

如该决策过程,节点1划分后结果变好,应该进行划分;节点2、节点3划分后结果变差,应该禁止划分。

从这个例子可以看到,预剪枝降低了过拟合的风险,减少了训练时间开销和测试时间开销。但另一方面,有一些分支当前不能提升泛化性能,但在其基础上进行的后续划分却有可能导致性能提升;因此,预剪枝会带来一些欠拟合风险。

3.2  后剪枝

        后剪枝则先生成一颗决策树,自下而上如图4.5的节点6开始进行是否有必要剪枝的判断,如果将该分支节点及其子树改为叶节点后能提升验证精度(泛化性能),那么就进行剪枝。

从图可以看出,后剪枝比预剪枝留下更多的分支。一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝;但是由于是后剪枝,生成决策树过后还要自下而上进行剪枝判断,因此相比之下训练时间开销更大。

4、连续与缺失值

4.1  连续值处理

        前面讨论的数值都是离散属性的,现实中常常遇到连续属性,因此决策树中如何使用连续属性很有必要。由于连续值不像离散值可以单个取值,因此需要使用连续属性离散化技术(如二分法)来将连续值进行分段。(这正是C4.5算法采用的机制)

        给定样本集D和连续属性a,根据a将D从小到大排序,基于划分点t可以将D划分为两段,但如何选定划分点t呢?首先我们选取一个划分点集合T,集合点里面的数据是相邻属性值a的中位点:

                                                        T_{a} = \left \{ \frac{a^{i} + a^{i}}{2} | 1 \leqslant i \leqslant n-1\right \} ,

然后,我们就可以像离散属性值一样来考察这些划分点,再选取最优的划分点来进行样本集合的划分:

                          Gain(D,a) = \underset{t\in T_{a}}{max}Gain(D,a,t) =  \underset{t\in T_{a}}{max} Ent(D) - \sum_{\lambda \in \left \{ -,+ \right \}}^{ } \frac{|D_{t}^{\lambda }|}{|D|} Ent(D_{t}^{\lambda }) ,

Gain(D,a,t)就是样本D基于划分点t二分后得到的划分点集合T_{a}的信息增益,因此可以选择使Gain(D,a,t)最大化的划分点t,这样就可以将连续值转化为离散值进行划分。

注意:与离散属性不同的是,若当前节点划分属性为连续属性,该属性还可作为其后代节点的划分属性。

4.2  缺失值处理

        有时候出于成本,隐私保护、录入差错等原因,总造成样本的某些属性值缺失,但如若去除有缺失的数据,往往有可能导致样本数量大幅减少,而且造成了信息浪费,因此有必要使用含有缺失属性值的样本进行训练学习。

        使用含有缺失值的样本需要解决两个问题:1. 如何在属性值缺失的情况下进行划分属性选择?2. 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

先介绍概念及公式,后面用例子来进行理解;

       给定训练集D及属性a,令\tilde{D}表示D在属性a上没有缺失值的样本子集,那么对于问题1我们就可以使用\tilde{D}来判定属性a的优劣。

                                      Gain(D,a) = \rho \times Gain(\tilde{D},a) = \rho \times \left ( Ent(\tilde{D}) - \sum_{v=1}^{V} \tilde{r}_{v} Ent(\tilde{D}^{v})\right ) ,

其中:

                                     Ent(\tilde{D}) = - \sum_{k=1}^{|y|} \tilde{p}_{k}log_{2}\tilde{p}_{k}

\rho 表示该属性下有值的数据占总数据的比例,相当于是给子集\tilde{D}加一个权重;\tilde{r}_{v}则是在当前属性下去除缺失值后各个不同取值所占的比例。

        对于问题2我们可以这样处理,当这个值缺失我们不知道划分到哪个子节点中去的时候,可以将它以不同的概率划入到各个子节点中,概率值为当前属性下各属性值的比例。

C4.5算法就是使用的上面这种方案。

看下面的例子加以理解:

5、多变量决策树

        先讨论一下前面介绍的单变量决策树,每次只对某一个属性进行划分,如果将数据放在坐标轴中,那么对样本分类即寻找不同样本之间的边界,单变量决策树就是寻找与坐标轴平行的能对样本进行分类的边界;对于简单问题,这种方式还可行,但当问题很复杂时,需要很多段的划分才能获得较好的分类,这时决策树较复杂,训练开销较大。

      多变量决策树则是通过将每次只用一个属性划分的方式改为多个从而将平行于坐标轴的划分边界变得倾斜,从而使得划分次数降低,决策树模型大大简化。

猜你喜欢

转载自blog.csdn.net/Coding___Man/article/details/84755898