【机器学习】深入理解LightGBM

news2024/11/15 8:38:18

在这里插入图片描述

目录:深入理解LightGBM

  • 一、LightGBM简介
  • 二、LightGBM提出的动机
  • 三、 XGBoost的缺点及LightGBM的优化
    • 3.1 XGBoost的缺点
    • 3.2 LightGBM的优化
  • 四、 LightGBM的基本原理
    • 4.1 基于Histogram的决策树算法
      • 4.1.1 直方图算法
      • 4.1.2 直方图做差加速
    • 4.2 带深度限制的 Leaf-wise 算法
    • 4.3 单边梯度采样算法
    • 4.4 互斥特征捆绑算法
      • 4.4.1 解决哪些特征应该绑在一起
      • 4.4.2 解决怎么把特征绑为一捆
  • 五、 LightGBM的工程优化
    • 5.1 直接支持类别特征
    • 5.2 支持高效并行
      • 5.2.1 特征并行
      • 5.2.2 数据并行
      • 5.2.3 投票并行
      • 5.2.4 Cache命中率优化
  • 六、LightGBM的优缺点
    • 6.1 优点
      • 6.1.1 速度更快
      • 6.1.2 内存更小
    • 6.2 缺点

一、LightGBM简介

GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。

GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务。

在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。

而LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。

二、LightGBM提出的动机

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

而GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。

如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。

尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。

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

三、 XGBoost的缺点及LightGBM的优化

3.1 XGBoost的缺点

在LightGBM提出之前,最有名的GBDT工具就是XGBoost了,它是基于预排序方法的决策树算法。

这种构建决策树的算法基本思想是:

  • 首先,对所有特征都按照特征的数值进行预排序。
  • 其次,在遍历分割点的时候用 O O O(#data)的代价找到一个特征上的最好分割点。
  • 最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。

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

但是缺点也很明显:

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

3.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命中率优化

四、 LightGBM的基本原理

4.1 基于Histogram的决策树算法

4.1.1 直方图算法

Histogram algorithm应该翻译为直方图算法,直方图算法的基本思想是:

  • 先把连续的浮点特征值离散化成 k k k个整数,同时构造一个宽度为 k k k的直方图。
  • 在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

在这里插入图片描述

直方图算法简单理解为:首先确定对于每一个特征需要多少个箱子(bin)并为每一个箱子分配一个整数;然后将浮点数的范围均分成若干区间,区间个数与箱子个数相等,将属于该箱子的样本数据更新为箱子的值;最后用直方图(#bins)表示。看起来很高大上,其实就是直方图统计,将大规模的数据放在了直方图中。

我们知道特征离散化具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等。对于直方图算法来说最直接的有以下两个优点:

  • 内存占用更小

直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的 1 8 \frac{1}{8} 81,也就是说XGBoost需要用32位的浮点数去存储特征值,并用32位的整形去存储索引,而 LightGBM只需要用8位去存储直方图,内存相当于减少为 1 8 \frac{1}{8} 81

在这里插入图片描述

  • 计算代价更小

预排序算法XGBoost每遍历一个特征值就需要计算一次分裂的增益,而直方图算法LightGBM只需要计算 k k k次,直接将时间复杂度从:

在这里插入图片描述

降低到:
在这里插入图片描述
而我们知道 d a t a > > k data>>k data>>k

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

4.1.2 直方图做差加速

LightGBM另一个优化是Histogram(直方图)做差加速。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。通常构造直方图时,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。

在这里插入图片描述
注意: XGBoost 在进行预排序时只考虑非零值进行加速,而 LightGBM 也采用类似策略:只用非零特征构建直方图。

4.2 带深度限制的 Leaf-wise 算法

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

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

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

在这里插入图片描述

4.3 单边梯度采样算法

Gradient-based One-Side Sampling 应该被翻译为单边梯度采样(GOSS)。GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。

AdaBoost中,样本权重是数据重要性的指标。然而在GBDT中没有原始样本权重,不能应用权重采样。幸运的是,我们观察到GBDT中每个数据都有不同的梯度值,对采样十分有用。即梯度小的样本,训练误差也比较小,说明数据已经被模型学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。

在这里插入图片描述
在这里插入图片描述

4.4 互斥特征捆绑算法

在这里插入图片描述
针对这种想法,我们会遇到两个问题:

  • 怎么判定哪些特征应该绑在一起(build bundled)?
  • 怎么把特征绑为一个(merge feature)?

4.4.1 解决哪些特征应该绑在一起

在这里插入图片描述

  • 构造一个加权无向图,顶点是特征,边有权重,其权重与两个特征间冲突相关;
  • 根据节点的度进行降序排序,度越大,与其它特征的冲突越大;
  • 遍历每个特征,将它分配给现有特征包,或者新建一个特征包,使得总体冲突最小。

算法允许两两特征并不完全互斥来增加特征捆绑的数量,通过设置最大冲突比率 r r r来平衡算法的精度和效率。EFB 算法的伪代码如下所示:
在这里插入图片描述

在这里插入图片描述

4.4.2 解决怎么把特征绑为一捆

特征合并算法,其关键在于原始特征能从合并的特征中分离出来。绑定几个特征在同一个bundle里需要保证绑定前的原始特征的值可以在bundle中识别,考虑到histogram-based算法将连续的值保存为离散的bins,我们可以使得不同特征的值分到bundle中的不同bin(箱子)中,这可以通过在特征值中加一个偏置常量来解决。比如,我们在bundle中绑定了两个特征A和B,A特征的原始取值为区间 [ 0 , 10 ) [0,10) [0,10),B特征的原始取值为区间 [ 0 , 20 ) [0,20) [0,20),我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为 [ 0 , 30 ) [0,30) [0,30),绑定后的特征取值范围为 [ 0 , 30 ) [0,30) [0,30),这样就可以放心的融合特征A和B了。具体的特征合并算法如下所示:
在这里插入图片描述
在这里插入图片描述

五、 LightGBM的工程优化

5.1 直接支持类别特征

实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,通过 one-hot 编码,转化到多维的0/1特征,降低了空间和时间的效率。但我们知道对于决策树来说并不推荐使用 one-hot 编码,尤其当类别特征中类别个数很多的情况下,会存在以下问题:

  • 会产生样本切分不平衡问题,导致切分增益非常小(即浪费了这个特征)。使用 one-hot编码,意味着在每一个决策节点上只能使用one vs rest(例如是不是狗,是不是猫等)的切分方式。例如,动物类别切分后,会产生是否狗,是否猫等一系列特征,这一系列特征上只有少量样本为1,大量样本为0,这时候切分样本会产生不平衡,这意味着切分增益也会很小。较小的那个切分样本集,它占总样本的比例太小,无论增益多大,乘以该比例之后几乎可以忽略;较大的那个拆分样本集,它几乎就是原始的样本集,增益几乎为零。比较直观的理解就是不平衡的切分和不切分没有区别。
  • 会影响决策树的学习。因为就算可以对这个类别特征进行切分,独热编码也会把数据切分到很多零散的小空间上,如下图左边所示。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习效果会变差。但如果使用下图右边的切分方法,数据会被切分到两个比较大的空间,进一步的学习也会更好。下图右边叶子节点的含义是 X = A X=A X=A或者 X = C X=C X=C放到左孩子,其余放到右孩子。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2 支持高效并行

5.2.1 特征并行

特征并行的主要思想是不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。XGBoost使用的就是这种特征并行方法。这种特征并行方法有个很大的缺点:就是对数据进行垂直划分,每台机器所含数据不同,然后使用不同机器找到不同特征的最优分裂点,划分结果需要通过通信告知每台机器,增加了额外的复杂度。

LightGBM 则不进行数据垂直划分,而是在每台机器上保存全部训练数据,在得到最佳划分方案后可在本地执行划分而减少了不必要的通信。具体过程如下图所示。
在这里插入图片描述

5.2.2 数据并行

在这里插入图片描述
LightGBM在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。具体过程如下图所示。

在这里插入图片描述

5.2.3 投票并行

基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行的方式只合并部分特征的直方图从而达到降低通信量的目的,可以得到非常好的加速效果。具体过程如下图所示。

大致步骤为两步:

  • 本地找出 Top K 特征,并基于投票筛选出可能是最优分割点的特征;
  • 合并时只合并每个机器选出来的特征。

在这里插入图片描述

5.2.4 Cache命中率优化

XGBoost对cache优化不友好,如下图所示。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。为了解决缓存命中率低的问题,XGBoost 提出了缓存访问算法进行改进。

在这里插入图片描述

而 LightGBM 所使用直方图算法对 Cache 天生友好:

  • 首先,所有的特征都采用相同的方式获得梯度(区别于XGBoost的不同特征通过不同的索引获得梯度),只需要对梯度进行排序并可实现连续访问,大大提高了缓存命中率;
  • 其次,因为不需要存储行索引到叶子索引的数组,降低了存储消耗,而且也不存在 Cache Miss的问题。

在这里插入图片描述

六、LightGBM的优缺点

6.1 优点

这部分主要总结下 LightGBM 相对于 XGBoost 的优点,从内存和速度两方面进行介绍。

6.1.1 速度更快

  • LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;
  • LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
  • LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
  • LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;
  • LightGBM 对缓存也进行了优化,增加了缓存命中率;

6.1.2 内存更小

在这里插入图片描述

6.2 缺点

  • 可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合;
  • Boosting族是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,模型的偏差(bias)会不断降低。由于LightGBM是基于偏差的算法,所以会对噪点较为敏感;
  • 在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

把连续学习的思路用在基于图像的相机定位问题中( ICCV 2021)

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 点击进入—>3D视觉工坊学习交流群 Continual Learning for Image-Based Camera Localization(2021 ICCV顶会文章) 代码地址:https://github.com/AaltoVision/CL_HSCNet 主要内容: 论文探讨了将连续学习用在视觉定…

Nexus迁移到阿里云效packages

点击右上角sign in登录按钮,登录到nexus中 登录后,会出现设置按钮,如图 点击设置按钮,点击左侧的system,点击API,即可打开restFul接口界面 点击打开 Components 组,找到 /v1/components 接…

【cmake】利用ExternalProject_Add解决第三方库target命名冲突问题

参考 cmake菜谱第八章第一节 我们经常会遇到这种情况: project A 是最外层项目 project B 是A使用的外部库 project C 是A和B使用的外部库 . ├── extern │ ├── B │ │ ├── extern │ │ │ └── C │ │ └── src │ └── C …

JVM本地锁(二)ReentrantLock可重入锁源码解析

什么是可重入锁呢 顾名思义,就是可以重复进入的锁,学过操作系统或者计组的可参照理解pv,或者多重中断。 demo1(){lock(); //第一次锁demo2(){lock(); // 第二次锁unlock(); }unlock();}文章目录ReentrantLocklock 加锁1. ReentrantLock.lock…

1990-2022年6月上市公司高管信息数据

1990-2022年6月上市公司高管信息数据、董监高信息数据 1、时间:1990-2022年6月 2、指标:证券代码、统计截止日期、人员ID、姓名、国籍、籍贯、籍贯所在地区代码、出生地、出生地所在地区代码、性别、年龄、毕业院校、学历、专业、职称、个人简历、是否…

给数组创建视图(浅拷贝)修改视图值影响原数组值修改视图形状不影响原数组形状numpy.view()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 给数组创建视图(浅拷贝) 修改视图值影响原数组值 修改视图形状不影响原数组形状 numpy.view() 对于以下python代码表述错误的一项是? import numpy as np import nu…

代码随想录二刷day5 两数之和 四数相加 (三数之和 四数之和) ->多写几遍(解法双指针放缩)

二刷复习 文章目录二刷复习哈希表和哈希法unordered 和 ordered 的不同242.有效字母的异位词349.两个数组的交集202.快乐数两数之和四数相加2383.赎金信三数之和(这道题需要重复做, 双指针)四数之和哈希表和哈希法 哈希表:这是两…

BGP建邻实验

目录 1.拓扑图 2.要求 3.实验思路 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.要求 每台路由器都有两个环回,一个24的环回,一个32的环回;32的环回用于建邻,24的环回用于用户网段,最终实现所有24的环回可以ping通即…

BeyondCorp 打造得物零信任安全架构

1. 背景 当前,大部分企业都使用防火墙 (firewall) 来加强网络边界安全。然而,这种安全模型是有缺陷,因为当该边界被破坏,攻击者可以相对容易地访问公司的特权内部网。 边界安全模型通常被比作中世纪城堡:城墙厚厚的堡…

Mysql 报“Finished with error”,该怎么及解决?

用了多年的Mysql,当用navicat导库时,偶尔会遇到“Finished with error”错误, 如下图: 下面是我结合工作经验,总结一下,将相应情况及解决方法提供给网友们: 情况1:导入的sql数据库脚本文件中日…

vue3 antd项目实战——Form表单的重置【使用resetFields()重置form表单数据】

vue3 ant design vue项目实战——Form表单【resetFields重置form表单数据】关于form表单的文章场景复现resetFields()重置表单数据项目实战关于form表单的文章 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.2014.3001…

剑指offer----C语言版----第五天

目录 1. 重建二叉树 1.1 题目描述 1.2 复习基础知识 1.3 思路分析 1.4 总结 1. 重建二叉树 原题链接: 剑指 Offer 07. 重建二叉树 - 力扣(LeetCode)https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/submissions/ 1.1 题目描述…

极简四则运算解释器

前言: 这是最近完成的一个小的 demo,一个极简四则运算解释器。前面,已经基于这个想法发了两篇博客了: 四则运算和二叉树 简单四则运算语法树可视化 然后,前两天也就完成了这个总体的 demo 程序。本来整个程序的思路大致上有了&…

前端框架 Nuxt3 集成axios 配置跨域

目录 一、安装axios 二、Nuxt3项目集成axios 1、项目根目录下创建server/api目录 2、调用封装的单例axios对象 3、页面中调用请求函数 刚开始通过Nuxt3使用axios时,以为axios还需要配置跨域,但经过多次测试发现,在Nuxt3框架里并不需要配…

磨金石教育摄影技能干货分享|胡杨为什么被新疆人奉为精神图腾

痴迷于胡杨的摄影家 新疆摄影师王汉冰,昨天我们介绍了他一张《沙狐之眼.》,天人合一的画面让我们感到震撼。 除此之外王汉冰还有一个称号那就是“胡杨王”。 意思很明确,那就是擅长拍摄胡杨,作品也多是以胡杨见长。 新疆地大物博&…

【OpenCV 例程 300篇】253. 多帧图像(动图)的读取与保存

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】253. 多帧图像(动图)的读取与保存 1. 多帧图像(动图) 多帧图像是将多幅图像或帧数据保存在单个文件中,也称为多页图像或图像序列&#xf…

eNSP 实现静态路由中的路由备份

eNSP 实现静态路由中的路由备份 eNSP 实现静态路由中的路由备份;路由备份功能,可以提高网络的可靠性。用户可以根据实际情况,配置到同一目的地的多条路由,其中一条路由的优先级最高,作为主路由,其余的路由…

06 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题

前言 问题是这样的 之前 同事碰到了这样的一个问题, 说是基于 ftp 客户端更新文件名字 更新失败 然后 看了一下, 原来是 调用了 retrieveFileStream, 然后 没有同步等待 数据传输完成, 然后 之后直接调用了 rename 的方法 然后 发现 rename 返回的是 false, 并且 文件名…

看我今年奋斗,观我未来之路

看我今年奋斗,观我未来之路 。 博客之星评选已经进行了几天。我也没有很去关注这东西,毕竟一个刚注册一年、写了无数水文的误导他人的博主,怎么可能拿到博客之星? 我,只是无聊时转发一下,那句毫无新意、从…

大学生如何在网上赚零花钱,适合学生党可做的零花钱项目

大学生的课余时间是非常多的,利用这些时间,我们可以去做点小兼职赚点零花钱,既可以补贴生活费,又可以获得不一样的生活体验。 现在大学生完全可以不用去大街上发传单,或者去咖啡店当服务员了,自己在网上就…