引言

  GBDT已经有了比较成熟的应用,例如XGBoost和pGBRT,但是在特征维度很高数据量很大的时候依然不够快。一个主要的原因是,对于每个特征,他们都需要遍历每一条数据,对每一个可能的分割点去计算信息增益。为了解决这个问题,本文提出了两个新技术:Gradient-based One-Side Sampling(GOSS)和Exclusive Feature Bundling(EFB)。

Histogram-based Algorithm

  基于直方图的方法比基于预排序的方式要更加高效,这里对这个算法做一个简单的描述.算法的概要图如下所示:

  

  直方图优化算法需要在训练前预先把特征值转化为bin value,也就是对每个特征的取值做个分段函数,将所有样本在该特征上的取值划分到某一段(bin)中,最终把特征取值从连续值转化成了离散值.直观的示例如下所示:

  使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值.然后在计算上的代价也大幅降低,XGBoost预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k可以认为是常数,为分段的个数),这样计算的时间复杂度量可以从O(data x feature) 降低到O(k x feature)。

  当然,Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。

Gradient-based One-Side Sampling

  简而言之,GOSS保留了梯度较大的数据(这里有个理论,一般梯度比较大的数据是没有太训练好的,梯度小的数据是训练的差不多的),而从梯度较小的数据中随机抽样。为了补偿对数据分布的影响,在计算信息增益时,为梯度较小的数据引入一个常数.其在实现的过程中首先对梯度进行排序,然后选取其中top a×100%的实例,然后从剩下的实例中随机抽出b×100%,然后,在计算信息增益的时候,GOSS会将梯度小的那部分数据乘上$\frac{1-a}{b}$,起到一定程度弥补的作用.这样处理的话,在训练的过程中就可以把主要的时间放在没有太训练好的数据上了。算法流程图如下所示:

  

Exclusive Feature Bundling

  EFB主要的作用是减少特征的数量.高维度的数据通常是非常稀疏的,特征空间的稀疏性让我们可以设计一个几乎无损的方法去减少特征的数量。具体来说,在稀疏的特征空间中,许多特征是互斥的,它们从来不会同时取非零值。所以我们可以安全地将互斥特征捆绑到一个特征中(我们称之为exclusive feature bundle)。通过仔细地设计特征扫描算法,我们可以像独立特征一样给feat bundles建立feature histograms。这样做之后,histogram building的算法复杂度从O(data $\times$ feature)变为O(data $\times$ bundle), bundle << feature。这样,我们就可以在不降低acc的情况下显著地提高GBDT的训练速度.EFB主要有两个步骤,第一步是尽可能的将不怎么冲突的特征整合成一束;第二步是通过合并同一束中的特征来达到降低训练的时间复杂度的目的.

(1) 首先构建一个带权的图,边的权重指的是对应两个节点元素的冲突值(合并需要的代价),然后按照度降序的方式对特征进行排序.接着按照顺序遍历排序好的特征,对特征进行分配:要么在一个已经存在的feature bundle中,要么new一个feature bundle且该特征作为新feature bundle的第一个元素,算法流程如下所示:

  

(2) 这一步的关键要解决的问题是确保可以从合并之后的特征束中识别原始特征的值.使用基于直方图的的算法存储的是离散的值而不是连续的值,我们可以让独占特征驻留在不同的区间中来构建新的约束特征.可以通过添加offset的方式来实现这个想法.例如,我们有两个特征A以及B,特征A从[0,10]取值,B从[0,20]中取值,可以让B在原始取值的基础上加上一个10的偏移量,使得B从[10,30]中获取值.这样处理之后可以保证,A以及B合并的安全性.详细的流程如下所示:

  

扩展阅读:

(1) LightGBM的直方图做差加速

  一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后(父节点在上一轮就已经计算出来了),可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

(2) 带深度限制的Leaf-wise的叶子生长策略

  Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

  Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

  

(3) 直接支持类别特征(即不需要做one-hot编码)

  实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的one-hot编码特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的one-hot编码展开。并在决策树算法上增加了类别特征的决策规则。在Expo数据集上的实验,相比0/1展开的方法,训练速度可以加速8倍,并且精度一致。

  

引用:

[1] https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf

[2] https://www.cnblogs.com/jiangxinyang/p/9337094.html

[3] https://www.jianshu.com/p/0d32a8bfa511

[4] https://blog.csdn.net/anshuai_aw1/article/details/83040541

论文笔记:LightGBM: A Highly Efficient Gradient Boosting Decision Tree的更多相关文章

  1. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  2. GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法

    GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...

  3. GBDT(Gradient Boosting Decision Tree) 没有实现仅仅有原理

                阿弥陀佛.好久没写文章,实在是受不了了.特来填坑,近期实习了(ting)解(shuo)到(le)非常多工业界经常使用的算法.诸如GBDT,CRF,topic model的一些算 ...

  4. 梯度提升树 Gradient Boosting Decision Tree

    Adaboost + CART 用 CART 决策树来作为 Adaboost 的基础学习器 但是问题在于,需要把决策树改成能接收带权样本输入的版本.(need: weighted DTree(D, u ...

  5. Gradient Boosting Decision Tree

    GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类.当采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树,残差的意义如公式 ...

  6. 后端程序员之路 10、gbdt(Gradient Boosting Decision Tree)

    1.GbdtModelGNode,含fea_idx.val.left.right.missing(指向left或right之一,本身不分配空间)load,从model文件加载模型,xgboost输出的 ...

  7. Gradient Boost Decision Tree(&Treelink)

    http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1.      什么是Treelink Treelink是阿里集团内部 ...

  8. CART分类与回归树与GBDT(Gradient Boost Decision Tree)

    一.CART分类与回归树 资料转载: http://dataunion.org/5771.html        Classification And Regression Tree(CART)是决策 ...

  9. GBDT(Gradient Boost Decision Tree)

    原文:http://blog.csdn.net/aspirinvagrant/article/details/48415435 GBDT,全称Gradient Boosting Decision Tr ...

随机推荐

  1. ACM模板(转载)

    转载自:https://blog.csdn.net/f_zyj/article/details/51594851 创建自:https://blog.csdn.net/ZDL_0908/article/ ...

  2. Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 求有多少个子区间满足\(a_l,a_{l+1},\dots,a_r\)均不相同且\(max(a_l,a_{l+1},\dots,a_r)-(r ...

  3. drf框架 - 视图家族 | GenericAPIView | mixins | generics | viewsets

    视图家族 view:视图 generics:工具视图 mixins:视图工具集 viewsets:视图集 学习曲线: APIView => GenericAPIView => mixins ...

  4. 负载均衡环境:nginx + 2tomcat

    部署两个服务 安装两个tomcat,tomcat安装,参考:https://www.cnblogs.com/uncleyong/p/10742650.html 两个tomcat的端口要不一样(shut ...

  5. Code Chef May Challenge 2019题解

    传送门 \(REDONE\) 贡献可以拆成\(X(Y+1)+Y\),那么一个数\(x\)的贡献对最终答案的贡献就是\(x(a_1+1)(a_2+1)...\),那么最终答案肯定是\(\sum\limi ...

  6. 小学四则运算口算练习app---No.5

    今天主要设置答案页面,主要是出题页面和答案页面之间的传参问题以及答案页面的展示问题!这里运用数组讲出的题目包装成一个String类型数目(包括等号和使用者的作答) 讲正确答案单独包装成一个数组,以及相 ...

  7. 全面分析:APP中的消息功能设计

    一.定义 APP的“消息”模块,是通过APP或手机这个客户端,围绕某个产品的功能进行交流.沟通的重要方式.这种沟通,一方是运营人员或商家,也可以是产品或系统本身,为方便说明笔者这里姑且统一简称为B端, ...

  8. DS18B20温度获取

    https://detail.tmall.com/item.htm?id=40083203373&spm=a1z09.2.0.0.31cd2e8d1sb06V&_u=e1qf7bf56 ...

  9. nginx 配置参数优化

    nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求.以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务. worker进程 worker_proc ...

  10. React 获取真实Dom v8.6.2版本

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...