LightGBM算法梳理

  • 1.LightGBM
  • 2.LightGBM的起源
  • XGBoost与LightGBM对比
  • 3.Histogram VS pre-sorted
  • 4.leaf-wise VS level-wise
  • 5.特征并行和数据并行
  • 6.顺序访问梯度
  • 7.支持类别特征
  • 8.sklearn参数


1.LightGBM

LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升框架. 可用于排序,分类,回归以及很多其他的机器学习任务中.

2.LightGBM的起源

之前提到过XGBoost算法, 该算法通过不断添加树, 不断进行特征分裂来生成一棵树, 对样本进行评分, 训练K个树后, 得到预测结果. XGBoost算法应用广泛, 效果出众, 但在使用过程中, 训练时间较长, 内存占用大. 针对这一问题, 2017年1月微软在Github上开源了一个新的升压工具-LightGBM. 在不降低准确率的前提下, 速度提升了10倍左右, 占用内存下降了3倍左右. 该算法基于决策树算法, 它采用最优的leaf-wise策略分裂叶子结点, 这是与其它提升方法不同的. 因此, 在LightGBM算法中, 当增长到相同的叶子结点, leaf-wise算法比level-wise算法减少更多的损失. 因此具有更高的精度.

XGBoost与LightGBM对比

下面表格给出了XGBoost与LightGBM之间细致的性能对比:

flink部署hadoop flink部署light GBM算法_直方图


从表格可以看出, 两者树生长方式不同, 前者为level-wise, 后者为leaf-wise. Split search algorithm不同, XGBoost为Pre-sorted, LightGBM为Histogram.

3.Histogram VS pre-sorted

这一部分我们来介绍以下pre-sorted算法与histogram算法. Pre-sorted算法是XGBoost中用于划分搜索的. 即在计算过程当中是按照value的排序,逐个数据样本来计算划分收益,这样的算法能够精确的找到最佳划分值,但是代价比较大同时也没有较好的推广性.

Histogram算法的基本思想是先把连续的浮点特征值离散化成kk个整数,同时构造一个宽度为kk的直方图. 在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点. 在XGBoost中需要遍历所有离散化的值,而在这里只要遍历k个直方图的值. 使用直方图算法有很多优点. 首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值.然后在计算上的代价也大幅降低,XGBoost预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(N* M) 优化到O(k* M). (N为数据集的个数, M为特征的个数)

当然,Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响.

4.leaf-wise VS level-wise

Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

5.特征并行和数据并行

LightGBM还具有支持高效并行的优点。LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。

1)特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。

2)数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。

LightGBM针对这两种并行方法都做了优化,在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;在数据并行中使用Reduce scatter把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。

6.顺序访问梯度

预排序算法中有两个频繁的操作会导致cache-miss,也就是缓存消失(对速度的影响很大,特别是数据量很大的时候,顺序访问比随机访问的速度快4倍以上 ). 对梯度的访问:在计算增益的时候需要利用梯度,对于不同的特征,访问梯度的顺序是不一样的,并且是随机的
对于索引表的访问:预排序算法使用了行号和叶子节点号的索引表,防止数据切分的时候对所有的特征进行切分。同访问梯度一样,所有的特征都要通过访问这个索引表来索引。
这两个操作都是随机的访问,会给系统性能带来非常大的下降。LightGBM使用的直方图算法能很好的解决这类问题。首先。对梯度的访问,因为不用对特征进行排序,同时,所有的特征都用同样的方式来访问,所以只需要对梯度访问的顺序进行重新排序,所有的特征都能连续的访问梯度。并且直方图算法不需要把数据id到叶子节点号上(不需要这个索引表,没有这个缓存消失问题)

7.支持类别特征

实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的one-hot编码特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的one-hot编码展开。并在决策树算法上增加了类别特征的决策规则。在Expo数据集上的实验,相比0/1展开的方法,训练速度可以加速8倍,并且精度一致。