机器学习模型——LightGBM

LightGBM是一种优化的GBDT框架,通过直方图算法、按叶子生长策略、GOSS和EFB等技术,实现了更快的训练速度和更低的内存消耗。它支持并行训练,适用于处理大规模数据,同时具备良好的准确率。直方图算法虽可能导致不精确分割点,但在实际应用中影响不大。LightGBM的优缺点包括:速度快、内存小,但可能产生过拟合。
摘要由CSDN通过智能技术生成

  LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。
  GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。因此LightGBM提出的主要目的就是解决GBDT在海量数据时的问题,让GBDT可以更好更快地用于工业实践。

基本原理

一、直方图算法

  为每个特征构造一个直方图:将该特征的所有数据按值域划分为k个区间,k个区间对应直方图的k个箱子,每个区间内数据的量对应直方图每个箱子的高度,当然每个箱子实际存储的还有该箱子中数据的一阶导数和、二阶导数和等。
优点
  1.内存占用小,只需要保存特征离散化后的值
  2.计算代价更小:XGBoost的时间复杂度为O(样本数特征数),LightGBM的时间复杂度为O(k特征数)。
缺点:
  特征被离散化后,找到的不是精确的分割点。但大量的实验结果表明,离散化的分割点对最终的预测精度影响并不大,甚至有时候会更好一些,因为粗的分割点有正则化的效果,可以防止过拟合;

二、直方图做差加速

  一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。
  举个例子
  在这里插入图片描述
  如上图,假设有A、B、C三个特征,选择第一层特征节点时,我们统计了A、B、C三个特征的直方图,已知第一层以A的x1作为划分点可以得到最大的增益,x1对B的划分如红线所示。那么在计算第二层B特征的直方图时,只需要统计出B在≥x1侧的直方图,再与第一层的B直方图做差,即可得到<x1侧B的直方图。

三、带深度限制的按叶子生长(leaf-wise)策略

  大多数GBDT模型使用按层生长 (level-wise) 的决策树生长策略,即对一层的所有叶子节点进行分裂,但实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
  LightGBM使用带有深度限制的按叶子生长 (leaf-wise) 策略,该策略每次从当前所有叶子中找到分裂增益最大的一个叶子进行分裂。
优点
  在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;
缺点
  可能会长出比较深的决策树,产生过拟合。因此LightGBM在还做了一个最大深度的限制,在保证高效率的同时防止过拟合。

四、单边梯度采样算法(GOSS)

  我们知道,梯度小的样本,训练误差也比较小,说明数据已经被模型学习得很好了,简单的做法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。
流程
  对要进行分裂的特征的所有样本按照梯度绝对值降序排序,选取绝对值最大的a%个数据。然后在剩下的较小梯度数据中随机选择b%个数据。接着将这b%个数据乘以一个常数(1-a)/b,然后使用这(a+b)%个数据来计算信息增益。

小梯度样本为什么要乘一个常数?
  答案是为了还原数据分布,下面的图可以帮助理解,图中,a%为大梯度的样本,则小梯度样本有(1-a)%,然后再从(1-a)%的小梯度样本中随机取b%,即取到总样本的b/(1-a)%,为了还原数据分布,所以对小梯度样本乘上(1-a)/b。
  在这里插入图片描述
  分析一下,因为(1-a)≥b,所以(1-a)/b≥1,我们取了全部大梯度样本,只取了小梯度样本的部分,因此乘一个大于1的数,用数值来填补数量上的舍弃。

五、互斥特征捆绑算法(EFB)

把哪些特征绑在一起?

  1.构造一个加权无向图,顶点是特征,边有权重,其权重与两个特征间冲突相关;
  2.根据节点的度进行降序排序,度越大,与其它特征的冲突越大;
  3.遍历每个特征,将它分配给现有特征包,或者新建一个特征包,使得总体冲突最小。
  算法允许两两特征并不完全互斥来增加特征捆绑的数量,通过设置最大冲突比率r 来平衡算法的精度和效率。

什么叫互斥特征:简单的理解就是两个特征经常同时取0,同时取0的次数越多,说明冲突越小,越能进行捆绑。示例如下:
在这里插入图片描述在这里插入图片描述

怎么把特征绑为一捆?
  可以通过在特征值中加一个偏置常量来解决。比如,我们要绑定两个特征A和B,A特征的原始取值为区间[0,10),B特征的原始取值为区间[0,20),我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为[10,30),则绑定后的特征取值范围为 [0, 30)。

六、类别特征的处理

  one vs many方式的缺点:1.每次分裂带来的增益通常较少,因为每次仅仅从一大推信息中区分出那么一丁点信息;2.会造成树的深度过大,导致过拟合。
  LGBM采用了Many vs many的切分方式,可以直接输入类别特征并实现最优切分。
1.离散特征建立直方图的过程:
  统计该特征下每一种离散值出现的次数,并过滤掉出现次数较少的特征值, 然后为每一个特征值,建立一个bin容器。

2.计算分裂阈值的过程:

  • 如果bin容器的数量小于4,直接使用one vs other方式, 逐个扫描每一个bin容器,找出最佳分裂点;
  • 对于bin容器较多的情况, 先进行过滤,只让子集合较大的bin容器参加划分阈值计算,然后对符合条件的bin容器计算划分的信息增益。 但是有一点,不会搜索所有的bin容器,而是设定了一个搜索bin容器数量的上限值,默认值是32,可通过参数max_num_cat设置。
       LightGBM中对离散特征实行的是many vs many 策略,这32个bin中最优划分的阈值的左边或者右边所有的bin容器就是一个many集合,而其他的bin容器就是另一个many集合。

七、工程优化

  1.直接支持类别特征;
  2.支持高效并行:
    特征并行:垂直并行,各特征的最优划分点可以分摊到多台机器;
    数据并行:水平并行,数据可以水平划分到多台机器计算;
    投票并行:本地找出 Top K 特征,并基于投票筛选出可能是最优分割点的特征;合并时只合并每个机器选出来的特征。
  3.缓存命中率优化:
    所有的特征都采用相同的方式获得梯度,只需要对梯度进行排序即可实现连续访问,大大提高了缓存命中率;其次,因为不需要存储行索引到叶子索引的数组,降低了存储消耗,而且也不存在 Cache Miss的问题。

八、优缺点

优点
  1.速度更快
  LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;
  LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
  LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
  LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;
  LightGBM 对缓存也进行了优化,增加了缓存命中率;
  2.内存更小
  使用直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,极大的减少了内存消耗;
在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
缺点
  1.可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合;
  2.由于LightGBM是基于Boosting的算法,所以会对噪点较为敏感;
  3.在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值