参考文章

深入理解LightGBM - 知乎,非常清晰详细,还有具体的案例,值得一看

ML-NLP/Machine Learning/3.4 LightGBM at master · NLP-LOVE/ML-NLP · GitHub

目录

1. LightGBM是什么

1.1 LightGBM提出的动机

1.2 XGBoost的缺点及LightGBM在哪些地方进行了优化

2.LightGBM原理

2.1 Histogram算法

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

2.3 直方图差加速

2.4 直接支持类别特征

3. LightGBM优点

4. 代码实现


1. LightGBM是什么

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

而LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。微软DMTK团队在GitHub上开源了性能超越其他boosting工具的LightGBM,在三天之内GitHub上被star了1000次,fork了200次。(请点击https://github.com/Microsoft/LightGBM)

LightGBM在Higgs数据集上LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,并且准确率也有提升。GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。

1.1 LightGBM提出的动机

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

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

1.2 XGBoost的缺点及LightGBM在哪些地方进行了优化

(1)XGBoost的缺点

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

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

(2)LightGBM的优化

为了避免上述XGBoost的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上进行了如下优化:

  • 基于Histogram的决策树算法。
  • 单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
  • 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
  • 带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
  • 直接支持类别特征(Categorical Feature)
  • 支持高效并行
  • Cache命中率优化

2.LightGBM原理

2.1 Histogram算法

直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数(其实又是分桶的思想,而这些桶称为bin,比如[0,0.1)→0, [0.1,0.3)→1),同时构造一个宽度为k的直方图。

在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

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

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

在XGBoost中,树是按层生长的,称为Level-wise tree growth,同一层的所有节点都做分裂,最后剪枝,如下图所示:

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

在Histogram算法之上,LightGBM进行进一步的优化。首先它抛弃了大多数GBDT工具使用的按层生长 (level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise)算法。

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

2.3 直方图差加速

LightGBM另一个优化是Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。

利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

2.4 直接支持类别特征

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

3. LightGBM优点

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

  • 更快的训练速度
  • 更低的内存消耗
  • 更好的准确率
  • 分布式支持,可以快速处理海量数据

4. 代码实现

为了演示LightGBM在Python中的用法,本代码以sklearn包中自带的鸢尾花数据集为例,用lightgbm算法实现鸢尾花种类的分类任务。

GitHub:点击进入

机器学习-集成学习-提升树-LightGBM相关推荐

  1. 机器学习-集成学习-提升树-Xgboost

    内容整理自:ML-NLP/Machine Learning/3.3 XGBoost at master · NLP-LOVE/ML-NLP · GitHub XGBoost--机器学习(理论+图解+安 ...

  2. 机器学习 集成学习篇——python实现Bagging和AdaBOOST算法

    机器学习 集成学习篇--python实现Bagging和AdaBOOST算法 摘要 Bagging算法 Adaboost算法 摘要 本文通过python实现了集成学习中的Bagging和AdaBOOS ...

  3. python3人工智能网盘_《Python3入门人工智能掌握机器学习+深度学习提升实战能力》百度云网盘资源分享下载[MP4/5.77GB]...

    内容简介 本资源为<Python3入门人工智能掌握机器学习+深度学习提升实战能力>百度云网盘资源分享下载,具体看下文目录,格式为MP4/5.77GB.本资源已做压缩包处理,请勿直接在百度网 ...

  4. 机器学习 - [集成学习]Bagging算法的编程实现

    机器学习 - [集成学习] Bagging算法的编程实现 李俊才 的 CSDN 博客:https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 ...

  5. 机器学习集成学习进阶LightGBM算法和案例

    目录 1 lightGBM 1.1 lightGBM演进过程 1.2 AdaBoost算法 1.3 GBDT算法以及优缺点 1.4 启发 2 什么是lightGBM 3 lightGBM原理 3.1 ...

  6. 机器学习-集成学习-梯度提升决策树(GBDT)

    目录 1. GBDT算法的过程 1.1 Boosting思想 1.2 GBDT原理 需要多少颗树 2. 梯度提升和梯度下降的区别和联系是什么? 3. GBDT的优点和局限性有哪些? 3.1 优点 3. ...

  7. 使用集成学习提升机器学习算法性能

    译者注:这篇文章是对 PythonWeekly 推荐的一篇讲集成模型的文章的翻译,原文为 Ensemble Learning to Improve Machine Learning Results,由 ...

  8. 机器学习集成学习算法

    目录 1 集成学习算法简介 1.1 什么是集成学习 1.2 机器学习的两个核心任务 1.3 集成学习中boosting和Bagging 1.4 小结 2 Bagging和随机森林 2.1 Baggin ...

  9. 【机器学习】梯度提升树(GBDT)的原理小结

    在集成学习之Adaboost算法原理小结中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting De ...

最新文章

  1. 透明物体分割学习笔记
  2. VTK:Texture之TextureCutQuadric
  3. Linux下载安装一个源码包
  4. 关于方程求根的解决方案
  5. java中equals函数所在的类,重写Java中的equals方法介绍
  6. Matcher类的简单使用
  7. java实现——客户端登录
  8. 软件质量模型(学习笔记)
  9. 在Makefile中进行宏定义-D
  10. Mac新手必装App推荐
  11. C语言数字雨--90行代码
  12. 贴片铝电容识别及型号_电路板上的贴片电容怎样核实它的型号及参数是多少
  13. 2021SC@SDUSC Zxing开源代码(十一)Data Matrix二维码(四)
  14. 汇编语言学习笔记--位运算(应该貌似简单点了吧,差点自己就信了,(:{ ))
  15. Java计算某年某月天数_编程计算某年某月某日是该年的第多少天。例如:2016年3月2日是2016的 第62 天。(java)...
  16. 连锁企业——屈臣氏的经营模式
  17. 联想如何打开计算机配置,联想电脑如何进入BIOS以及设置启动菜单
  18. 台式计算机碟片怎么安装,怎样用光盘从装台式电脑系统?
  19. 2022年暑期实习 PwC AC 普华永道信息技术 待遇+笔试+面试信息
  20. 逆水寒服务器维护到什么时候,逆水寒11月1日更新到什么时候_维护到几点

热门文章

  1. 《机器学习》 周志华学习笔记第二章 模型评估与选择(课后习题)
  2. nodejs mysql 增删改查_Nodejs操作MySQL-增删改查
  3. eclipse项目导出错误处理
  4. [雪峰磁针石博客]python网络基础工具书籍下载-持续更新
  5. HTML5前端知识分享:Vue入门
  6. 基于NFS实现lamp的负载均衡之二: 部署NFS服务器
  7. Hibernate连接mysql数据库并自动创建表
  8. iptables 防火墙的基本使用
  9. 真机运行报错:Could not change executable permissions on the application
  10. initialization of 'XXX' is skipped by 'case' label