监督学习集成模型——LightGBM

LightGBM的全称为Light Gradient Boosting Machine,即轻量的梯度提升机,由微软在其论文“LightGBM: A Highly Efficient Gradient Boosting Decision Tree”中提出,作为与XGBoost并驾齐驱的SOTA Boosting算法,LightGBM在各种顶级解决方案中同样屡见不鲜。LightGBM本质上仍属于GBDT算法,一种针对XGBoost缺陷的改进版本,使得GBDT算法系统更轻便、更高效,能够做到又快又准。
image

一、XGBoost可改进的点

XGBoost通过预排序(对所有特征都按照特征的数值进行排序)的算法来寻找特征的最佳分裂点,虽然预排序算法能够准确找出特征的分裂点,但该方法占用空间太大,在数据量和特征量都比较多的情况下,会严重影响算法性能。

XGBoost寻找最佳分裂点的算法复杂度可以估计为:

复杂度=特征数量×特征分裂点的数量×样本数量

既然XGBoost的复杂度是由特征数量、特征分裂点的数量和样本数量所决定的,那么LightGBM的优化自然可以从这三个方向来考虑。

二、LightGBM原理

跟XGBoost一样,LightGBM也是GBDT算法框架的一种工程实现,不过更快速、更高效。下面分别从直方图算法、单边梯度抽样、互斥特征捆绑算法以及leaf-wise生长策略等方向来解释LightGBM。

2.1 直方图算法

为了减少特征分裂点数量和更加高效地寻找最佳特征分裂点,LightGBM区别于XGBoost的预排序算法,采用直方图算法寻找最佳特征分裂点。主要思路是将连续的浮点特征值离散化为k个整数并构造一个宽度为k的直方图。对某个特征数据进行遍历的时候,将离散化后的值用为索引并作为直方图的累积统计量。遍历完一次后,直方图便可累积对应的统计量,然后根据该直方图寻找最佳分裂点。

image

直方图算法本质上是一种数据离散化和分箱(分桶)操作,虽然谈不上特别新颖的优化设计,但确实速度快性能优,计算代价和内存占用都大大减少。

直方图的另一个好处在于差加速。一个叶子结点的直方图可由其父结点的直方图与其兄弟结点的直方图作差得到,这也可以加速特征结点分裂。

image

直方图算法对应的是特征分裂点的优化。

2.2 单边梯度抽样

单边梯度抽样(gradient-based one-side sampling,GOSS)算法是LightGBM从减少样本的角度进行优化而设计的算法,是LightGBM的核心原理之一。

单边梯度抽样算法的主要思路是从减少样本的角度出发,将训练过程中大部分权重(GBDT算法体系中使用样本梯度来代替样本权重)较小的样本剔除,仅对剩余样本数据计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。

GOSS的基本做法是先将需要进行分裂的特征按绝对值大小降序排序,取绝对值最大的前a%个数据,假设样本大小为n,在剩下的(1−a)%个数据中随机选择b%个数据,将这b%个数据乘以一个常数(1−a)/b,这种做法会使得算法更加关注训练不够充分的样本,并且原始的数据分布不会有太大改变。最后使用a+b个数据来计算该特征的信息增益。

GOSS算法主要从减少样本的角度对GBDT进行优化。丢弃梯度较小的样本并且在不损失太多精度的情况下提升模型的训练速度,这是LightGBM速度较快的原因之一。

GOSS对应的是样本量的算法优化。

2.3 互斥特征捆绑算法

高维度的数据往往是稀疏的,这种稀疏性启发我们设计一种无损的方法来减少特征的维度。

互斥特征捆绑(exclusive feature bundling,EFB)算法通过将两个互斥的特征捆绑为一个特征,在不丢失特征信息的前提下,减少特征数量(降维),从而加速模型训练。

所谓特征互斥,即两个特征不会同时为非零值,这一点跟分类特征的one-hot表达有点类似。互斥特征捆绑算法的关键问题有两个:一个是如何判断将哪些特征进行绑定,另一个就是如何将特征进行绑定,即绑定后的特征如何取值。

针对第一个问题,EFB算法将其转化为图着色问题(graph coloring problem)来求解。其基本思路是将所有特征看作图的各个顶点,用一条边连接不相互独立的两个特征,边的权重则表示两个相连接的特征的冲突比率,需要绑定在一起的特征就是图着色问题中要涂上同一种颜色的点(特征)。

第二个问题是要确定绑定后的特征如何进行取值,其关键在于能够将原始特征从合并后的特征中分离,即绑定到一个特征后,仍然可以从这个绑定的bundle里面识别出原始特征。EFB算法针对该问题尝试从直方图的角度来处理,具体做法是将不同特征值分到绑定的bundle中不同的直方图“箱子”中,通过在特征取值中加一个偏置常量来进行处理。

互斥特征捆绑算法针对的是特征的优化。

2.4 leaf-wise生长策略

LightGBM提出了区别于XGBoost的按层生长的叶子结点生长方法,即带有深度限制的按叶子结点(leaf-wise)生长的决策树生长方法

XGBoost采用按层生长的level-wise算法,好处是可以多线程优化,也方便控制模型复杂度,且不易过拟合,缺点是不加区分地对待同一层所有叶子结点,大部分结点分裂和增益计算不是必需的,产生了多余的计算开销。

LightGBM提出了按叶子结点生长的leaf-wise算法。

leaf-wise算法:每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环。

leaf-wise精度更高且更高效,能够节约不必要的计算开销。

但可能会长出比较深的决策树,产生拟合。为防止某一结点过分生长,leaf-wise加上一个深度限制机制,能够在保证精度的同时一定程度上防止过拟合。

image

除了以上四点改进算法外,LightGBM在工程实现上也有一些改进和优化,比如可以直接支持类别特征(不需要再对类别特征进行one-hot处理)、高效并行和cache(缓存)命中率优化等。

posted @ 2022-08-25 20:11  王陸  阅读(1444)  评论(0编辑  收藏  举报