Light Gradient Boosting Machine (LightGBM)是一个由微软亚洲研究院分布式机器学习工具包(DMTK)团队开源的基于决策树算法的分布式梯度提升(Gradient Boosting Decision Tree,GBDT)框架。

  GBDT是机器学习中的一个非常流行并且有效的算法模型,它是一个基于决策树的梯度提升算法。在Kaggle比赛中,XGBoost等基于GBDT思想的算法有着非常好的表现,据统计Kaggle比赛中,50%以上的冠军方案都是基于GBDT算法。但是大训练样本和高维度特征的数据环境下,GBDT算法的性能以及准确性却面临了极大的挑战。为了解决这些问题,LightGBM应运而生,引用LightGBM官网对该框架的介绍,LightGBM具有以下特点:

  • 更快的训练速度和效率
  • 更低的内存使用
  • 更好的准确率
  • 支持并行化学习
  • 可以处理大规模数据

GBDT缺点

  GBDT是基于决策树的提升算法,采用前向分步算法求解模型参数,在每次迭代中,通过负梯度拟合残差,进而学习一颗决策树。在生成决策树的过程中,进行特征选择节点分裂时,需要对特征值进行排序,遍历所有可能的划分点,然后计算信息增益,从而选择出最优的分裂点。每轮迭代都会对整个训练集进行遍历,这样既耗费内存,也非常的耗时。

  对于该问题,比较常用的优化算法有预排序,就是对所有特征值优先排序,计算每个划分点的增益值,并且保存在内存中,在迭代的过程中通过查表的方式进行选择最优分裂点。XGBoost 算法已经提供了这种方式的优化,然而它在面对海量数据和特征维度很高的数据集时,算法的效率和扩展性很难让人满意。

LightGBM优化

  如果要对GBDT进行优化,有两个方面:

  1. 降低训练集的规模,很显然,这样可以减少计算量,提高算法的计算效率。
  2. 降低特征维度,这样的话,可以在选择分裂点的时候减少计算量,提高算法的性能。

但是直接减少训练集规模或者降低特征维度,很明显会牺牲模型的精确度。而LightGBM算法正是通过对模型训练时样本点的采样优化和选择分裂点时的特征维度的优化,在不牺牲精度的条件下,提高了训练速度。

1. 直方图算法(Histogram算法)

  LightGBM采用了基于直方图的算法将连续的特征值离散化成了K个整数,构造宽度为K的直方图,遍历训练数据,统计每个离散值在直方图中的累积统计量。在选取特征的分裂点的时候,只需要遍历排序直方图的离散值。使用直方图算法降低了算法的计算代价,XGBoost采用的预排序需要遍历每一个特征值,计算分裂增益,而直方图算法只需要计算K次,提高了寻找分裂点的效率;降低了算法的内存消耗,不需要存储预排序结果,只需要保存特征离散化后的值。

  但是特征值被离散化后,找到的并不是精确的分割点,会不会对学习的精度上造成影响呢?在实际的数据集上表明,离散化的分裂点对最终学习的精度影响并不大,甚至会更好一些。因为这里的决策树本身就是弱学习器,采用直方图离散化特征值反而会起到正则化的效果,提高算法的泛化能力。

2. 按叶子生长(leaf-wise)的算法

  大多数的决策树学习算法的树生成方式都是采用按层生长(level-wise)的策略。如下图所示:

  不同的是,LightGBM采用了一种更为高效的按叶子生长(leaf-wise)的策略。该策略每次从当前决策树所有的叶子节点中,找到分裂增益最大的一个叶子节点,然后分裂,如此循环往复。这样的机制,减少了对增益较低的叶子节点的分裂计算,减少了很多没必要的开销。与leve-wise的策略相比,在分裂次数相同的情况下,leaf-wise可以降低误差,得到更好的精度。Leaf-wise算法的缺点是可能会生成较深的决策树。因此,LightGBM在Leaf-wise上增加了限制最大深度的参数,在保证算法高效的同时,防止过拟合。

3. 单边梯度采样算法(Grandient-based One-Side Sampling,GOSS)

  LightGBM使用GOSS算法进行训练样本采样的优化。
  在AdaBoost算法中,采用了增加被错误分类的样本的权重来优化下一次迭代时对哪些样本进行重点训练。在GBDT算法中没有样本的权重,LightGBM算法采用了基于每个样本的梯度进行训练样本的优化:具有较大梯度的数据对计算信息增益的贡献比较大;当一个样本点的梯度很小,说明该样本的训练误差很小,即该样本已经被充分训练。然而在计算过程中,仅仅保留梯度较大的样本(例如:预设置一个阈值,或者保留最高若干百分位的梯度样本),抛弃梯度较小样本,会改变样本的分布并且降低学习的精度。GOSS算法的提出很好的解决了这个问题。

  GOSS算法的基本思想是首先对训练集数据根据梯度排序,预设一个比例,保留在所有样本中梯度高于该比例的数据样本;梯度低于该比例的数据样本不会直接丢弃,而是设置一个采样比例,从梯度较小的样本中按比例抽取样本。为了弥补对样本分布造成的影响,GOSS算法在计算信息增益时,会对较小梯度的数据集乘以一个系数,用来放大。这样,在计算信息增益时,算法可以更加关注“未被充分训练”的样本数据。具体的算法如下:

GOSS通过对较小的样本数据集估算增益,大大的减少了计算量。而且通过证明,GOSS算法不会过多的降低训练的精度。

4. Exclusive Feature Bundling 算法(EFB)

  LightGBM算法不仅通过GOSS算法对训练样本进行采样优化,也进行了特征抽取,以进一步优化模型的训练速度。但是这里的特征抽取与特征提取还不一样,并不减少训练时数据特征向量的维度,而是将互斥特征绑定在一起,从而减少特征维度。该算法的主要思想是:假设通常高维度的数据往往也是稀疏的,而且在稀疏的特征空间中,大量的特征是互斥的,也就是,它们不会同时取到非0值。 这样,可以安全的将互斥特征绑定在一起形成一个单一的特征包(称为Exclusive Feature Bundling)。

怎么判断哪些特征应该被绑定在一起呢?

  LightGBM将这个问题转化成为了图着色问题:给定一个无向图,所有的特征视为图G的顶点集合V,如果两个特征之间不是互斥,使用一个边将它们连接,E代表所有不是互斥特征之间边的集合。使用贪心算法解决该着色问题,结果会将互斥的特征放入相同的集合内(相同的颜色),每个集合即为一个特征包。实际上,有很多特征,虽然不是100%的互斥,但是基本上不会同时取到非0值,所以在LightGBM的算法中,会允许特征有一部分的冲突,这样可以生成更小的特征包集合,进一步减少计算时的特征规模,提高效率。假设变量K代表一个特征包内最大的冲突率,那么选用一个相对较小的值,算法可以在效率和精确度之间有更好的平衡。

  基于以上的思路,LightGBM设计了一个这样的算法(Greedy Bundling):首先,使用训练集的特征构建一个加权图,图的边的权重值为两个特征间的整体冲突。然后,根据图节点(特征)的度对特征进行降序排序。最后,检查每一个排列好的特征,将其在较小的冲突率下(值来控制)分配到一个已存在的特征包内,或者新创建一个特征包(这里判断是否新创建一个特征包,是由算法中的参数K来决定的,K代表了特征包内最大的冲突数)。这样生成特征包的处理只在训练前进行一次,因此,该复杂度在feature规模不是很大的情况下,是可以接受的。但是当训练集的特征规模达到百万级或者以上时,就无法忍受了。因此,为了进一步提高算法的效率,LightGBM采用了更加高效的不用构建图的排序策略:按非零值计数排序,因为更多的非零的特征值会导致更高的冲突概率。具体的算法流程如下图所示:

EFB算法如何绑定特征?

  上面解决了如何判断哪些特征要被绑定在一起,那么EFB算法如何绑定特征呢?如何既减少了特征维度,又保证原始的特征值可以在特征包中被识别出来呢?由于LightGBM是采用直方图算法减少对于寻找最佳分裂点的算法复杂度,直方图算法将特征值离散到若干个bin中。这里EFB算法为了保留特征,将bundle内不同的特征加上一个偏移常量,使不同特征的值分布到bundle的不同bin内。例如:特征A的取值范围为[0,10),特征B的原始取值范围为[0,20),对特征B的取值上加一个偏置常量10,将其取值范围变为[10,30),这样就可以将特征A和B绑定在一起了。具体的算法流程如下图所示:

  EFB算法可以将数据集中互斥的特征绑定在一起,形成低维的特征集合,能够有效的避免对0值特征的计算。实际上,在算法中,可以对每个特征建立一个记录非零值特征的表格。通过对表中数据的扫描,可以有效的降低创建直方图的时间复杂度。在LightGBM的算法中也确实使用了这种优化方式,当Bundle稀疏时,这个优化与EFB并不冲突。

使用LightGBM进行排序

Python: LightGBM用于排序


论文:LightGBM: A Highly Efficient Gradient Boosting Decision Tree
LightGBM算法初探
LightGBM(lgb)详解

LightGBM算法相关推荐

  1. R语言 lightgbm 算法优化:不平衡二分类问题(附代码)

    来源:大数据文摘本文约10000字,建议阅读10分钟本文以kaggle比赛的数据为例,为你讲解不平衡二分类问题的解决方法. 本案例使用的数据为kaggle中"Santander Custom ...

  2. R语言实战应用-lightgbm 算法优化:不平衡二分类问题(附代码)

    前言 本案例使用的数据为kaggle中"Santander Customer Satisfaction"比赛的数据.此案例为不平衡二分类问题,目标为最大化auc值(ROC曲线下方面 ...

  3. python机器学习案例系列教程——LightGBM算法

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python教程全解 安装 pip install li ...

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

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

  5. ML之FE:基于波士顿房价数据集利用LightGBM算法进行模型预测然后通过3σ原则法(计算残差标准差)寻找测试集中的异常值/异常样本

    ML之FE:基于波士顿房价数据集利用LightGBM算法进行模型预测然后通过3σ原则法(计算残差标准差)寻找测试集中的异常值/异常样本 目录 基于波士顿房价数据集利用LiR和LightGBM算法进行模 ...

  6. XGBoost与Light-GBM算法

    本文代码及数据集来自<Python大数据分析与机器学习商业案例实战> 一.XGBoost算法 XGBoost算法在某种程度上可以说是GBDT算法的改良版,两者在本质上都是利用了Boosti ...

  7. 关于LightGBM算法基本原理概述

    1 LightGBM算法基本原理 GBDT算法的基本思想是把上一轮的训练残差作为下一轮学习器训练的输入,即每一次的输入数据都依赖于上一次训练的输出结果.因此,这种训练迭代过程就需要多次对整个数据集进行 ...

  8. xgboost和lightgbm算法总结(从决策树到xgboost)

    目录 一.背景知识合集 1.决策树 1.1 ID3.0 1.1.1 思想 1.1.2 划分标准 1.1.3 优缺点 1.2 C4.5 1.2.1 思想 1.2.2 划分标准 1.2.3 优缺点 1.3 ...

  9. 基于LightGBM算法实现数据挖掘!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄雨龙,中国科学技术大学 对于回归问题,Datawhale已经梳理 ...

最新文章

  1. AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——15:00-15:40刘嘉教授《From Representation to Comp: the Cognitive N》
  2. websphere java和进程管理_jvisualvm/Jconsole监控WAS(WebSphere)中间件
  3. 系统、网络运维好帮手:expect
  4. 剑指offer 从上往下打印二叉树
  5. 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用
  6. 1.6_quick_sort_快速排序
  7. python进阶15变量作用域LEGB
  8. S32K116使用记录
  9. crt计算机图形系统是什么东西,计算机图形系统功能.PPT
  10. 台式计算机开关电源原理图,计算机开关电源基本结构及原理介绍
  11. 【Java】蓝桥杯历届试题PREV(一)
  12. linux怎么检测硬盘坏道,linux怎么检测硬盘坏道|linux 硬盘坏道检测方法
  13. 函数的连续性与间断点
  14. 推荐算法之AFM模型(注意力机制的引入)
  15. python表白女神
  16. mysql 3358端口_好用的MySQL抓包工具:sniffer-agent
  17. vs2022 c#调用interop.word 12.0版本也就是word2007实现首行缩进两个字符
  18. 【MATLAB】MATLAB 可视化之极坐标图
  19. 在PyCharm中导入和使用arcpy
  20. 【Front Plant Sci】AcMYB1与AcbHLH1相互作用从而调节“银皇后”植物中的花青素生物合成

热门文章

  1. 链接orientdb的图形数据库_文档数据库 OrientDB
  2. Python计算机视觉编程——第7章 图像搜索
  3. 百度经纬度坐标转换官方方法
  4. BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)
  5. 我们都已失去折腾的乐趣
  6. iOS开发逆向之应用重签名(下)
  7. 问题:关于贴友分类菜单的实现
  8. 犬类收容所人员将7只小狗当狗妈妈面摔死
  9. WakeLock finalized while still held
  10. springboot踩坑日记—nacos: Error watching Nacos Service change