机器学习八之Xgboost和LightGBM

目录

Xgboost   

        ①改进残差函数

        ②采用预排序

        ③Shrinkage(缩减)【相当于学习速率】

        ④列抽样

GBDT和xgboost的区别:

lightGBM 与 XGBoost的区别

       1、切分算法(切分点的选取)

        2、决策树生长策略上:

        3、histogram 做差加速:


Xgboost   

       属于Boosting的集大成者, 对函数残差近似值进行梯度下降, 用CART回归树做学习器,迭代时利用了二阶梯度信息, 集成模型可分类也可回归. 由于它可在特征粒度上并行计算, 结构风险和工程实现都做了很多优化, 泛化, 性能和扩展性都比GBDT要好。

       ①改进残差函数

        不用Gini作为残差,用二阶泰勒展开+树的复杂度(正则项)

                                            

         第t次的loss:

                                         

         对上式做二阶泰勒展开:g为一阶导数,h为二阶导数

                       

          带来如下好处:1.可以控制树的复杂度;2.带有关于梯度的更多信息,获得了二阶导数;3.可以用线性分类器;

         ②采用预排序

         因为每一次迭代中,都要生成一个决策树,而这个决策树是残差的决策树,所以传统的不能并行,但是每次建立决策树,在分裂节点的时候,比如选中A特征,就要对A进行排序,再计算残差,这个花很多时间,因此,我们可以每一次残差计算好之后,全部维度预先排序,并且此排序是可以并行的,并行排序好后,对每一个维度,计算一次最佳分裂点,求出对应的残差增益。于是只要不断选择最好的残差作为分裂点就可以。也就是说,虽然森林的建立是串行的没有变,但是每一颗树枝的建立就变成是并行的了,带来的好处:

         1.分裂点的计算可并行了,不需要等到一个特征的算完再下一个了

         2.每层可以并行:

            当分裂点的计算可以并行,对每一层,比如分裂了左儿子和右儿子,那么这两个儿子上分裂哪个特征及其增益也计算好了

        ③Shrinkage(缩减)【相当于学习速率】

         XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率)

        ④列抽样

        XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过拟合,还能减少计算。

 

GBDT和xgboost的区别:

       1)、gbdt在函数空间通过梯度下降法进行优化,xgboost在函数空间通过牛顿法进行优化;

       2)、相比原始的GBDT,XGBoost的目标函数多了正则项,使得学习出来的模型更加不容易过拟合;

      3)、传统gbdt以CART作为基分类器,xgboost还支持线性分类器;

      4)、xgboost支持自定义损失函数,只要损失函数一阶、二阶可导;

      5)、xgboost支持列抽样,降低过拟合,减少计算;

      6)、xgboost支持并行,xgboost的并行是在特征粒度上的。

 

lightGBM 与 XGBoost的区别

       1、切分算法(切分点的选取)

        XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;但这种做法有以下缺点:

         1)空间消耗大,需要保存数据的特征值以及特征排序的结果(比如排序后的索引,为了后续快速计算分割点),需要消耗两倍于训练数据的内存

        2)时间上也有较大开销,遍历每个分割点时都需要进行分裂增益的计算,消耗代价大

        3)对cache( 快速缓冲贮存区)优化不友好,在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

 LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点:

        1)占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。

        2)降低了计算的代价:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。(相当于LightGBM牺牲了一部分切分的精确性来提高切分的效率,实际应用中效果还不错)

         2、决策树生长策略上:

        XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)

        LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此 LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

        3、histogram 做差加速:

        一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

XGBoostLightGBM都是高效的分布式梯度提升框架,它们在机器学习领域特别是结构化数据的分类和回归任务中表现出色。两者都有各自的优势,因此在一些场景中可能考虑将它们结合使用以期获得更好的性能。 XGBoost,即“eXtreme Gradient Boosting”,是由陈天奇等人开发的,它是一个优化的分布式梯度提升库。XGBoost的主要特点包括支持正则化的提升(即在目标函数中加入了正则项),有效的处理稀疏数据,以及内置的交叉验证功能。它还支持多种类型的提升树算法,包括线性分类器。 LightGBM是由微软开发的,它的设计目标是为了在大规模数据集上提供更快的训练速度和更高的效率,同时保持良好的准确率。LightGBM使用基于直方图的算法,减少了内存的使用,并且在某些情况下可以减少计算时间。它还提供了更好的扩展性和更快的训练速度。 结合XGBoostLightGBM可以通过以下几种方式实现: 1. 集成学习:可以通过训练两种模型然后将它们的预测结果进行集成的方法来结合它们。例如,可以采用简单的平均法、加权平均法或者更复杂的集成方法如stacking等。 2. 逐阶段训练:先使用一种模型进行训练和预测,然后将预测结果作为新特征加入到数据集中,再用另一种模型进行训练。这种方式可以将两种模型的预测优势结合起来。 3. 端到端训练:将XGBoostLightGBM的结构整合到一个模型中,通过设计新的损失函数和梯度计算方法,使得整个模型可以在一个训练过程中同时利用两者的优势。 然而,需要注意的是,虽然将XGBoostLightGBM结合起来可能提高性能,但同时也增加了模型的复杂度和计算资源的消耗。此外,过拟合的风险也可能增加。因此,在实际应用中,结合两种模型时需要仔细的调参和交叉验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值