集成算法之Light GBM

烈酒焚心 提交于 2020-01-14 19:51:04

一、Light GBM

Light GBM是和xgboost类似的一种集成算法。xgboost算法的一个瓶颈是针对每个特征,它都需要对每一个可能的分裂点扫描全部的样本来计算基尼系数,这样大大增加了计算量,降低了算法效率。为了解决这种在大样本高纬度数据的环境下耗时的问题,Light GBM算法使用直方图方法在牺牲一定精度的条件下,换取计算速度的提升和内存的消耗;主要使用如下两种方法:一是GOSS(Gradient-based One-Side Sampling, 基于梯度的单边采样),不是使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度;二是EFB(Exclusive Feature Bundling, 互斥特征捆绑) ,这里不是使用所有的特征来进行扫描获得最佳的切分点,而是将某些特征进行捆绑在一起来降低特征的维度,是寻找最佳切分点的消耗减少。这样大大的降低的处理样本的时间复杂度,但在精度上,通过大量的实验证明,在某些数据集上使用Lightgbm并不损失精度,甚至有时还会提升精度。

二、直方图算法(Histogram-based Alogrithm)

直方图优化算法需要在训练前预先把特征值转化为bin,也就是对每个特征的取值做个分段函数,将所有样本在该特征上的取值划分到某一段(bin)中,最终把特征取值从连续值转化成了离散值。
在这里插入图片描述
第一个 for 循环表示的是对当前模型下所有的叶子节点进行遍历。

第二个 for 循环就开始遍历所有的特征了。对于每个特征,创建一个直方图并存储了两类信息,分别是每个bin中样本的梯度之和(H[f.bins[i]].gH[f.bins[i]].g),还有就是每个bin中样本数量(H[f.bins[i]].nH[f.bins[i]].n

第三个 for 循环遍历所有样本,累积上述的两类统计值到样本所属的bin中。即直方图的每个 bin 中包含了一定的样本,在此计算每个 bin 中的样本的梯度之和并对 bin 中的样本记数。

最后一个for循环,遍历所有bin,分别以当前bin作为分割点,累加其左边的bin至当前bin的梯度和(SLS_L)以及样本数量(nLn_L),并与父节点上的总梯度和(SpS_p)以及总样本数量(npn_p)相减,得到右边所有bin的梯度和(SRS_R)以及样本数量(nRn_R),带入公式,计算出增益,在遍历过程中取最大的增益,以此时的特征和bin的特征值作为分裂节点的特征和分裂特征取值。

优点:

  1. 减少内存消耗:直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,相较于预排序算法,内存消耗大大降低。
  2. 提升运算效率:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算按照bin来换分的信息增益,运算效率大大提升。

缺点:

  1. 预排序算法能够忽略零值特征,减少训练代价;而直方图算法不能对稀疏进行优化,只是计算累加值(累加梯度和样本数)。但是,LightGBM对稀疏进行了优化:只用非零特征构建直方图。
  2. 直方图算法不能找到很精确的分割点,训练误差没有预排序算法好。但是, 由于决策树是弱模型, 分割点不太精确并没有太大影响;同时,较粗的分割点也有正则化的效果,可以有效地防止过拟合;因此,即使单棵树的训练误差比精确分割的算法稍大,但在整体下并没有太大的影响。

三、GOSS

GOSS(Gradient-based one-side sampling)(基于梯度的单边采样)方法的主要思想就是,梯度大的样本点在信息增益的计算上扮演着主要的作用,也就是说这些梯度大的样本点会贡献更多的信息增益,因此为了保持信息增益评估的精度,当我们对样本进行下采样的时候保留这些梯度大的样本点,而对于梯度小的样本点按比例进行随机采样即可,相当于随机排除了一些小梯度样本,使用剩余较大梯度样本进行评估信息增益。

伪代码如下:
在这里插入图片描述
算法解释:
输入:II-训练数据,dd-迭代次数,aa-大梯度采样比例,bb-小梯度采样比例,lossloss-损失函数,LL-弱学习器(一般为决策树)

  1. 根据样本梯度进行排序;
  2. 根据排序结果,抽取top a*100%的样本作为大梯度样本采样数据;
  3. 从剩下的样本中,选取b*100%作为小梯度样本采样数据;
  4. 合并两个采样样本;
  5. 将小梯度样本乘上一个权重系数1ab\frac{1-a}{b}
  6. 使用上述的采样的样本,学习一个新的弱学习器;
  7. 不断重复上述过程,直至达到相应迭代次数或模型收敛。

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

四、EFB

EFB(Exclusive Feature Bundling)(互斥特征捆绑)。高维数据通常是稀疏的,许多特征之间是互斥的,即它们不会同时拥有非零值;EFB就是把互斥的特征进行bundle,通过算法对同一个bundle里面的特征做相同的直方图算法,从而减少了计算量。GOSS从数据量上减少了数据,提升了计算效率,EFB则是从特征维度上减少了计算量。

伪代码如下:
在这里插入图片描述
算法解释:
输入:FF-特征,KK-最大冲突数量,即特征之间允许存在少数的样本点并不是互斥的最大数量,GG-构造的图

  1. 构造一个边带有权重的图,其权值对应于特征之间的总冲突;
  2. 通过特征在图中的度来降序排序特征;
  3. 检查有序列表中的每个特征,并将其分配给具有小冲突的现有bundle,或创建新bundle。
  4. 然后采用merge exclusive features,使用直方图方法将特征merge起来,原理:由于基于直方图的算法存储的是离散的bins而不是连续的特征值,我们可以通过让互斥特征驻留在不同的bins中来构造feature bundle。这可以通过增加特征原始值的偏移量来实现。比如,假设我们有两个特征,特征A的取值范围是[0,10),而特征B的取值范围是[0,20),我们可以给特征B增加偏移量10,使得特征B的取值范围为[10, 30),最后合并特征A和B,形成新的特征,取值范围为[0,30)来取代特征A和特征B。

由上可知,正如前面所说,EFB从特征维度上减少了计算量,提升了计算效率。

五、Level-wise和Leaf-wise

大部分决策树的学习算法通过 level-wise 策略生长树,即每次分裂同一层的所有叶子,对所有叶子进行无差别分裂,但是一些叶子节点分裂后带来的增益可能非常小,对结果影响不大,进行无差别分裂的话就浪费了资源。
所以,LightGBM 通过 leaf-wise 策略来生长树。每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。但是,这样的分裂方式会很容易陷入较大的深度,造成过拟合。 因此,必须通过 max_depth 来限制树的深度来避免过拟合。
在这里插入图片描述

六、分类变量(categorical feature)

对于类别型的变量,我们通常将类别特征转化为one-hot编码,如xgboost。 但是,这种处理方式会较大的耗用内存,并且对于一个类别数量较大的类别特征,会引起树的不平衡,需要很大的深度才能来达到较好的准确率。

LightGBM的优化方法是对分类特征进行二分处理,这样就会有2k112^{k-1}-1个分裂点。然后根据分类特征与目标变量的相关性对类别进行重排序,即根据累加值(sum_gradient/sum_hessian)重新对(类别特征的)直方图进行排序,然后在排好序的直方图中寻找最好的分割点。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!