GBDT、xgboost、LightGBM之间的比较

一:为什么会有XGBOOST和LightGBM

首先,我们需要知道,这两种算法都是gbdt的具体实现算法,gbdt作者在前面的文章中已经解释的很清楚了,读者可以先去做一个了解。那有了gbdt为什么不直接用,而是要衍生出这两种模型呢,其实主要是因为gbdt在每一次迭代的时候都会遍历整个训练数据多次,一旦数据量过大,如果把所有数据内存,可能会限制训练数据的大小,如果不进内存,反复的读写训练数据又会非常耗时,尤其是面对工业级海量的数据,普通gbdt基本上没办法用。所以就有了lightGBM和xgboost.

二:XGBoost

概述:
讲道理,xgboost和gbdt的的算法步骤基本相似,都是首先初始化一个常数,gbdt根据一阶倒, xgboost根据一阶倒数和二阶导数,迭代生成基学习器,相加更新学习器。
泰勒公式是一个用函数在某点的信息描述其附近取值的公式。基本形式是:
在这里插入图片描述
一阶泰勒展开:
在这里插入图片描述
二阶泰勒展开:
在这里插入图片描述
XGBoost 的损失函数不仅使用到了一阶导数,还使用二阶导数。
在这里插入图片描述
对上述损失函数做二阶泰勒展开,其中 g 为 一阶导数,h 为二阶导数,最后一项为正则项,
在这里插入图片描述
xgboost对分类前后的信息增益计算采用了如下计算(id3采用了信息增益,c4.5采用信息增益比,cart采用基尼系数)
在这里插入图片描述
这个公式形式上和id3和c4.5算法是一致的,都是通过分裂后的某种值减去分裂前的某种值,从而得到信息增益。为了限制树的增长,我们可以设置阈值,当增益大于阈值的时候才让节点分裂,上式中的gama即阈值,所以xgnboost 在优化目标函数的同时,做了减枝。另外,上式中还有一个系数lambda,这个是一个L2范数,对叶子节点做平滑,同时也起到了防止过拟合的作用。

三:xgboost对gbdt做的提升

第一:gbdt对目标函数展开到了一阶,xgboost对目标函数做了二阶求导。
这样做的目的有两个,第一是为了统一损失函数的形式以支持自定义损失函数,第二是因为二阶信息本身就能够让梯度收敛得更快更准确。
第二:gbdt是为了给新的基学习器寻找新的拟合目标(损失函数负梯度在当前模型的值),而xgboost是用对目标函数求二阶导来学习新的基学习器。
第三:xgboost加入了叶子节点的L2正则化和剪枝,因而有利于模型获得更低的方差。
第四,xgboost增加了自动处理缺失值特征的策略。通过把带缺失值样本分别划分到左子树或者右子树,比较两种方案下目标函数的优劣,从而自动对有缺失值的样本进行划分,无需对缺失特征进行填充预处理。

第五:XGBoost采用了Shrinkage 和Column Subsampling方法,这两种方法都能在一定程度上防止过拟合。

Shrinkage方法就是每次迭代中对树的每个叶子节点的分数乘上一个缩减权重n,可以使得每个树的影响力不会太大,留下更多的空间给后面的树去优化。
Column Subsampling,一种按层随机采样,在在对同一层内每个节点分裂之前,先随机选择一部分特征,然后遍历这部分特征来寻找最优切分点。(近似算法,分桶也能降低过拟合风险)
第六:同级的节点可以并行化训练

四:XGBoost的优缺点:

优点:

1)使用了许多策略去防止过拟合,如:正则化项、Shrinkage、Column Subsampling等。

2)目标函数使用了损失函数关于待求函数的二阶导数

3)支持并行化同级层节点可并行化,具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行,加快训练速度。

4)添加了对稀疏数据的处理

5)采用了交叉验证以及early stop,防止建树过深

6)支持设置样本权重,可以通过调整权重可以更加关注一些样本。

缺点:
1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时
2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;

五:LightGBM

概述
LightGBM 是微软开发的一款快速、分布式、高性能的基于决策树的梯度 Boosting 框架。主要有以下优势:
更快的训练效率
低内存使用
更好的准确率(我对比 XGBoost 没太大差别)
支持并行学习
可处理大规模数据
1,基于 Histogram 的决策树算法

把连续的浮点特征值离散化成 k 个整数,同时构造一个宽度为 k 的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
当然, histogram 算法也有缺点,它不能找到很精确的分割点,训练误差没有 pre-sorted 好。但从实验结果来看, histogram 算法在测试集的误差和 pre-sorted 算法差异并不是很大,甚至有时候效果更好。实际上可能决策树对于分割点的精确程度并不太敏感,而且较“粗”的分割点也自带正则化的效果。

,2,直方图做差加速,一个叶子的直方图可以由它的父亲节点的直方图与它兄弟节点的直方图做差得到,提升一倍速度。
3,带深度限制的 Leaf-wise 的叶子生长策略,
Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上 Level-wise 是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度。Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
直接支持类别特征(Categorical Feature)
,4,LightGBM 优化了对类别特征的支持,可以直接输入类别特征,不需要额外的 0/1 展开,并在决策树算法上增加了类别特征的决策规则。

5,基于直方图的稀疏特征优化

对于稀疏特征,只需要 O(2 * #non_zero_data) 来构建直方图。

,6,多线程优化

在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信。在数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行(Parallel Voting)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
LIghtGBM的优缺点:

优点:

1)速度较快,是XGBoost速度的16倍,内存占用率为XGBoost的1/6

2)采用了直方图算法,将连续的浮点型特征值离散化成K个整数

3)使用带有深度限制的leaf-wise的叶子生长策略。

缺点:

1)可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合

2)基于偏差的算法,会对噪点较为敏感

3)在寻找最优解时,依据的最优切分变量,没有将最优解是全部特征的综合这一理念来考虑

六:LightGBM和XGBoost对比

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值