从决策树到随机森林

这里仅介绍分类决策树

决策树特征作为决策的判断依据,整个模型形如树形结构,因此,称之为决策树

对于分类决策树,他们可以认为是一组if-then规则的集合。决策树的每一个内部节点有特征组成,叶子节点代表了分类的结果。父节点和子节点之间是由有向边连接,表示了决策的结果。

在这里,有必要解释一下,为什么决策树的学习过程变成了三个步骤:特征选择、决策树生成和剪枝。而不是像LR或者SVM那样,具有显式的目标函数。首先,我们来看决策树:一个树形结构。如果要根据全局最优的策略,那么需要遍历数据集在所有的特征组合下生成的决策树,比较所有决策树的优略。这是一个N-P完全问题,求解这种问题一般只能求得次最优解,求得最优解时间成本太高。

下面,我们按照这三个步骤,来分析如何生成决策树。

特征选择:

从前面的分析可以知道,每一个内部节点,都代表了一个特征,有这些特征后,数据集离得到确定的分类结果更近一步。那么什么样的特征才会更好地让数据集的分类确定得更快,这是我们接下来需要解释的事情。

我们知道,初始的数据集 相较 已经分类完毕的数据集 更加混乱。而决策树的目标,是希望找到一组特征,让数据集分类结果确定,而且最大程度靠近正确的答案。决策树每使用一个特征,都更接近正确的分类,让数据集都变得更整齐一点。衡量数据的混乱程度,我们常用两个标准:一个是信息熵,另外一个是基尼指数。而根据信息熵和基尼指数,我们得到三个选择选择特征的办法。

给定一个训练集$D={(x_1,y_1),(x_2,y_2)....(x_n,y_n)}$,正确的分类是${C_1,C_2,....,C_n}$

使用特征A得到的分类是${D_1,D_2,....,D_n}$

(1)       信息增益

信息熵的基本定义这里就不详细说明了,需要了解的请出门左转维基百科。

定义: H(D)为给定的训练数据集的信息熵。H(D|A)是经过特征A分类后数据集的信息熵。根据定义,可以得到:

          $H(D)=-$ $sum_{i=1}^{n}$ $frac{|C_k|}{|D|}log_2$ $frac{|C_k|}{|D|}$

         $H(D|A)=$ $sum_{i=1}^{n}$ $frac{|D_i|}{|D|}H(D_i)$.其中 $H(D_i)=-$ $sum_{k=1}^{K}frac{|D_{ik}|}{|D_i|}log_2frac{|D_{ik|}}{|D_i|}$

因此,信息增益为$G(D,A)=H(D)-H(D|A)$

(2)       信息增益比

由于信息增益倾向于选择较多的特征,为了限制这个影响,使用信息增益比来解决这个问题:

            $g_R(D,A)=$ $frac{g(D,A)}{H_A(D)}$

其中,$H_A(D)=-$ $sum_{i=1}^{n}$ $frac{|D_i|}{|D|}log_2$ $frac{|D_i|}{|D|}$

(3)       基尼指数

           $Gini(D)=1-$ $sum_{k=1}^{K}$ $(frac{|C_k|}{|D|})^2$

           假设用特征A将数据D分为D1和D2,那么分类后的基尼指数是:

          $Gini(D,A)=$ $frac{|D_1|}{|D|}$ $Gini(D_1)+$ $frac{|D_2|}{|D|}Gini(D_2)$

按照我们的理解,所有有助于确定数据集分类的特征,都会让数据集变得更加整齐,那么,该怎么选择特征,才能让决策树更加合理呢?

决策树生成:

建立一棵决策树,树的深度,决定了决策树的效率。而影响树的深度的,则是特征的有效性。如何衡量特征的有效与否?前面已经找到三个判别标准。决策树的解决这个问题的策略是:

优先使用信息增益最大、信息增益比最大、基尼指数最小的特征

因为满足上面这些特点的特征,能最大程度减少数据集中的不确定性。而决策树的生成,则是不断选取剩下的特征里面的最优特征。直到满足收敛条件。

决策树生成算法:                                                                                                                    

ID3和C4.5

输入:训练集D,特征集A,阀值μ

输出:决策树T

(1)       如果D中的所有实例,都属于同一个类$C_k$,那么置T为单节点树,返回T

(2)       如果$A=Ø$,置T为单节点树,将D中实例数最大的类$C_k$作为该节点的类,返回T

(3)       按照上面的三个判断标准,计算信息增益(信息增益比),选择信息增益最大(信息增益比最大)的特征$A_g$。

(4)       若$A_g<μ$,置T为单节点树,将D中实例数最大的类$C_k$作为该节点的类,返回T

(5)       否则使用特征A分割数据集D,建立树,返回T

(6)       对节点i,以$D_i$为训练集合,以$A-{A_g}$为特征集,递归调用(1)~(5)

CART:

(1)       根据特征A,将数据集预分类为A=a和A!=a两类,计算基尼指数

(2)       选择基尼指数最小的特征作为分类特征,将数据集切分。切分的两个子节点包含两个被分开的数据集。

(3)       对两个子节点递归调用(1)(2),直到满足停止条件。

(4)       生成CART决策树。

剪枝:

由上面的办法生成的决策树,常常会出现过拟合的问题。所谓的过拟合,是指学习到的模型对已知的训练数据集预测效果比较好,但是,对于未知的训练数据集,预测很差。

因此,为了限制过拟合的现象,决策树使用了剪枝的策略。

决策树学习损失函数为:

$C_a(T)=$ $sum_{t=1}^{|T|}$ $N_{t}H_{t}(T)+a|T|=C(T)+a|T|$

经验熵 描述的是所有叶子节点的经验熵之和,其公式如下:

$H_{t}(T)=-$ $sum_{k}$ $frac{N_{tk}}{N_t}H_{t}(T)$

$C(T)$表示模型对训练数据的预测误差,即模型的拟合程度,|T|描述了模型的复杂度,参数$ageq 0$控制两者的影响。

一般的剪枝算法:

输入:树T和参数a

输出:修剪后的子树$T_a$

(1)       计算每个节点的经验熵

(2)       递归地从树的叶子节点向上回缩。

               设一组叶节点回缩到父节点之前和之后的整体树分别为$T_B$和$T_A$

               若$C_a(T_A)$ $leq{C_a(T_B)}$,则剪枝。

(3)       返回(2),直到无法剪枝。

CART剪枝:

输入:CART算法生成的决策树$T_0$

输出:最优决策树

(1)       令$k=0,T=T_0$

(2)       $a=+$ $infty$

(3)       自下而上地对各内部节点t计算 以及:

              $g(t)=$ $frac{C(t)-C(T_t)}{|T|-1}$

              $a=min(a,g(t))$

              $T_t$表示以t为根节点的子树,$C(T_t)$是对训练数据的预测误差,$|T_t|$是$T_t$的叶子节点个数。

(4)       自上而下地访问内部节点t,如果有$g(t)=a$,进行剪枝,并对叶节点t以多数表决法决定其类,得到树T。

(5)       $k=k+1, a_k=a, T_k=T$

(6)       如果T非根节点单独构成的树,回到(4)

(7)       采用交叉验证的办法在子树序列中选取最优子树$T_a$

随机森林:

顾名思义,就是采用随机的办法生成一个森林。而森林是由一棵棵的树组成,因此,随机生成森林实际上是随机生成一棵棵决策树,让这些决策树组成森林。

随机森林可以认为是针对决策树容易过拟合的现象而提出来的解决方案,是组合算法的一种。其基本步骤如下:

输入:N的训练数据,M个特征

输出:随机森林。

(1)       从训练样本中有放回地抽出N个训练样本,作为决策树的输入。

(2)       从M个特征中随机选取k个属性,一般取$k=log_2M+1$向上取整或者$k=$ $sqrt M$向上取整

(3)       重复(1)(2)m次得到m个决策树,组成森林。

(4)       让新的数据集通过随机森林(m个决策树)

对于分类问题:通过投票的方式决定分类结果;

对于回归问题:通过求均值的方式确定回归结果。

至于回归树,将会在后续的博客中总结。

参考文献:

(1)李航 《统计学习方法》

(2)维基百科

转载请注明:http://www.cnblogs.com/weibao/p/5548982.html

有任何问题,请联系weibao798@gmail.com

                                                                                                         

原文地址:https://www.cnblogs.com/weibao/p/5548982.html