LightGBM
(Light Gradient Boosting Machine)是一款基于决策树算法的分布式梯度提升框架。为了满足工业界缩短模型计算时间的需求,LightGBM的设计思路主要是两点:
减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据;
减小通信的代价,提升多机并行时的效率,实现在计算上的线性加速。
由此可见,LightGBM的设计初衷就是提供一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。
LightGBM是微软旗下的Distributed Machine Learning Toolkit (DMKT)的一个项目,由2014年首届阿里巴巴大数据竞赛获胜者之一柯国霖主持开发。虽然其开源时间才仅仅2个月,但是其快速高效的特点已经在数据科学竞赛中崭露头角。Allstate Claims Severity竞赛中的冠军解决方案里就使用了LightGBM,并对其大嘉赞赏。
特性
优化速度与内存使用。
稀疏优化。
优化准确率。使用leaf-wise生长方式,可以处理分类变量。
优化网络通讯。
支持三种模式并行。
(1)特征并行:
a. Workers find local best split point {feature, threshold} on the local feature set.
b. Communicate local best splits with each other and get the best one.
c. Perform the best split.
(2)数据并行:
a. Instead of “Merge global histograms from all local histograms”, LightGBM use “Reduce Scatter” to merge histograms of different (non-overlapping) features for different workers. Then workers find the local best split on local merged histograms and sync up the global best split.
b. As aforementioned, LightGBM uses histogram subtraction to speed up training. Based on this, we can communicate histograms only for one leaf, and get its neighbor’s histograms by subtraction as well.
(3)投票并行:
Voting parallel further reduces the communication cost in data-parallel to constant cost. It uses two-stage voting to reduce the communication cost of feature histograms.
常见问题
LightGBM和XGBoost有什么区别?他们的loss一样么? 算法层面有什么区别?
答:LightGBM:基于Histogram的决策树算法;Leaf-wise的叶子生长策略;Cache命中率优化;直接支持类别特征(categorical Feature);XGBoost:预排序;Level-wise的层级生长策略;特征对梯度的访问是一种随机访问。
LightGBM有哪些实现,各有什么区别?
答:gbdt:梯度提升决策树,串行速度慢,容易过拟合;rf:随机森林,并行速度快;dart:训练较慢;goss:容易过拟合。
LigthGBM是boosting集合模型中的新进成员,由微软提供,它和XGBoost一样是对GBDT的高效实现,原理上它和GBDT及XGBoost类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。
LightGBM树的生长方式是垂直方向的,其他的算法都是水平方向的,也就是说Light GBM生长的是树的叶子,其他的算法生长的是树的层次。
LightGBM选择具有最大误差的树叶进行生长,当生长同样的树叶,生长叶子的算法可以比基于层的算法减少更多的loss。
不建议在小数据集上使用LightGBM。LightGBM对过拟合很敏感,对于小数据集非常容易过拟合。对于多小属于小数据集,并没有什么阈值,但是从我的经验,我建议对于10000+以上的数据的时候,再使用LightGBM。
LightGBM在很多方面会比XGBoost表现的更为优秀。它有以下优势:
更快的训练效率
低内存使用
更高的准确率
支持并行化学习
可处理大规模数据
支持直接使用category特征
从下图实验数据可以看出, LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,并且准确率也有提升。
至于LGB为什么比XGB的精度高这一点,我的理解是选择梯度大(残差大)样本来进行特征分裂生成的树,借鉴了Adaboost的更改样本权重的思想。每棵树针对某些特定训练样本有着较好的划分能力,导致每棵树之间的异质性较大,对于效果近似但异质性大的模型加权往往会带来更大的提升。

通俗解释:LGB的优化方法是,在保留大梯度样本的同时,随机地保留一些小梯度样本,同时放大了小梯度样本带来的信息增益。
这样说起来比较抽象,我们过一遍流程: 首先把样本按照梯度排序,选出梯度最大的a%个样本,然后在剩下小梯度数据中随机选取b%个样本,在计算信息增益的时候,将选出来b%个小梯度样本的信息增益扩大 1 - a / b 倍。这样就会避免对于数据分布的改变。
这给我的感觉就是一个公寓里本来住了十个人,感觉太挤了,赶走了六个人,但剩下的四个人要分摊他们六个人的房租。
举个例子,对于一列特征[1,nan,1,nan,1]和一列特征[nan,1,nan,1,nan],他们正好可以合并成一列特征[1,2,1,2,1]。LGB的目标就是在于找到这样的特征并且将他们合并在一起。
如果把特征抽象成图中的点,特征之间的冲突看作是图中的边,那么问题就转换为找出图中的社团并使图中的社团数量最少。LGB里提出了一个贪心的策略,按照有权度来为图中所有的点排序,然后把特征合并到度小于某个阈值的社团中或单独创建一个社团。
对于特征如何合并,一个重要的原则就是使合并的两个特征可以被顺利区分出来,LGB采取了一个更改阈值的方法。例如对于特征x∈(0, 10), 特征y∈(0, 20),就可以把特征y转换为y∈(10,30),然后再去合并x与y。
看完这些惊人的实验结果以后,对下面两个问题产生了疑惑:XGBoost已经十分完美了,为什么还要追求速度更快、内存使用更小的模型?对GBDT算法进行改进和提升的技术细节是什么?
提出LightGBM的动机
常用的机器学习算法,例如神经网络等算法,都可以以mini-batch的方式训练,训练数据的大小不会受到内存限制。而GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。
LightGBM提出的主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。
XGBoost的优缺点
精确贪心算法
每轮迭代时,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。
优点:
可以找到精确的划分条件
缺点:
计算量巨大
内存占用巨大
易产生过拟合
Level-wise迭代方式
预排序方法(pre-sorted):首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点,在这里XGBoost采用了特征粒度的并行化),这里需要消耗训练数据两倍的内存。其次时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。
优点:
可以使用多线程
可以加速精确贪心算法
缺点:
效率低下,可能产生不必要的叶结点
对cache优化不友好
在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
LightGBM在哪些地方进行了优化?
概括来说,lightGBM主要有以下特点:
基于Histogram的决策树算法
带深度限制的Leaf-wise的叶子生长策略
直方图做差加速
直接支持类别特征(Categorical Feature)
Cache命中率优化
基于直方图的稀疏特征优化
多线程优化

XGBoost使用的是pre-sorted算法,能够更精确的找到数据分隔点。
首先,对所有特征按数值进行预排序。
其次,在每次的样本分割时,用O(# data)的代价找到每个特征的最优分割点。
最后,找到最后的特征以及分割点,将数据分裂成左右两个子节点。
这种pre-sorting算法能够准确找到分裂点,但是在空间和时间上有很大的开销。
由于需要对特征进行预排序并且需要保存排序后的索引值(为了后续快速的计算分裂点),因此内存需要训练数据的两倍。
在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。
LightGBM使用的是histogram算法,占用的内存更低,数据分隔的复杂度更低。其思想是将连续的浮点特征离散成k个离散值,并构造宽度为k的Histogram。然后遍历训练数据,统计每个离散值在直方图中的累计统计量。在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。

使用直方图算法有很多优点。首先最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。

本文深入解析LightGBM,一款基于决策树算法的分布式梯度提升框架,重点介绍其设计初衷、核心特性和优化策略,包括速度与内存优化、稀疏优化、准确率提升、网络通讯优化、并行化学习支持等。同时,对比LightGBM与XGBoost的区别,探讨LightGBM在大规模数据处理中的优势。
最低0.47元/天 解锁文章
6628





