Lightgbm模型和GBDT以及XGboost一样,都是基于决策树的boosting集成模型;
Lightgbm是一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。
关于GBDT和XGboost的介绍可以参考:
大饼:机器学习——提升算法(Adaboost、xgboost、GBDT)zhuanlan.zhihu.comLightgbm主要特点
Histogram Algorithm(直方图)
将连续浮点特征值离散化为k个整数,并构造bins=k的直方图,只管来说,就是将连续值得特征划分为k个离散值(区间),并将每个符合该离散值范围的连续值加入到相应的bin的直方图中,数据的离散化有着存储方便、运算更快、鲁棒性强以及模型稳定的特点(正则化);

- 内存占用小,不需要预排序(XGboost),只保存离散化后的值,内存可以降低至1/8;
- 计算代价小,预排序算法XGboost每遍历一个特征值就需要计算分裂增益,Lightgbm是计算k次的离散值即可,复杂度从O(#data#feature)降低至O(#k#feature),一般data>>k;
- bins替代原始数据,增加了正则化;
- 特征值离散化,意味着许多细节被抛弃,影响数据间的差异性以及模型的精度;
直方图做差加速

叶子直方图可以由其父节点直方图和兄弟节点直方图做差得到,速度可以提升一倍,实际构建树的过程中,可以先计算直方图小的叶子节点,然后利用直方图做差获得直方图大的兄弟节点,降低计算代价。
带深度限制的Leaf-wise算法
无论是决策树、GBDT、Adaboost还是XGBoost,其树的生长方式都是level-wise策略,即每一个节点都分裂成两个子节点,Xgboost因为采用了多线程优化,遍历一次数据可以分裂同一层的节点,但是实际上很多叶子的分裂增益很低,可以不用继续分裂下去,增加计算开销。

leaf-wise生长策略,每次从当前所有叶子中寻找分裂增益最大的叶子进行分裂,leaf-wise可以降低误差提高精度,并且避免很多不必要的计算开销,但是缺点就是容易长出比较深的决策树,产生过拟合,因此会配合最大深度限制,保持高效率的同时,减缓过拟合。
单边梯度采样(Goss)
Goss算法从减少样本的角度出发排除大部分小梯度的样本,仅用剩下的样本计算信息增益,是一种在减少数据量和保证精度上平衡的算法。
AdaBoost中,样本权重是数据重要性的指标。然而在GBDT中没有原始样本权重,不能应用权重采样。幸运的是,我们观察到GBDT中每个数据都有不同的梯度值,对采样十分有用。即梯度小的样本,训练误差也比较小,说明数据已经被模型学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。
- Goss首先将分裂的特征所有取值按照梯度绝对值大小降序排序(不用保存排序结果);
- 选取绝对值最大的
个数据;
- 剩余的
的较小梯度数据中随机选择
个数据,并乘以一个常数
,这样模型会更关注训练不足的样本,而不改变原数据集的分布;
- 最后用
个数据来计算信息增益。
互斥特征捆绑算法(EFB)
高维度的数据往往存在很大的稀疏性,数据通常都是几千万维的稀疏数据,对于不同维度的数据合并一起,可以使得稀疏矩阵变成一个稠密矩阵。
- 将特征按照非零值的个数进行排序;
- 计算不同特征的冲突比率;(两个特征完全互斥时,比率为0)
- 遍历每个特征并尝试合并特征,使冲突比率最小化;
支持类别特征
目前大部分的机器学习工具都无法有效的直接支持类别特征,一般需要将其转化为one-hot格式,Lightgbm优化了对于类别特征的支持,可以直接输入类别特征,不需要额外的0-1展开。
树模型遇到one-hot编码的类别特征时可能会遇到一些问题,比如切分方式只有是/否,很容易造成样本切分不均衡,切分增益小;另外这种不平衡的切分方式会使得一个叶节点只有极少数样本的情况出现,这对于决策树基于统计信息的学习会产生很大的影响。

Lightgbm处理分类特征主要是,在1个k维的类别特征中寻找最优切分。在枚举分割点之前,先把直方图按每个类别的均值进行排序,然后安装均值的结果依次枚举最优分割点。
- 统计该类别特征每种离散值出现次数,排序,为每一个特征值建立bin容器,对于出现次数很少的bin容器可以抛弃掉;
- 如果bin容器数里<4,可以使用One V Other的方法,逐个扫描每个bin,找出最佳分裂点,如果bins较多的话,先进行过滤,只让子集合较大的bin容器参加划分阈值计算,对每个符合条件的bin容器进行公式计算:当前bin容器所有样本一阶梯度之和/该bin容器下所有样本二阶梯度之和+正则项(cat_smooth)

支持高效并行
- 特征并行
不同的机器在不同的特征集合上分别寻找最优的分割点,并在机器中同步最优分割点,这种方式对数据进行垂直划分,每台机器所含数据不同,使用不同的机器找到不同特征最优分割点,划分结果需要通过通信告知每台机器,增加额外复杂度。
Lightgbm是在每台机器上保存全部的训练数据,在得到最佳划分方案后可在本地执行划分而减少不必要的通信。

2. 数据并行
Lightgbm数据并行中使用分散规约把直方图合并的任务分摊到不同的机器,降低通信计算代价,利用直方图做差,减少一半通信量。

3. 投票并行
使用投票并行的方式,只合并部分特征的直方图从而达到降低通信量的目的,得到非常好的加速效果。
- 本地找出Top k特征,并基于投票筛选出可能是最优分割点的特征;
- 合并时只合并每个机器选出来的特征;

cache命中率优化
XGBoost在预排序之后,特征对梯度的访问是一种随机访问,不同的特征访问顺序不一样,无法优化cache,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
Lightgbm:
- 所有特征采用相同的方式获得梯度(XGboost不同特征通过不同索引获得梯度),只需要对梯度进行排序可实现连续访问,提高缓存命中率。
- 不需要存储行索引到叶子索引的数组,降低内存消耗,不存在Cache Miss问题。
和XGBoost的比较
XGBoost的缺点
- 预排序空间消耗大,需保存数据特征值和排序结果(索引),需要训练集两倍的内存;
- cache miss问题;
- 遍历每个分割点都需要进行分裂增益计算,消耗代价大。
Lightgbm的优化
- 基于histogram的决策树算法;
- 单边梯度采样(Goss),减少大量小梯度数据,节省了很多时间和空间消耗;
- 互斥捆绑特征(EFB),降维,减少特征维度;
- 带深度限制的leaf-wise生长策略;
- 支持类别特征;
- 支持高效并行;
- cache命中率优化。
参考博客:
LightGBM算法详解(教你一文掌握LightGBM所有知识点)_GFDGFHSDS的博客-CSDN博客_lightgbm详解blog.csdn.net


参考论文:
LightGBM: A Highly Efficient Gradient Boosting Decision Treepapers.nips.cc