GBDT、XGBoost、LightGBM的区别和联系

文章目录

1. Boosting算法

首先这三种算法都属于Boosting方法

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

2. GBDT算法

GBDT的优点和局限性

优点:
1)预测阶段的计算速度快,树与树之间可并行化计算。
2)在分布稠密的数据集上,泛化能力和表达能力都很好。
3)采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理如归一化等。

局限性:
1)GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
2)GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显。
3)训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。

3. XGBoost算法

XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进

GBDT和XGBoost对比:

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

4. LightGBM算法

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

4.1 LightGBM的并行方案

4.1.1 特征并行

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

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

4.1.2 数据并行

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

算法步骤如下:

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

4.1.3 基于投票的并行方案

基于投票机制的并行算法如下:

1)在每个worker中选出top k个分裂特征,
2)将每个worker选出的k个特征进行汇总,并选出全局分裂特征,进行数据分裂。

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

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

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

具体情况可以看这篇文章:https://blog.csdn.net/u014411730/article/details/78816859

4.3 排他性特征捆绑(EFB)

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

具体情况可以看这篇文章:https://blog.csdn.net/u014411730/article/details/78816859

LightGBM和XGBoost对比

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

EvermemoGBDT、XGBoost、LightGBM的区别和联系
机器学习算法中 GBDT 和 XGBOOST 的区别有哪些?wepon的回答

上一篇:【数据分析与挖掘】基于LightGBM,XGBoost,逻辑回归的分类预测实战:英雄联盟数据(有数据集和代码)


下一篇:HHKB Programming Contest 2020 补题记录(D题投影,E题预处理节省时间)