高效 遍历 算法_LightGBM算法介绍(上)

本专题课程目录

第一节

LightGBM算法介绍(上)---LightGBM算法基本原理

第二节

LightGBM算法介绍(中)---LightGBM代码、参数调节以及那些年我们踩过的坑

第三节

LightGBM算法介绍(下)---LightGBM案例“一种网络信号预测方法”

df2fe754b0ae73fdd137d43102a5a4e2.png

LightGBM算法基本原理

01  GBDT和LightGBM对比

02  LightGBM的动机

03  LightGBM优化

04  Xgboost原理

05  其他注意

01

GBDT和 LightGBM对比

GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一个经典机器学习模型,它的核心思想是通过弱分类器迭代训练来获得最优的模型。目前GBDT在工业界有着非常广泛的应用,例如网站访问率预测、搜索排行等等;此外,GBDT也是各类数据挖掘大赛的致胜武器;据统计,在Kaggle上的比赛中有一半以上的冠军项目方案都基于GBDT模型。

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

* 训练速度更快 *

* 内存消耗更低 *

* 分布式支持准确率更高 *

* 海量数据速度很快 *

通过Higgs数据集测试,LightGBM比XGBoost速度快了约10倍,内存占用大大降低(约为XGBoost的1/6),此外LightGBM算法的准确率也有提高。

5db99dfaba3942b3939ce571ad6b0d45.png

5d1595d97d6598d5330786ea5ec8752f.png

004b445ab5cf6241c22f6a35a63b0370.png

02

LightGBM的动机

常用的机器学习算法,例如神经网络等算法,都可以以 mini-batch 的方式训练,训练数据的大小不会受到内存限制。而 GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的 GBDT 算法是不能满足其需求的。LightGBM 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。

03

LightGBM 优化

LightGBM优化部分包含以下:

* 基于Histogram(直方图)的决策树算法 *

* 具有深度限制的Leaf-wise叶子生长策略 *

* 直方图作差加速 *

* 直接支持类别特征(CategoricalFeature) *

* 优化Cache命中率 *

* 稀疏特征优化 *

* 多线程优化 *

289faad53fa5507452a1c340be07b044.png

1.3.1 Histogram 算法

6875a285f2a1811820e488ac12cfcbbd.png

Histogram(直方图)算法的主要思想是,先把连续的浮点特征值离散化,构成k个整数,构造一个宽度为k的直方图。在遍历数据时,将离散化后的值作为索引,在直方图中累积统计量,当遍历完一遍数据后,直方图累积了需要的统计量,然后根据直方图的离散值寻找最优分割点。

60d6b8830a92b01fb58062bedf2f745c.png

使用Histogram算法有很多优点,首先是内存消耗降低:该算法不需要额外存储预排序的结果,可以只保存特征离散化后的值,这个值一般用8位整型存储就足够了,因此内存消耗能够降为原先的1/8。

3b37e4bd96457213159549595c4b8778.png

然后是计算资源大幅降低:预排序算法每遍历一个特征值,需要计算一次分裂的增益,而直方图算法只需要计算k次(k为常数),算法的时间复杂度从O(#data#feature)降低到O(k#features)。

当然了,直方图算法并非是完美的。在特征离散化后,找到的不再是很精确的分割点,会对结果产生影响。然而,在不同数据集上的测试结果显示,离散化分割点对最终精度影响也不是很大,有时候甚至会好一些。其原因是,决策树属于弱模型,分割点是否十分精确并不是特别重要;粗略一点的分割点也有正则化的效果,可以防止过拟合。尽管单棵树的训练误差会比精确分割算法大一点,但是在梯度提升框架下对于整体结果不会造成太大影响。

289faad53fa5507452a1c340be07b044.png

1.3.2 带深度限制的 Leaf-wise 的叶子生长策略

6875a285f2a1811820e488ac12cfcbbd.png

在直方图算法基础上,LightGBM做了进一步优化。首先,它抛弃了大多数GBDT使用的按层生长的决策树生长策略,而使用了带有深度限制的按叶子生长算法。按层生长过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。然而,实际上按层生长是一种低效的算法,它不加区分的对待同一层的叶子会带来很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要搜索和分裂。

b01736b2e8ab1929b296597fbf087a4f.png

按叶子生长是一种更高效一些的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同按层生长相比,在分裂次数相同的情况下按照叶子生长能减少更多误差,得到更高精度。但是,按叶子生长也存在一个缺点,就是它可能会长出比较深的决策树,造成过拟合。因此 LightGBM 在按照叶子生长的基础上增加了最大深度限制,在保证高效率的同时防止过拟合。

820c322492f44f94d6077162cdf5f968.png

289faad53fa5507452a1c340be07b044.png

1.3.3 直方图加速

6875a285f2a1811820e488ac12cfcbbd.png

LightGBM另一个优化是通过直方图算法作差加速。容易观察到,一个叶子的直方图可以通过其父节点直方图与它兄弟的直方图作差获得。一般构造直方图,需要遍历叶子上所有数据,但直方图作差只需遍历直方图的k个桶。通过该方法,LightGBM可以在构造一个叶子直方图后,用很微小的代价获得其兄弟叶子直方图,其速度能够提升约一倍。

87f64a9be8e825f6cc37da3d5876529d.png

289faad53fa5507452a1c340be07b044.png

1.3.4 直接支持类别特征

6875a285f2a1811820e488ac12cfcbbd.png

实际上,大多机器学习方法无法直接支持类别特征,一般会把类别特征转化成多维01特征,但是类别特征是在实际应用经常会用到的。出于这样考虑,LightGBM对类别特征的支持进行了优化,它不需要作额外的01展开只需直接输入类别特征。并且,在决策树算法上增加类别特征的决策规则。通过在Expo数据集上进行实验,LightGBM方法速度相比01展开的方法提高了约8倍,并且精度不会有任何降低。

LightGBM的单机版本还有很多其他细节上的优化,比如cache访问优化,多线程优化,稀疏特征优化等等。优化汇总如下:       1438da792daaa0bb8b6a8e384a599c0d.png 289faad53fa5507452a1c340be07b044.png

1.3.5 LightGBM并行优化

6875a285f2a1811820e488ac12cfcbbd.png

LightGBM还具有支持高效并行的优点。LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。

(1)特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。

(2)数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。

LightGBM针对这两种并行方法都做了优化:在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。

4e9488ce4ea252895cbb48f23c03da99.png

7c8c0a7aec445bad906cea598a84c8f5.png

26f26051c2a3b1a7a5493de841f5a633.png

033051602279e5c5e2e9b45ed098e606.png

04

Xgboost 原理

目前已有的 GBDT 工具基本都是基于预排序的方法(pre-sorted)的决策树算法(如 xgboost)。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。最后,找到一个特征的分割点后,将数据分裂成左右子节点。

这样的预排序算法的优点是:能精确地找到分割点。缺点也很明显:首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。最后,对 cache 优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对 cache 进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的 cache miss。

033051602279e5c5e2e9b45ed098e606.png

05

其他注意

* 当生长相同的叶子时,Leaf-wise比 level-wise 减少更多的损失。

* 高速、高效处理大数据,运行时需要更低的内存支持。

* GPU 不要在少量数据上使用,会过拟合,建议10000+ 行记录时使用。

033051602279e5c5e2e9b45ed098e606.png 91e457019d3a109b1f14e8aea2b71f3b.png

* 下期将为大家介绍lightGBM算法的代码、参数调节以及那些年我们踩过的坑 *


本篇内容部分参考公众号微软研究院AI头条《开源|LightGBM:三天内收获GitHub 1000+ 星》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值