文章目录
XGBoost的优缺点
1. 精确贪心算法
每轮迭代时,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。
优点:可以找到精确的划分条件
缺点:
- 计算量巨大
- 内存占用巨大
- 易产生过拟合
2. Level-wise迭代方式
预排序方法(pre-sorted):首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。其次时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。
优点:
- 可以使用多线程
- 可以加速精确贪心算法
缺点:效率低下,可能产生不必要的叶结点
3. 对cache优化不友好
在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
LightGBM
LightGBM 提出的主要原因是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。为了能让GBDT高效地用上更多的数据,我们将思路转向了分布式GBDT,然后就有了LightGBM。因此它的设计思路主要是两点:
- 单个机器在不牺牲速度的情况下,尽可能多地用上更多的数据;【数据加载在内存中的运行速度是最快的,但数据会受限于内存的大小,而在设计的时候就是需要考虑的这个问题】
- 多机并行的时候,通信的代价尽可能地低,并且在计算上可以做到线性加速。
其具有以下优点:
- 更快的训练速度
- 更低的内存消耗
- 更好的准确率
- 分布式支持,可以快速处理海量数据
1. 基于Histogram的决策树算法
histogram算法占用更低的内存,数据分隔的复杂度更低。它的思想是将连续的浮点特征离散成k个离散值,并构造宽度为k的Histogram,然后遍历训练数据,统计每个离散值在直方图中的累计统计量。在进行特征选择时,只需要根据置换图的离散图,遍历寻找最优的分割点。
2. 带深度限制的Leaf-wise的叶子生长策略
XGBoost采用按层生长level(depth) -wise
生长策略,能够同时分裂同一层的叶子,从而进行多线程优化,不易多拟合。若不加区分的对待同一层的叶子,就带来了许多没必要的开销。实际上,很多叶子的分裂增益较低,没必要进行搜索和分裂。
LightGBM采用leaf-wise
生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环。与level-wise相比,在同样的分裂次数下,leaf-wise可以降低更多的误差,得更好的精度。但leaf-wise的缺点就是可能会长出较深的决策树,产生过拟合。因此,LightGBM在leaf-wise之上增加了一个最大深度的限制,保证高效率的同时防止过拟合。
3. 直方图做差加速
LightGBM另一个优化是Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。
利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。
4. 直接支持类别特征(Categorical Feature)
实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征转化为one-hotting
特征,降低了空间和时间的效率。LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开,并在决策树算法上增加了类别特征的决策规则。
而为了解决one-hot编码处理类别特征的不足,LightGBM采用了Many vs many
的切分方式,实现了类别特征的最优切分。用LightGBM可以直接输入类别特征。在1个k维的类别特征中,寻找最优切分,朴素的枚举算法的复杂度是
O
(
2
k
)
O(2^k)
O(2k)。而LightGBM采用了如On Grouping For Maximum Homogeneity
的方法实现了
O
(
k
log
k
)
O(k \log k)
O(klogk)的算法。
5. 直接支持高效并行
LightGBM原生支持并行学习,目前支持特征并行和特征并行的两种。
-
特征并行的主要思想:在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
-
数据并行的主要思想:让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上寻找最优分割点。
LightGBM针对这两种并行方法都做了优化。在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;在数据并行中,使用**分散规约(Reduce scatter
)**把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。
6. 网络通信优化
XGBoost由于采用pre-sorted算法,通信代价非常大,所以在并行的时候也是采用histogram算法;LightGBM采用的histogram算法通信代价小,通过使用集合通信算法,能够实现并行计算的线性加速。
参考资料: