文章目录

LightGBM是轻量级(Light)的梯度提升机器(GBM),是GBDT模型的另一个进化版本。它延续了 XGBoost 的那一套集成学习的方式,相对于xgboost, 具有训练速度快和内存占用率低的特点。
XGBoost不足之处
XGBoost的核心思想: xgboost是属于boosting家族,是GBDT算法的一个工程实现, 在模型的训练过程中是聚焦残差,在目标函数中使用了二阶泰勒展开并加入了正则,在决策树的生成过程中采用了精确贪心的思路,寻找最佳分裂点的时候,使用了预排序算法, 对所有特征都按照特征的数值进行预排序, 然后遍历所有特征上的所有分裂点位,计算按照这些候选分裂点分裂后的全部样本的目标函数增益,找到最大的那个增益对应的特征和候选分裂点位,从而进行分裂。这样一层一层的完成建树过程, xgboost训练的时候,是通过加法的方式进行训练,也就是每一次通过聚焦残差训练一棵树出来, 最后的预测结果是所有树的加和表示。
在这个过程中,不足之处在于:xgboost在进行最优分裂点的选择上是先进行预排序,然后对所有特征的所有分裂点计算这些分裂点分裂后的全部样本的目标函数增益,这个过程的空间复杂度和时间复杂度很大。虽然xgboost的近似分割的算法对分裂点进行了分桶了(这和lightgbm里面的直方图的思路一致),减少了计算量,起到了一定的优化作用,但lightgbm直方图算法进行了更好的优化。所以,基于XGBoost寻找最优切分点的复杂度体现在以下三点:
(1)分裂点的数量
(2)样本的数量
(3)特征数量
LightGBM 正是从这三个角度出发,对XGBoost算法进行优化。分别对应了lgb的三大算法思想。
(1)为了解决分裂点数量过多的问题,LightGBM采用直方图算法。
(2)为了解决样本数量过多的问题, Lightgbm采用单边梯度抽样算法。
(3)为了解决特征数量过多的问题,Lightgbm采用互斥特征捆绑算法
直方图算法
直方图算法说白了就是对特征进行分桶。先把连续的浮点特征值离散化成 k k k 个整数,同时构造一个宽度为 k k k的直方图, 并根据特征所在的bin对其进行梯度累加和个数统计,在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。然后根据直方图的离散值,遍历寻找最优的分割点。
bins的数量是远小于样本不同取值的数量的,所以分桶之后要遍历的分裂点的个数会少了很多,减少了计算量。用图形表示如下:
这个过程其实就是直方图统计,将大规模的数据放在了直方图中。也就是分箱的过程。
特征离散化具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等。对于直方图算法来说有以下两个优点:
(1)占用更少的内存。
XGboost需要用32位的浮点数去存储特征值, 并用32位的整型去存储索引,而Lightgbm的直方图算法一般用8位的整型保存特征离散化后的值,内存消耗可以降低为原来的1/8。
(2)计算代价更小
XGboost预排序算法每遍历一个特征的值就需要计算一次分裂的增益,时间复杂度为:
O ( ( 特 征 值 个 数 − 1 ) ∗ 特 征 数 ) O((特征值个数-1)*特征数) O((特征值个数−1)∗特征数)
Lightgbm直方图算法只需要计算k次(k:每个特征的分箱的个数),时间复杂度为:
O ( ( k − 1 ) ∗ 特 征 数 ) O((k-1)*特征数) O((k−1)∗特