机器学习高级算法梳理四 —— LightGBM
文章目录
一、lightGBM简介
lightGBM包含两个关键点:light即轻量级,GBM 梯度提升机
LightGBM 是一个梯度 boosting 框架,使用基于学习算法的决策树,分布式的,高效的,优点:更快的训练效率、低内存使用、更高的准确率、支持并行化学习、可处理大规模数据
与常用的机器学习算法进行比较:
二、LightGBNM起源
Light Gradient Boosting Machine (LightGBM)是一个由微软亚洲研究院分布式机器学习工具包(DMTK)团队开源的基于决策树算法的分布式梯度提升(Gradient Boosting Decision Tree,GBDT)框架
在大样本和高维度的环境下,传统的boosting算法对每一个特征都要扫描所有的样本点来选择最好的切分点非常耗时,为了解决耗时的问题,Lightgbm使用了如下两种解决办法:一是GOSS(Gradient-based One-Side Sampling, 基于梯度的单边采样),不是使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度;二是EFB(Exclusive Feature Bundling, 互斥特征捆绑) ,这里不是使用所有的特征来进行扫描获得最佳的切分点,而是将某些特征进行捆绑在一起来降低特征的维度,使寻找最佳切分点的消耗减少
三、GOSS(基于梯度的单边采样)
1、主要思想:梯度大的样本点在信息增益的计算上扮演着主要的作用,贡献更多的信息增益,因此为了保持信息增益评估的精度,当我们对样本进行下采样的时候保留这些梯度大的样本点,而对于梯度小的样本点按比例进行随机采样即可
2、算法描述
输入:训练数据,迭代步数d,大梯度数据的采样率a,小梯度数据的采样率b,损失函数和若学习器的类型(一般为决策树)
输出:训练好的强学习器
(1)根据样本点的梯度的绝对值对它们进行降序排序;
(2)对排序后的结果选取前a*100%的样本生成一个大梯度样本点的子集;
(3)对剩下的样本集合(1-a)100%的样本,随机的选取b(1-a)*100%个样本点,生成一个小梯度样本点的集合;
(4)将大梯度样本和采样的小梯度样本合并;
(5)将小梯度样本乘上一个权重系数;
(6)使用上述的采样的样本,学习一个新的弱学习器;
(7)不断地重复(1)~(6)步骤直到达到规定的迭代次数或者收敛为止。
通过上面的算法可以在不改变数据分布的前提下不损失学习器精度的同时大大的减少模型学习的速率。当a=0时,GOSS算法退化为随机采样算法;当a=1时,GOSS算法变为采取整个样本的算法。在许多情况下,GOSS算法训练出的模型精确度要高于随机采样算法。另一方面,采样也将会增加若学习器的多样性,从而潜在的提升了训练出的模型泛化能力
四、EFB(互斥特征捆绑)
1、算法思想
高维数据通常是稀疏的,特征的稀疏性给我们设计一种近乎无损的降低特征维数的方法提供了可能性,在稀疏特征空间中,许多特征是互斥的,即它们从不同时取非零值,我们把把互斥的特征捆绑成一个特征。
在实际应用中, 示例包括单热特征(例如,文本挖掘中的独热编码)我们通过将最佳捆绑问题减少到图着色问题来设计一种有效的算法(通过将特征作为顶点并为每两个特征添加边缘,如果它们不相互排斥),并通过贪婪算法解决
2、算法过程
输入:特征F,最大冲突数K,图G
输出:特征捆绑集合bundles
(1)构造一个边带有权重的图,其权值对应于特征之间的总冲突;
(2)通过特征在图中的度来降序排序特征;
(3)检查有序列表中的每个特征,并将其分配给具有小冲突的现有bundling(由控制),或创建新bundling
五、histogram VS pre-sorted
- pre-sorted:在树分裂计算分裂特征的增益时,xgboost 采用了预排序的方法来处理节点分裂,能够更精确的找到数据分隔点,但是在空间和时间上有很大的开销
精确的找到数据分隔点:
1)对所有特征按数值进行预排序
2)在每次的样本分割时,用O(# data)的代价找到每个特征的最优分割点
3)找到最后的特征以及分割点,将数据分裂成左右两个子节点
开销大:
1)由于需要对特征进行预排序并且需要保存排序后的索引值(为了后续快速的计算分裂点),因此内存需要训练数据的两倍
2)在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大 - histogram(直方图) :Lightgbm 选择了基于 histogram 的决策树算法,相比于 pre-sorted算法,histogram 在内存消耗和计算代价上都有不少优势,占用的内存更低,数据分隔的复杂度更低
histogram 思想:将连续的浮点特征离散成k个离散值,并构造宽度为k的Histogram。然后遍历训练数据,统计每个离散值在直方图中的累计统计量。在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点
histogram优点:
(1)减少分割增益的计算量
(2)通过直方图相减来进一步的加速模型的训练:在二叉树中可以通过利用叶节点的父节点和相邻节点的直方图的相减来获得该叶节点的直方图,花费的代价小
(3) 减少内存的使用
(4) 减少并行学习的通信代价
六、leaf-wise VS level-wise
- level-wise:XGBoost采用的是带深度限制的level-wise生长策略,level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但是不加区分的对待同一层叶子,有很多不必要的开销(实际很多叶子的分裂增益较低,不需要进行搜索和分裂)
- leaf-wise:LightGBM采用 leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大的一个叶子(一般也是数据量最大),然后分裂,循环;但是会生长出比较深的决策树,产生过拟合,因此LightGBM在 leaf-wise上增加了一个最大深度显示,在保证高效率的同时防止过拟合
七、特征并行和数据并行
-
特征并行: 数据量很大时,不再垂直划分数据,即每个Worker都持有全部数据,因此,LighetGBM中没有数据划分结果之间通信的开销,各个Worker都知道如何划分数据, 而且,样本量也不会变得更大,所以,使每个机器都持有全部数据是合理的
LightGBM 中特征并行的流程如下:
(1)每个Worker都在本地特征集上寻找最佳划分点{特征, 阈值}
(2)本地进行各个划分的通信整合并得到最佳划分
(3)执行最佳划分
该特征并行算法在数据量很大时仍然存在计算上的局限,建议在数据量很大时使用数据并行 -
数据并行:LightGBM 中通过减少数据并行过程中的通讯开销,来减少数据并行的开销:
(1)整合所有本地直方图以形成全局直方图的方式,LightGBM 使用Reduce scatter的方式对不同Worker的不同特征(不重叠的)进行整合,然后Worker从本地整合直方图中寻找最佳划分并同步到全局的最佳划分中
(2)LightGBM 通过直方图做差法加速训练, 基于此,我们可以进行单叶子的直方图通讯,并且在相邻直方图上使用做差法
八、顺序梯度访问
预排序算法中有两个频繁的操作会导致cache-miss,也就是缓存消失(对速度的影响很大,特别是数据量很大的时候,顺序访问比随机访问的速度快4倍以上 )。
对梯度的访问:在计算增益的时候需要利用梯度,对于不同的特征,访问梯度的顺序是不一样的,并且是随机的
对于索引表的访问:预排序算法使用了行号和叶子节点号的索引表,防止数据切分的时候对所有的特征进行切分。同访问梯度一样,所有的特征都要通过访问这个索引表来索引。
这两个操作都是随机的访问,会给系统性能带来非常大的下降。
LightGBM使用的直方图算法能很好的解决这类问题。首先。对梯度的访问,因为不用对特征进行排序,同时,所有的特征都用同样的方式来访问,所以只需要对梯度访问的顺序进行重新排序,所有的特征都能连续的访问梯度。并且直方图算法不需要把数据id到叶子节点号上(不需要这个索引表,没有这个缓存消失问题)
九、支持类别特征
传统的机器学习一般不能支持直接输入类别特征,需要先转化成多维的0-1特征,这样无论在空间上还是时间上效率都不高。LightGBM通过更改决策树算法的决策规则,直接原生支持类别特征,不需要转化,提高了近8倍的速度