白话梳理树模型——从决策树到lightGBM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了白话梳理树模型——从决策树到lightGBM相关的知识,希望对你有一定的参考价值。

参考技术A

本文仅为简单梳理树模型升级过程,尽量少牵扯到数学公式,用大白话来理解。

熵,熵用来描述事件的不确定性,越随机熵值越大。

如何理解不确定性呢?假设现在有一个伯努利分布,p(0) = p(1) = 1/2,则这个分布的不确定性是最大的,因为我们抽样的时候完全无法确定抽样出来的那个数值的概率更大,两者都是1/2,所以不确定性在这里可以理解为某个事件发生的概率。我们再来看看熵值的公式:

对于一个伯努利其熵值为:
H(p) = -p(p)log(p) - (1-p)log(1-p)

为了验证我们上面提到的伯努利分布的某个事件发生概率为1/2时熵最大,将p=1/2代入上式得到的熵值与p=4/5时的熵值进行比较即可,可以得到
H(p=1/2) > H(p=4/5)。

当P等于4/5时,我们有很大的概率(80%)可以确定事件会发生,而p=1/2时,则完全无法确定事件是否会发生,因为发生不发生的概率相等,这就是事件发生的不确定性。也即熵值H(p=1/2) > H(p=4/5)可以得出p=4/5时,不确定性更小,能更方便的猜出事件是否会发生。

树模型作为一种简单易理解的方式,其训练过程即是通过简单if/else来将所有的样本划分到其对应的叶子中。

ID3决策树使用信息增益来作为特征选择标准,每次选择信息增益最大的特征。需要注意的是ID3是一颗多叉树,因此他总是倾向于选择特征值更多的特征来进行分裂。如何理解呢?

一个极端的例子,假设我们以人的DNA为特征来对训练集中的人群进行分类,毫无疑问的,只需要这一个特征(每个样本一个特征值)且只要这一次分裂就可以将所有人分开,因为每个人的DNA是唯一的,因此每一个人都是一个叶子结点。但是这个时候如果我们想要预测测试集怎么办?测试集中的人群DNA在训练集中没出现过,因此模型无法对测试集进行正确预测。也就是发生了我们常常说的过拟合现象。

ID3小总结:

C4.5决策树针对ID3决策树偏好值多的缺点进行改进,引入了信息增益比来作为分裂标准。

C4.5相较于ID3的改进有:

C4.5树仍然使用的是多叉树,因此每个特征仅使用一次,在后续分裂中不再使用。且只能用于分类。

CART决策树相对于C4.5树进行了改进:

随机森林属于bagging算法,有两个随机过程:

预测时,分类问题投票,回归问题求平均。

优点:

梯度提升树 由多个回归决策树 串联得到,因此建树时的分裂标准是均方误差和。

梯度提升树的每个树都会拟合上棵树的拟合目标残差。

在梯度提升决策树中,还添加了shrinkage,这个是与adaboost的一个重大区别,相当于学习率,控制每棵树学习到更少的东西,使用更多的树来进行集成学习。

缺点:

xgboost的相对于GBDT的一个非常重要的改进就是使用泰勒二阶展开来近似拟合残差,也即如下公式:

再加上模型复杂度的表示,可以得到最终loss:

这里我们简单说一下模型复杂度的组成,第一项 γT其实是控制的树的叶子节点不要太多(可以理解为参数不要太多,L1正则化),第二项其实是控制每个叶子结点的数值不要太大(可以理解为模型参数不要太大,L2正则化)。

上面几步看不明白的可以去 https://zhuanlan.zhihu.com/p/87885678 看一步一步的推导过程。

可以看到,模型的优化目标其实仅与前一棵树一阶导(G)、二阶导(H)、lambda(可以理解为L2正则化系数)、γ(理解为L1正则化系数)有关系。对于决策树的每次分裂,我们的目标其实就是要使得上面的目标函数值更小, 换句话说,上面的目标函数就是我们的分裂标准,这与前面所有的决策树的分裂方式都是完全不同的。

看看下面的图可能更好理解:

在分裂选择特征时,仅使用非缺失值来进行计算增益。而对于缺失结点的划分,则是将每个缺失样本分别放入到两个子节点中,哪个增益大就选择划分到哪个结点。

略。。。

优点:

更快,占用内存更小的GBM。

优化的点如下:

树模型解释性较好,我们常常可以通过树模型来进行特征选择,留下重要特征。不同树模型特征重要性评估方法略有区别。

决策树 、 随机森林 和 GBDT 的特征重要性评估方法相同都是根据不纯度减小(也即gini系数)来进行度量:

xgboost 的特征重要性评估方法更为多样,如下:

lightGBM 的特征评估方式如下:

参考:
《统计学习方法》李航
【机器学习】决策树(下)——XGBoost、LightGBM(非常详细)
树模型(六):XGBoost (带手动建树实例,非常推荐)

从决策树到随机森林

这里仅介绍分类决策树

 

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

 

对于分类决策树,他们可以认为是一组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_2\\frac{|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|描述了模型的复杂度,参数$a\\geq 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

 

                                                                                                         

以上是关于白话梳理树模型——从决策树到lightGBM的主要内容,如果未能解决你的问题,请参考以下文章

从提升树到 XGBoost, 原理简介

决策树到集成学习

用cart(分类回归树)作为弱分类器实现adaboost

r中的chaid回归树到表的转换

决策树可视化,被惊艳到了!

LightGBM的并行优化