个人学习笔记(十八)LightGBM与XGBoost的区别

       在LightGBM与XGBoost的相关资料里,我发现很少有博客能把它们的重要区别完整罗列出来,要么只介绍了GOSS、EFB,要么只涉及到leaf-wise。所以在这里我把这些资料整合起来,尽量用简短的话语把LightGBM与XGBoost的重要区别叙述出来,内容包含了我自己的理解,不一定正确。

一、GOSS与EFB

       传统的XGBoost算法在特征维度较高和数据量巨大的时候,仍然存在效率和可扩展性的问题。这是因为在基模型分裂时,目标函数的表达式是这样的
O b j = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ ∣ T ∣ Obj=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma|T| Obj=21j=1THj+λGj2+γT       上面的式子中, G j G_j Gj H j H_j Hj代表叶子节点的一阶、二阶梯度和,所以可以看到,对每一个特征的每一个切分点,都要计算一遍上面的目标函数,而每一次计算都要遍历所有数据(包括样本、特征),这个过程非常耗时。LightGBM利用GOSS(基于梯度的单边采样)和EFB(互斥特征捆绑)改进了这一过程。
       在AdaBoost中,样本权重代表了样本的重要程度,被分类错误的样本的权重较高。LightGBM参考了这一想法,用样本梯度来衡量样本的重要程度。为什么样本梯度能衡量样本有多重要呢?逻辑是这样的,如果一个样本的梯度比较小,一般意味着它的训练误差小(GBDT用负梯度代替残差就是这一原理),已经被学习的很好了,因此可以直接丢弃掉。
       GOSS是这么做的,首先根据样本的梯度将样本排序,保留TOP a % a\% a%个样本作为子集 A A A,再在剩下的 ( 1 − a ) % (1-a)\% (1a)%的样本里随机选取 b % b\% b%的样本作为子集 B B B,为了抵消对数据分布的影响,将子集 B B B内的样本权重乘以一个 1 − a b \frac{1-a}{b} b1a,将 A A A B B B合并作为新的样本集进行下一个基模型的训练。
       上述GOSS通过样本采样,一定程度上减小了运算次数,接下来的EFB通过特征捆绑,进一步提高了模型运算速度。
       EFB将多个稀疏特征特征捆绑成一个bundles,它是这么做的。EFB首先构造一个图,图上的节点代表各个特征,节点之间有边,边上的权重代表特征之间的冲突,通过特征在图中的度来降序排序特征,依次检查每个特征将它分配给具有小冲突的现有bundles(只分配具有小冲突的特征)。这个算法的时间复杂度是 O ( n 2 ) O(n^2) O(n2),当特征数量 n n n很大时,LightGBM会采用一种更高效的无图排序,直接根据每个特征的非零个数进行排序,这里认为每个特征的非零个数越多,它与其他特征的冲突也越多。
       好了,现在如果找到了两个可以合并的特征,EFB如何将它们合并呢?我们知道,LightGBM是通过直方图将连续特征离散化的,如果特征A的取值范围是[0, 10),特征B的取值范围是[0, 20),可以给特征B一个10的偏移量,让它的取值范围变成[10, 30),这样将特征A、B分别离散化后合并,它们就会分布在不同的bins中。

二、Leaf-wise

       这一点就是LightGBM与XGBoost的区别中老生常谈的话题了,与XGBoost的level-wise不同,LightGBM采用了leaf-wise的分裂方式,看下面的两幅图就清楚了。
在这里插入图片描述
在这里插入图片描述
       相比之下,leaf-wise更为高效,只需要少量的分裂就能很大程度的降低损失函数。但同时,也需要控制深度防止过拟合。

三、处理类别特征

       对于类别特征,一般需要转化成多维的one-hot编码特征,这种做法降低了空间和时间的效率。还有很重要的一点是,决策树在使用one-hot编码分裂时,只能做到one vs many,但LightGBM使用了many vs many的切分方式。举个栗子,如果一个特征有A、B、C、D四个分类,XGBoost只能做到将A放一类,B、C、D放一类,而LightGBM能做到A、B一类,C、D一类。
       LightGBM是这么做的,它根据训练目标的相关性对类别进行重排序,更具体的说,类别特征可以认为是已经离散化成bins的特征,而LightGBM根据 ∑ g ∑ h \frac{\sum g}{\sum h} hg将各个bins重新排序,再选取最优切分点。

四、并行

       LightGBM在并行方面也对XGBoost做了改进,包括特征并行与数据并行两方面。
       特征并行的传统做法是,对数据列采样,即不同的机器上保留不同的特征子集,各个机器上的worker根据所分配的特征子集寻找到局部的最优切分点(特征、阈值),互相通信来从局部最佳切分点里得到最佳切分点,拥有最佳切分点的worker执行切分操作,然后将切分结果传送给其他的worker,其他的worker根据接收到的数据来进行下一次的切分数据。
       LightGBM对此做出的改进是,让每个机器保留整个完整的数据集(并不是经过列采样的数据),这样就不必在切分后传输切分结果数据,因为每个机器已经持有完整的数据集,这是典型的空间换时间。
       在数据并行方面,传统的做法是,行采样对数据进行横向切分,worker使用分配到的局部数据构建局部的直方图,合并局部直方图得到全局的直方图,对全局直方图寻找最优切分点,然后进行切分。
       不同于合并所有的局部直方图获得全局的直方图,LightGBM通过Reduce Scatter方法来合并不同worker的无交叉的不同特征的直方图,这样找到该直方图的局部最优切分点,最后同步到全局最优切分点。

参考:
(1)LightGBM: A Highly Efficient Gradient Boosting Decision Tree 论文
(2)『 论文阅读』LightGBM原理
(3)XGBoost、LightGBM的详细对比介绍
(4)Lightgbm基本原理介绍
(5)LightGBM介绍及参数调优

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值