决策树与随机森林

一. 决策树

决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。

  • 根节点:包含样本的全集
  • 内部节点:对应特征属性测试
  • 叶节点:代表决策的结果

比较常用的决策树有ID3,C4.5和CART(Classification And Regression Tree),CART的分类效果一般优于其他决策树。

preview

1. ID3(信息增益)

信息熵:度量样本集合纯度常用的一种指标。信息熵的值越小,纯度越高。

信息增益:信息增益越大,则使用属性a来进行划分所获得的“纯度提升”越大。

(属性a对样本集D进行划分所获得的信息增益)

2. C4.5 (增益率) 

信息增益准则对可取值数目较多的属性有所偏好。(例如某个属性的每个分支仅包含一个样本,这些分支结点的纯度已达最大。)——————> 所以使用增益率来选择最优划分属性。

 IV(a) 被称为属性a的固有值。

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

3. CART(基尼指数)

Gini指数反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini指数越小,则数据集D的纯度越高。

所以选择使得划分后基尼指数最小的属性作为最优划分属性。 

 4. 剪枝处理

剪枝是决策树学习算法对付“过拟合”的主要手段。

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

后剪枝:先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

二. 随机森林

随机森林属于 集成学习 中的 Bagging. 随机森林是由很多决策树构成的,不同决策树之间没有关联。

当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。

构造随机森林的步骤:

 三. 集成学习

Boosting:个体学习器间存在强依赖关系,必须串行生成的序列化方法。

        先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续收到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。

代表:AdaBoost:基学习器的线性组合来最小化指数损失函数,增加错误率高的基学习器的权重。

Boosting主要关注降低偏差。因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

Bagging和随机森林:个体学习器间不存在强依赖关系,可同时生成的并行化方法。

欲得到泛化性能强的集成,设法使基学习器尽可能具有较大的差异;对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。由于训练数据不同,我们获得的基学习器可望具有比较大的差异。为了增强个体学习器效果,可以用相互有交叠的采样子集

随机森林

RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。

在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分

随机森林简单、容易实现、计算开销小。

随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动。这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

随机森林的训练效率常优于Bagging。

四. GBDT (Gradient Boosting Decision Tree)梯度提升决策树

随机森林内各个树之间是没有关联的。

提升树其实就是针对这一点做的提升:每棵树都是以前一棵树的残差为学习目标去拟合,模型最终的输出是将所有树的结果相加。

GBDT的树全都是回归树的原因——因为分类树的结果不能使用加法模型,也就是无法提升。

BDT的本质: 森林中的每棵树是有序的,第二颗树学习的目标是上一课树的残差,整个算法的输出是每棵树结果的和。

GBDT算法基树采用CART回归树,树节点的划分指标是平方损失函数,叶子节点的值是落在该叶子节点所有样本的目标均值。树与树之间的Boosting逻辑是:新树拟合的目标是上一课树的损失函数的负梯度的值。GBDT最终的输出结果是将样本在所有树上的叶子值相加。

GBDT最核心的两部分,Boosting提升说明每棵树之间是有关系有序的、Gradient梯度指明了提升的方向与大小。

GBDT的正则化:Early Stopping | Subsampling无放回抽样 

Dropout:每棵树拟合的不是之前全部树ensemble后的残差,而是随机挑选一些树的残差,这个效果如何有待商榷。

五. XGBoost

XGBoost仍然是Gradient Boosting算法, 所采用的树都是回归树.

XGBoost的建树过程、boosting过程均是以目标函数为基础进行的,一切操作的衡量标准均是最小化目标函数,其采用的算法策略依然是贪心策略。

由于引入了泰勒二阶展开,建树与boosting的过程仅依赖于损失函数的一阶导数与二阶导数,公式比较清晰易懂。整个推导使用二阶泰勒展开的一个最大好处是:支持自定义损失函数,仅要求损失函数二阶可导。 

XGBoost基学习器不仅支持决策树,也支持线性分类器。也就是说,xgboost不仅是一种集成的树模型,也是一种集成的线性模型,也就是带L1和L2的逻辑斯底回归或逻辑回归。所以严格来说xgboost已经不仅仅是GBDT,而是GBM(Gradient Boosting Machine),所以说xgboost这个名字起的非常严谨。

参考链接:从决策树到XGBoost - 知乎

回归树

Regression Tree 回归树 - 知乎https://zhuanlan.zhihu.com/p/82054400

preview

分类回归树(classification and regression tree, CART)模型由Breiman等人在1984年提出,是应用广泛的决策树学习方法。CART同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。

preview

**************************************************************************************************************

GBDT、XGBoost、LightGBM的区别和联系 - 简书**************************************************************************************************************

Boosting算法: GBDT是机器学习算法,XGBoost和LightGBM是GBDT的算法实现。

Boosting方法训练基分类器时采用串行的方式,各个基分类器之间
有依赖。其基本思想是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。这个过程是在不断地减小损失函数,使得模型偏差不断降低。但Boosting的过程并不会显著降低方差。这是因为Boosting的训练过程使得各弱分类器之间是强相关的,缺乏独立性,所以并不会对降低方差有作用。

GBDT算法: 在每一轮迭代中,首先计算出当前模型在所有样本上的负梯度,然后以该值为目标训练一个新的弱分类器进行拟合并计算出该弱分类器的权重,最终实现对模型的更新。

XGBoost:原始的GBDT算法基于经验损失函数的负梯度来构造新的决策树,只是在决策树构建完成后再进行剪枝。而XGBoost在决策树构建阶段就加入了正则项,即

XGBoost采用最大化分裂前后损失函数的差值作为准则来进行决策树的构建,通过遍历所有特征的所有取值,寻找使得损失函数前后相差最大时对应的分裂方式。此外,由于损失函数前后存在差值一定为正的限制,此时γ 起到了一定的预剪枝效果。

XGBoost的并行方案:

1)XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
2)可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。先通过直方图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。

GBDT和XGBoost对比:

1)GBDT是机器学习算法,XGBoost是该算法的工程实现。
2)在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
3)GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
4)传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
5)传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
6)传统的GBDT没有设计对缺失值进行处理,XGBoost可以自动学习出它的分裂方向。XGBoost对于确实值能预先学习一个默认的分裂方向。
7)Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)

LightGBM

LightGBM是XGBoost的改进版,相比于前者,它添加了很多新的方法来改进模型,包括:并行方案、基于梯度的单边检测、排他性特征捆绑等。

LightGBM的并行方案

LightGBM的特征并行方案

LightGBM并没有垂直的切分数据集,而是每个worker都有全量的训练数据,因此最优的特征分裂结果不需要传输到其他worker中,只需要将最优特征以及分裂点告诉其他worker,worker随后本地自己进行处理。处理过程如下:

1)每个worker在基于局部的特征集合找到最优分裂特征。
2)workder间传输最优分裂信息,并得到全局最优分裂信息。
3)每个worker基于全局最优分裂信息,在本地进行数据分裂,生成决策树。

LightGBM的数据并行方案

当数据量很大时,特征并行算法还是受限于特征分裂效率。因此,当数据量大时,推荐使用数据并行算法。
算法步骤如下:

1)LightGBM算法使用Reduce Scatter并行算子归并来自不同worker的不同特征子集的直方图,然后在局部归并的直方图中找到最优局部分裂信息,最终同步找到最优的分裂信息。
2)除此之外,LightGBM使用直方图减法加快训练速度。我们只需要对其中一个子节点进行数据传输,另一个子节点可以通过histogram subtraction得到。
3)LightGBM可以将传输代价降低为O(0.5 * #feature * #bin)。

 基于投票的并行方案

基于投票机制的并行算法如下:
1)在每个worker中选出top k个分裂特征,
2)将每个worker选出的k个特征进行汇总,并选出全局分裂特征,进行数据分裂。

有理论证明,这种voting parallel以很大的概率选出实际最优的特征,因此不用担心top k的问题。

基于梯度的单边检测(GOSS)

在AdaBoost中,采样权重作为数据实例重要性的衡量指标。然而在GBDT中,没有内含的样本权重,于是基于采样方法的权重不能应用于GBDT中。幸运的是,如果实例梯度值小,这个实例的误差就小,说明这个实例已经训练的很好了,直接的想法就是抛弃拥有小梯度的实例数据,这样一来数据的分布就会发生改变,会损失学到的模型的精确度。为了避免这个问题,我们提出了一种叫做GOSS的方法。GOSS保持有较大梯度的实例,在小梯度数据上运行随机采样。为了弥补这样做造成的数据分布的影响,当我们计算信息增益的时候,对于小梯度的数据GOSS引入了常量乘法器。特别的是,GOSS首先根据梯度绝对值排序,再选出a * 100%大梯度实例数据。之后在余下的数据随机采样b * 100%。经过这个过程,当计算信息增益时,GOSS使用小梯度放大了采样数据1-a/b。这样做的好处在于,我们放更多的注意力在训练实例上,而没有改变原始数据的分布。

排他性特征捆绑(EFB) 

在实际应用中,高维度特征具有稀疏性,这样可以设计一个减少有效特征数量的无损的方法,特别是在稀疏特征中,许多特征是互斥的,出现大量0,例如one-hot。我们可以捆绑互斥的特征。最后我们还原捆绑互斥问题为图着色问题,使用贪心算法近似求解。

LightGBM和XGBoost对比

1)XGBoost使用基于预排序的决策树算法,每遍历一个特征就需要计算一次特征的增益,时间复杂度为O(datafeature)。
而LightGBM使用基于直方图的决策树算法,直方图的优化算法只需要计算K次,时间复杂度为O(K
feature)
2)XGBoost使用按层生长(level-wise)的决策树生长策略,LightGBM则采用带有深度限制的按叶子节点(leaf-wise)算法。在分裂次数相同的情况下,leaf-wise可以降低更多的误差,得到更好的精度。leaf-wise的缺点在于会产生较深的决策树,产生过拟合。
3)支持类别特征,不需要进行独热编码处理
4)优化了特征并行和数据并行算法,除此之外还添加了投票并行方案
5)采用基于梯度的单边采样来保持数据分布,减少模型因数据分布发生变化而造成的模型精度下降
6)特征捆绑转化为图着色问题,减少特征数量


 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值