LightGBM详细

目录

LightGBM

XGB的优缺点:

LightGBM原理

1.1 GBDT和 LightGBM对比

1.2 LightGBM 的动机

1.3 Xgboost 原理

1.4 LightGBM 优化

LightGBM算法原理:

直方图算法(Histgram)

带深度限制的Leaf-wise算法

单边梯度采样算法

互斥特征捆绑算法

LightGBM的优缺点:

速度:

内存:


LightGBM

GBDT是一个长久不衰的模型,他的思想是什么?

它的思想就是将多个弱分类器迭代训练得到最优的模型,训练效果好,不易过拟合等等的有点,那么XGB就是典型的一个GBDT的实现。

首先回顾一下XGB,它的核心思想就是说,是属于GBDT的一个延申,因此它的模型也是加法模型,由多个弱分类器相加的结果,那么在构成弱分类器的时候,首先需要对特征值进行预排序,然后便利所有的切分点,然后计算每个切分点的一个增益,最后找到最优的分裂点进行数据分裂成左右子树。

XGB的优缺点:

优点:

能够最精确的找到切分点,因为把所有的样本看一遍,都计算了一遍,肯定能找到最优的点。

缺点:

时间消耗比较大

  1. 算法中需要保存特征和特征值,还需要保存排序的结果。
  2. 在遍历每个划分点的时候,都需要进行增益的计算,因此消耗会比较大。

LightGBM原理


1.1 GBDT和 LightGBM对比


​ GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT 在工业界应用广泛,通常被用于点击率预测,搜索排序等任务。GBDT 也是各种数据挖掘竞赛的致命武器,据统计 Kaggle 上的比赛有一半以上的冠军方案都是基于 GBDT。

​ LightGBM (Light Gradient Boosting Machine)是一个实现 GBDT 算法的框架,支持高效率的并行训练,并且具有以下优点:

更快的训练速度
更低的内存消耗
更好的准确率
分布式支持,可以快速处理海量数据
​ 如下图,在 Higgs 数据集上 LightGBM 比 XGBoost 快将近 10 倍,内存占用率大约为 XGBoost 的1/6,并且准确率也有提升。

1.2 LightGBM 的动机


​ 常用的机器学习算法,例如神经网络等算法,都可以以 mini-batch 的方式训练,训练数据的大小不会受到内存限制。

​ 而 GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的 GBDT 算法是不能满足其需求的。

LightGBM 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。


1.3 Xgboost 原理


​ 目前已有的 GBDT 工具基本都是基于预排序的方法(pre-sorted)的决策树算法(如 xgboost)。这种构建决策树的算法基本思想是:   

首先,对所有特征都按照特征的数值进行预排序。   

其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。   

最后,找到一个特征的分割点后,将数据分裂成左右子节点。   

这样的预排序算法的优点是:能精确地找到分割点。   

缺点也很明显:   

首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。   

其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。

最后,对 cache 优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对 cache 进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的 cache miss。

1.4 LightGBM 优化


LightGBM 优化部分包含以下:

基于 Histogram 的决策树算法
带深度限制的 Leaf-wise 的叶子生长策略
直方图做差加速
直接支持类别特征(Categorical Feature)
Cache 命中率优化
基于直方图的稀疏特征优化
多线程优化。
​ 下面主要介绍 Histogram 算法、带深度限制的 Leaf-wise 的叶子生长策略和直方图做差加速。
 

其实LightGBM也是一个实现GBDT算法的框架,

那么LightGBM的特点?

它支持高效的并行训练,有着更快的训练速度,更低的内存消耗,更好的准确率,支持分布式,可以快速的处理海量的数据。

LightGBM算法原理:

  1. 直方图算法(Histgram)

思想:把连续的特征值离散化成K个整数,比如说0~1我们叫做1,1~2我们叫做3,。。。。。。等等,这样然后在对特征值里边的数据进行一个统计,这样是不是就得到了一个直方图,然后我们用直方图所对应的值来进行增益的分裂,将大规模的数据更新为箱子的值。

那么这样做的目的是什么?

  1. 我们知道离散值的特点有:储存方便,运算更快,鲁棒性更强,模型更加的稳定

对于直方图来说最直接优点是什么?

内存占用小,因为不需要保存原来的特征了,只需要保存直方图统计后的值,这个值一般情况下用8位的整型去储存就够了,但是在XGB中需要使用32位的浮点型储存。

计算代价小,在XGB中计算分裂增益的时候需要遍历每一个特征值然后计算一个增益,而在直方图的算法中只需要计算K次,时间复杂度直接由原来的feature变成了现在的k而我们知道data>>k

当然我们说这种方法值最好的嘛?他有什么样的缺点呢?

Histogram算法并不完美,由于特征被离散化后,找到的并不是一个准确的切分点,所以对结果会产生影响,但是我们发现到形成的最终的这个强学习器并不会差,有时候甚至更好,原因是什么?

原因就是说里边的每个模型本来就是弱学习器,分割点不精确并不是特别的重要,比较粗糙的分割点真好还能起到正则化的作用,可以有效的防止过拟合,虽然每棵树上的训练误差稍大,但是在总体的框架下并没有什么太大的影响。

怎么做的差?

假如说我有x个数据,然后我是可是可以构建出来一个k个桶的直方图,然后,我的左子节点上的数据由x1个数据,同样是不是也可以得到一个k个桶的直方图,那么我右子节点上是不是就有(x-x1)个样本数据,是不是就可以通过x的直方图减去x1的直方图。

带深度限制的Leaf-wise算法

XGB使用的是level-wise按层生长的策略,这种策略容易进行并行化处理,也好控制模型的复杂度,同时也可以防止过拟合,但是这种方式其实是很低效的,因为这种按层去分的话,每次构建其中的一层,但是实际上呢,速度是比较慢的,因为有的叶子节点的增益下降是比较慢的,也就是说在这一步没有必要将这个节点继续的进行划分,但是却以同样的权重去关注同一层的每个叶子节点显然是不合适的。去划分它显然是不合适的。

而LightGBM采用的是Leaf-wise的增长策略,就是说,每次都从所有的叶子节点中找出,增益最大的叶子节点去进行划分,这样的话是不是每次都可以下降最多的误差,得到更好的精度,但是缺点呢就是,可能会长出一颗比较深的树,然后导致了过拟合,但是LightGBM在Leaf-wise的基础上加上了一个最大深度的限制,在保证高效的同时还防止了过拟合。

单边梯度采样算法

GOSS算法,这个算法的思想就是,从减少样本的角度出发,排除大部分的小梯度的样本,仅仅用剩下的样本计算目标函数增益,它是一种在减少数据和保证精度上平衡的算法。

在GBDT中发现每个样本都有相应的梯度值,梯度小的样本,训练误差也小,说明该样本已经很好的被模型给学习到了,直接想法就是丢掉这一部分数据,但是直接丢掉的话,就会影响到数据的分布,从而导致影响模型的精度,因此为了解决这个问题,提出了GOSS算法。GOSS是一个采样的算法,目的是为了丢弃一些对计算信息增益没有用的样本,留下对计算有用的欧阳本,也说到了,梯度大的对计算增益是有帮助的,梯度小的样本是没有帮助的,但是在其中又不能直接的丢弃,那他是怎么做的?

首先它对于样本的梯度进行一个排序,比如说我设定一个阈值0.5那么梯度大于0.5的样本我全部留下,梯度小于0.5的我按照一定的比例去随机的采样,比如说我从里边抽取了1/3的样本。然后使用这样的数据进行训练。

互斥特征捆绑算法

数据通常都是高纬稀疏的数据,并且通常数据呢都是稀疏的,什么意思?比如说one-hot类型的数据,每一列都是0只有一个值是1,如果数据的维度太高的话会出现什么情况,模型复杂,计算繁琐,时间复杂度高,如果将数据的维度进行压缩一下,那么速度是不是也会由很大的提升,那么怎么去通过一种无损的压缩来很好的减少特征的数量呢?我们发现,数据一般都是互斥的,什么是互斥的,就像one-hot中很多特征全是0,只有一个是1,那么也就是说只要我任意的两个特征不同时为非0值,那么这两个特征都是互斥的,我们就可以把特们绑到一起去组合成一个新的特征,但是实际中不存在完全互斥的数据吧,那么怎么办,仍然是采用近似互斥的方法,也就是说,我们允许一些非互斥的存在,那么我们去衡量这个不互斥的情况就称作为冲突比率,当这个比率比较小是,就可以将两个特征进行捆绑,而不影响精度,那么怎么去衡量两个特征之间能不能捆绑呢?

它有这个衡量公式,r是每个绑定中的最大冲突比率,当r相对较小是,完成它们速度和精度之间的一个平衡。

LightGBM的优缺点:

优点:

从内存和速度两方面去考虑

  1. 速度:

LightGBM采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间的复杂度;

LightGBM在训练的过程当中采用了单边梯度算法过滤掉了梯度比较小的样本,减小了计算量

LightGBM采用了Leaf-wise算法的增长策略构建树,减小了很多不必要的计算量

LightGBM采用了特征并行,数据并行的方法加速计算,当数据量非常大的时候还可以采用投票并行的策略

LightGBM对缓存也进行了优化,增加了缓存命中率

  1. 内存:

通过直方图算法将原本的储存特征值,转变为了储存箱子的值,降低了内存的消耗

在训练过程当中,采用互斥特征捆绑算法,减少了特征数量,降低了内存的消耗

Lightgbm = xgboost + 直方图(减小了内存储存的消耗) + leaf wise(构建树提升速度) + 单边梯度下降(从减少数据量) + 互斥特征捆绑(从减少特征)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆有库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值