推荐系统 之 LightGBM

        先声明:文章大部分内容出自这里 ,写这篇文章是想基于自己的理解再提炼一把,加深自己印象

        首先明确一点就是LightGBM是对XGBoost的一个改进,改进的方向是速度,速度真的快了好多,具体的操作是从以下几个角度进行优化的:

XGBoost的寻找分裂点复杂度 = 特征数量*分裂点数量*样本数量

        于是LightGBM就是从等式的右边进行优化的:Lightgbm里面的直方图算法就是为了减少分裂点的数量, Lightgbm里面的单边梯度抽样算法就是为了减少样本的数量, 而Lightgbm里面的互斥特征捆绑算法就是为了减少特征的数量。

1. 直方图算法(Histogram)

        直方图算法还是和XGBoost里面的近似算法比较接近的。具体操作就是:

        0. 先对特征值的大小进行从小到达的排序

        1. 把连续的浮点特征离散化为k个整数(也就是分桶bins的思想)比如0到0.1区间就划分到0,0.1到0.3就划分为1 

        2. 根据特征所在的bin对其进行梯度累加和个数统计,在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量。

        3. 当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。 

        具体例子就看下图:

        从上图可以看出,我们切分点考虑个数从7个变成了两个,这还只是其中一个特征,假如我们有超多特征,这个搜索时间一下子就会少了许多。

        看下面哪个表格,N_i 就是每个区间里面有多少个样本的个数了,所以一个特征就会对应一个特征图。拿到特征图之后,我们就开始做加速部分了,这里最关键的是作差。

        直方图作差加速 (这一节参考:文章 

              这里写得相当清楚了,当然不要眼瞎注意到里面有两个假设,一开始父结点用f1特征的b11桶进行分割,然后再假设左叶子里面f2特征里面三个桶的数量,通过这一点用减法得出右叶子的b11分桶后的数量以及f2特征三个桶的数量。

        下面的这样图也是引用作者文章的:写得太好了!

在这里插入图片描述

         当我们用直方图去寻找切分特征点的时候,其实这个算法就已经起一点正则化的效果了。为啥呢,因为桶的数量决定正则化的程度,当桶越少,就代表区分得越模糊,所以找到的切分点就越脱离实际情况,从而起到了正则化的作用。

        这里要和XGBoost做一次比较,为什么这个直方图就比Weight Quantile Sketch(WQS)快起来了。这是因为WQS用的是当前情况loss的二阶导进行划分,所以一但做了新的划分,那么loss就会更改,于是这个hi就会发生改变。换句话说XGBoost每一层都要计算一次loss的二阶导。但是反观LightGBM,其实他就是对特征区域做一个桶分类而已,不管怎么划分,样本数量还是恒定不变的。所以我们可以用减法来获取另一半的数目分布。

2. 单边梯度抽样算法(GOSS)

        这个算法的主要目的是要减少样本,在保证样本数目分布的不变的情况下,丢掉一些没有用的样本。

        所以这就引出了两个问题,怎样的样本是认为没用的?怎么保证样本数目的分布?

        因为LightGBM还是基于XGBoost做的一个提升,所以他还是基于缩小残差的方法去做提升,这一点和GBDT是一样的。我们现在来看GBDT,在GBDT里面每一个样本都会有不同的梯度,也就是说残差不一样, 即梯度小的样本,训练误差也比较小,说明数据已经被模型学习的很好了。 在训练新模型的过程中,梯度比较小的样本对于降低残差的作用效果不是太大,所以我们可以关注梯度高的样本,这样不就减少计算量了吗?(相当于梯度反映出样本的权重,这比AdaBoost高级多了)

       于是GOSS算法开始干活了,保留了梯度大的样本,并对梯度小的样本进行随机抽样,为了不改变样本的数目的分布,要引入一个小东西去保持分布的平衡,流程如下:

        0. 根据样本的一阶导对样本进行从大到小的排序。

        1. 然后保留前百分之a的梯度大的样本,以及取完剩下样本的百分之b作为梯度小的样本,在去梯度小的样本的时候注意是做随机抽样的。

        2. 小东西出场了,后面这个百分之b的样本要乘上一个系数\frac{1-a}{b},这么做的主要目的就是将更多的注意力放在梯度比较大的样本上(还没学太会),其次是为了防止随机抽样造成样本的分布发生改变。

在这里插入图片描述

 图里面就包含了0-1的两部操作了,接下里我们计算小东西(现在是6,7,4,2入围了)

在这里插入图片描述

        所以整个流程是:我们先按照之前的bins继续划分,然后根据一阶导去排序选出前a个以及随机选出后b个,然后剩下得咱们就不要了。然后计算小东西,每一个bins有多少个梯度小的(后b个)就要加上多少个小东西,就像这个例子:bin2里面有一个4,bin1里面有一个2,那么对应的一阶导二阶导都是要乘上这个小东西。

        梯度小的样本乘上相应的权重之后,我们在基于采样样本的估计直方图中可以发现Ni的总个数依然是8个, 虽然6个梯度小的样本中去掉了4个,留下了两个。 但是这2个样本在梯度上和个数上都进行了3倍的放大,所以可以防止采样对原数数据分布造成太大的影响, 这也就是论文里面说的将更多的注意力放在训练不足的样本上的原因。


3. 互斥特征捆绑算法(EFB)

        这个算法的核心思想就是想给数据进行降维了,最后一个啦!加油

        这里其实就是在找每一个特征向量,上面这么多位置,找一下每一个位置是否有对应冲突,一个图其实就可以很好说明:

在这里插入图片描述

         这其实一看图就已经知道在干嘛了,非常清楚,最终这四个特征都合成一个特征了,通过一些规则去进行特征的融合绑定,这样一来就降低了特征数量了。下面就来细说那些特征值应该绑在一起,以及特征绑在一起后,特征值怎么做区分,怎么确定哪些数值是自己的。

        首先解决第一个问题:就是按照什么规则做绑定

        1. 首先将所有的特征看成图的各个顶点,将不相互独立的特征用一条边连起来,边的权重就是两个相连接的特征的总冲突值(也就是这两个特征上同时不为0的样本个数)
        2. 然后按照节点的度对特征降序排序, 度越大,说明与其他特征的冲突越大
        3. 对于每一个特征, 遍历已有的特征簇,如果发现该特征加入到特征簇中的矛盾数不超过某一个阈值,则将该特征加入到该簇中。 如果该特征不能加入任何一个已有的特征簇,则新建一个簇,将该特征加入到新建的簇中

        然后解决第二个问题:怎么分离出自己的特征

        我们把特征A和B绑定到了同一个bundle里面, A特征的原始取值区间[0,10), B特征原始取值区间[0,20), 这样如果直接绑定,那么会发现我从bundle里面取出一个值5, 就分不出这个5到底是来自特征A还是特征B了。 所以我们可以再B特征的取值上加一个常量10转换为[10, 30),这样绑定好的特征取值就是[0,30), 我如果再从bundle里面取出5, 就一下子知道这个是来自特征A的。 这样就可以放心的融合特征A和特征B了。

        看下图:

在这里插入图片描述        我自己的理解就是关于融合后的特征做区分,不同特征理应对应不同的区间映射,如果有重复的部分,就对其中一个特征进行平移来实现区分的目的。

        这样一来,就可以通过这个手段来减少很多特征数量了,其实有点点像PCA。但不是数学形式上相似,只是说思想相似(都在做降维)。

        好了至此已经将大头部分理完了一遍了。通过三个方向,划分点,样本数量,特征数进行一个精简。

        下面就讲 LightGBM的生长策略

4. LightGBM的生长策略(Leaf-wise)

        我们首先看XGBoost的策略,他是用Level-wise

        该策略遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。

        但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂,因此带来了很多没必要的计算开销(一层一层的走,不管它效果到底好不好)

在这里插入图片描述

 

        于是Leaf-wise就出来了,也是LightGBM的生长策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。

        因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度。

        Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。 

在这里插入图片描述

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值