Lightgbm基本原理介绍

Lightgbm基本原理介绍 - Y学习使我快乐V的博客 - CSDN博客
https://blog.csdn.net/qq_24519677/article/details/82811215

1 传统的boosting 算法需要对每个特征都要扫描所有的样本点来选择最好的切分点,这是非常耗时的。为了解决这种大样本高纬度数据的环境下耗时的问题,Lgb 使用了 如下两个解决方法: 一是GOSS(基于梯度的单边采样) ,不是使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度; 二是EFB(互斥特征捆绑) ,这里不是使用所有的特征来进行扫描获得最佳的切分点,而是将某些特征进行捆绑在一起来降低特征的维度,是寻找最佳切分点的消耗减少。这样大大的降低了 处理样本的时间复杂度,但在精度上,通过大量的实验证明,在某些数据集上使用Lgb并不损失精度,还会提升。

2 GOSS(基于梯度的单边采样)

主要思想是:梯度大的样本点在信息增益的计算上扮演着主要的作用,也就是这些梯度大的样本点会贡献更多的信息增益,因此为了保持信息增益评估的精度,当我们对样本进行下采样的时候保留这些梯度大的样本点,而对梯度小的样本点按比例进行水机采样即可。

2.1 GOSS算法

在AdaBoost 算法中,我们在每次迭代更加注重上一次错分的样本点,也就是上一次错分的样本点的权重增大,而在GBDT 中并没有本地的权重来实现这样的过程,所以在Adaboost 中提出的采样模型不能应用在GBDT 中,但是每个样本的梯度对采样提供了 非常有用的信息。也就是说,如果一个样本点的梯度小,那么该样本点的训练误差就小并且已经经过了很好的训练。一个直接的办法就是直接抛弃梯度小的样本点,但是这样做的话会改变数据的分布和损失学习的模型精度,GOSS的提出就是为了避免这两个问题的发生,下面是GOSS 算法的伪代码:

2.2 GOSS 算法描述

输入:训练数据,迭代步数d,大梯度数据的采样率a,小梯度数据的采样率b,损失函数和若干学习器的类型(一般为决策树):

输出:训练好的强学习器:

(1) 根据样本点的梯度的绝对值对它们进行降序排序

(2)对排序后的结果选取前a*100% 的样本生成一个梯度样本点的子集

(3)对剩下的样本集合(1-a)*100%的样本,随机的选取b*(1-a)*100% 个样本点,生成一个小梯度样本点的集合

(4)将大梯度样本和采样的小梯度样本合并

(5)将小梯度样本乘上一个权重系数 (1-a)/b

  (6)  使用上述的采样的样本,学习一个新的弱学习器

(7)不断地重复(1)-(6)步骤直到达到规定的迭代次数或者收敛为止。

通过上面的算法可以在不改变数据分布的前提下不损失学习器精度的同时大大的减少模型学习的速率。

从上面的描述的可知,当a=0 时,GOSS算法退化为随机采样算法,当a=1 时,GOSS 算法变为才采取整个样本的算法。在许多情况下,GOSS算法训练出的模型精度要高于随机采样算法。另一方面,采样也将会增加若学习器的多样性,从而潜在的提升了训练出的模型泛化能力。

三 Exclusive Feature Bunding (EFB)介绍

Lgb 实现中不仅进行了数据采样,也进行了特征抽样,使得模型的训练速度进一步的减少,但是该特征抽样又与一般的特征抽样有所不同,是将互斥特征绑定在一起从而减少特征维度。主要思想就是,通常在实际应用中高纬度的数据往往都是稀疏数据(如onehot 编码),这使得我们有可能设计一种几乎无损的方法来减少有效特征的数量。 尤其在稀疏特征空间中许多特征都是互斥的,这使得我们可以将互斥特征绑定在一起形成一个特征,从而减少特征维度,但是怎样将互斥特征绑定在一起了? lgb 使用的是基于直方图的方法。

3.1 EFB 算法

由于将特征划分为更小的互斥绑定数量,这个是一个NP-hard 问题,即在多项式时间内不可能去找到准确的解决办法,所以这里使用的是一种近似的解决办法,即特征之间允许存在少数的样本点并不是互斥的( 如存在某些对应的样本点之间不同是为非0的值),允许小部分的冲突可以得到更小的特征绑定数量,更进一步的计算的有效性。在理论上可以证明,通过允许小部分的冲突的话,使得模型的accuracy 被影响这里的是每个绑定的最大冲突率。所以,当我们选择很小的时,我们可以在精确度和效率上获得很好的权衡,下面是互斥特征绑定的算法。

3.2 EFB 算法描述

输入: 特征F ,最大冲突数K,图G;

输出:特征捆绑集合bundles;

(1)构造一个边带有权重的图,其权重对应于特征之间的总冲突

(2)通过特征在图中的度来降序排序特征

(3)检查有序列表中的每个特征,并将其分配给具有小冲突的现有bunding(由控制),或创建新的bunding。

上述算法的时间复杂度为,并且在模型训练之前仅仅被处理一次即可。在特征维度不是很大时,这样的复杂度可以接受的,但是当样本维度较高时,这种方法就会特别的低效,所以对于此,作者又提出另一个高效的算法:按非零值计数排序,这类似于按度数排序,因为更多的非零值通常会导致更高的冲突概率,这仅仅改变了上述算法的排序策略,所以只是针对上述算法将按照度数排序改为非0值数量排序,其他不变。

3.3 合并互斥特征

lgb 关于互斥特征的合并用到了直方图算法,直方图算法的基本思想是先把连续的特征值离散化成k个整数,同时构造一个宽度为k 的直方图。 在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

  由于基于直方图的算法存储的是离散的bins 而不是连续的特征值,我们可以通过让互斥特征驻留在不同的bins 中构造features bundle。 这可以通过增加特征原始值的偏移量来实现。

lgb 关于互斥特征的合并用到了直方图算法,直方图算法的思想是先把连续的特征值离散化成k个整数,同时构造一个宽度为k 的直方图。 在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

  由于基于直方图的算法存储的是离散的离散的bins 而不是连续的特征值,我们可以通过互斥特征驻留在不同的bins 中构造feature bundle 。这可以通过增加特征原始值的偏移量来实现,比如假设我们有两个特征,特征A 的取值范围是[0,10),而特征B的取值范围是[0,20),我们可以给特征B 增加偏移量10,使得特征B 的取值范围为[10,30),最后合并特征A和B,形成新的特征,取值范围为[0,30) 来取代特征A和B。

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

Histogram 算法有如下优点:

(1)减少分割增益的计算量: xgboost 中默认使用的是pre-sorted 算法,需要O(#data)次的计算,而Hisogram 算法只需要计算O(#bins) 次,并且O(#bins) 远小于O(#data)。

(2)通过直方图相减来进一步的加速模型的训练,在二叉树种可以通过利用叶节点的父节点和相邻节点的直方图的相减来获得该叶节点的直方图。所以仅仅需要为一个叶节点建立直方图(其#data 小于它的相邻节点)就可以通过直方图的相减来获得相邻节点的直方图,而这花费的代价(O(#bins))很小。

(3 )减少内存的使用:可以将连续的值替换为离散的bins,如果#bins 较小,可以利用较小的数据类型来存储训练数据并且无需为pre-sorting 特征值存储额外的信息。

(4)减少并行学习的通信代价。

四  lgb 的一些其他特性

4.1 Leaf-wise 的决策树生长策略

大部分决策树的学习算法通过level-wise 策略生长树,记一次分裂同一层的叶子,不加区分的对待同一层的叶子,而实际上很多叶子的分裂增益较低没必要进行分裂,带来了没必要的开销。

lgb 通过leaf-wise 策略来生长树,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环,因此同level-wise 相比,在分裂次数相同的情况下,leaf-wise 可以降低更多的误差,得到更好的精度。但是,当样本量较小的时候,leaf-wise 可能会造成过拟合。所以,lgb 可以利用额外的参数max_depth 来限制树的深度避免过拟合。

4.2 类别特征值的最优分割

对于类别型的数据,我们通常将类别转化为onehot / 哑变量编码。然而对于学习树来说这不是个好的解决方案。原因是对于一个基数较大的类别特征,学习树会生长的非常不平衡,并且需要非常深的深度才能来达到较好的准确率。

 事实上,最好的解决方案是将类别特征划分为两个子集,总共中可能的切分。比如有一个颜色特征,每个样本的颜色特征是{红,黄,蓝,绿}四种类别中的一种,如果使用onehot/哑变量编码很好理解这里不再叙述,但是如果使用lgb 的切分策略,就是将红,黄,蓝,绿 对应的四类样本分为两类的所有可能策略,比如:红黄-类,蓝绿一类,那么就会有种策略,这样才能充分的挖掘该维特征所包含的信息,找到最优的分割策略。但是这样寻找最优分割策略的时间复杂度就会很大。对于回归树有个有效的解决方案,为了寻找最优的划分需要大约。基本思想是根据训练目标的相关性对类别进行重排序。更具体的说,根据累加值重新对(类别特征的)直方图进行排序,然后在排好序的直方图中寻找最好的分割点。

4.3 lgb 中的并行学习

4.3.1 特征并行

1 传统算法的特征并行

传统的特征并行算法旨在于并行化决策树中的寻找最佳切分点,主要流程如下:

(1)垂直切分数据(不同的Worker 有不同的特征集)

(2)在本地特征集寻找最佳切分点(特征,阈值)

(3)在各个机器之间进行通信,拿出自己的最佳切分点,然后从所有的最佳切分点中推举出一个最好的切分点,作为全局的切分点。

(4)以最佳划分方法对数据进行划分,并将数据划分结果传递给其他worker。

(5)其他Worker 对接受到的数据进一步划分。

2 传统的特征并行方法主要不足:

(1) 存在计算上的局限,传统特征并行无法加速特征切分(时间复杂度O(#data))。 因此,当数据量很大的时候,难以加速。

(2) 需要对划分的结果进行通信整合,其额外的时间复杂度约为O(#data/S) 。(一个数据一个字节)

3 lgb 中的特征并行

在数据量很大时,传统并行方法无法有效的对特征进行并行,lgb 做了一些改变: 不再垂直划分数据,即每个worker 都持有全部数据。因此,lgb 中没有数据划分结果之间通信开销,各个Worker 都知道如何划分数据。而且,样本量也不会变得更大,所以使每个机器都持有全部数据是合理的。

lgb 中特征并行的流程如下:

(1)每个worker 都在本地特征集上寻找最佳划分点(特征,阈值)

(2)本地进行各个划分的通信整合并得到最佳划分;

(3)执行最佳划分。

然而,该特征并行算法在数据量很大时仍然存在计算上的局限,因此建议在数据量很大是使用数据并行。

 

4.3.2 数据并行

1 传统的数据并行算法

 

Lightgbm基本原理介绍 - Y学习使我快乐V的博客 - CSDN博客
https://blog.csdn.net/qq_24519677/article/details/82811215

lightGBM原理、改进简述 - 鸟恋旧林的博客 - CSDN博客
https://blog.csdn.net/niaolianjiulin/article/details/76584785

 

XGBoost、LightGBM的详细对比介绍 - Infaraway - 博客园
https://www.cnblogs.com/infaraway/p/7890558.html

 

LightGBM调参指南(带贝叶斯优化代码) - 知乎
https://zhuanlan.zhihu.com/p/27916208

### LightGBM算法工作机制与基本原理 #### 1. 基本思想 LightGBM是一种基于决策树的梯度提升框架,它利用直方图方法来优化计算效率并减少内存消耗。相比于传统的梯度提升决策树(Gradient Boosting Decision Tree, GBDT),LightGBM通过引入Leaf-wise生长策略替代Level-wise生长方式,在相同精度下显著提高了训练速度[^1]。 #### 2. 核心技术特点 - **Leaf-wise (最佳优先) 生长策略**: Leaf-wise策略允许模型每次从当前所有叶子中找到具有最大分裂增益的一个节点进行分裂,而不是像传统GBDT那样逐层分裂。这种策略可以更早地捕获到重要的特征组合,从而提高模型效果。然而,为了防止过拟合,通常会设置最大深度限制。 - **直方图算法**: LightGBM采用直方图算法将连续型特征离散化为k个整数值(即构建直方图)。在每轮迭代过程中,只需扫描一次数据即可完成统计工作,极大地减少了计算量。具体而言,对于每个特征,程序会先建立一个固定宽度的直方图,再依据该直方图寻找最优分割点[^2]。 - **带权量化直方图**: 针对大规模稀疏数据场景,LightGBM提出了带权量化的方法进一步降低存储需求和运行时间成本。此方法能够在保持较高预测准确性的同时有效处理高维稀疏输入向量[^3]。 #### 3. 切分点选择逻辑 当决定某个节点是否应该被划分时,LightGBM会评估切分前后带来的增益值,并将其与预定义阈值对比。如果增益超过指定标准,则执行切割操作;否则保留原状不变。整个判断流程如下所示: ```cpp // Pseudo-code for split decision in feature_histogram.hpp if (gain >= min_split_gain && num_data_in_left * num_data_in_right > 0){ perform_split(); } else { keep_node_unsplit(); } ``` 上述伪代码片段清晰体现了LightGBM关于何时实施分支的关键准则之一——只有当预期收益足够大且两侧子集均含有样本实例的情况下才会真正施行分区动作。 #### 4. 并行学习支持 除了高效的单机版本外,LightGBM还提供了分布式环境下的多线程并行能力。这使得即使面对TB级海量数据也能快速得到高质量的结果。主要依赖三种类型的并行模式:数据并行、功能并行以及投票并行。 --- ### 总结 综上所述,LightGBM凭借独特的Leaf-wise增长机制、创新性的直方图技术和强大的并行架构设计成为现代机器学习领域不可或缺的一员。无论是解决回归还是分类问题,都能展现出卓越的表现力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值