LightGBM

news2024/11/26 14:46:54

目录

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

直方图做差加速

2.LightGBM得两大先进技术(GOSS&EFB)

2.1 单边梯度抽样算法(GOSS)

2.2 互斥特征捆绑算法(EFB)

3.LightGBM得生长策略(leaf-wise)

通过与xgboost对比,在这里列出lgb新提出的几个方面的技术

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

LightGBM里面的直方图算法是为了减少分裂点的数量。

直方图就是把连续的浮点特征离散化为k个整数(也就是分桶bins的思想),比如[0,0.1)->0,[0.1,0.3)->1。并根据特征所在的bin对其进行梯度累加和个数统计,在遍历数据的时候,根据离散化后的值作为索引在直方图中累计统计量,当遍历一次数据后,直方图累积了需要的统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。我们来形象化的画个图。

在这里插入图片描述

这样在遍历到该特征的时候,只需要根据直方图的离散值,遍历寻找最优的分割点即可,由于bins的数量是远小于样本不同取值的数量的,所以分桶之后要遍历的分裂点的个数会少了很多,这样就可以减少计算量。基于上面的这个方式,如果是把所有特征放到一块的话,应该是下面的这种感觉:

在这里插入图片描述 

histogram算法还可以进一步加速。一个叶子节点的histogram可以直接由父节点的histogram和兄弟节点的histogram做差得到。一般情况下,构造histogram需要遍历该叶子上的所有数据,通过该方法,只需要遍历histogram的k个桶。

直方图做差加速

当节点分裂成两个时,右边的子节点的直方图其实等于父节点的直方图减去左边子节点的直方图:

在这里插入图片描述

再举个例子形象化的理解:

在这里插入图片描述 

histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在实际的数据集上表明,离散化的分裂点对最终的精度影响并不大,甚至会好一些。原因在于decision tree本身就是一个弱学习器,分割点是不是精确并不是太重要,采用histogram算法会起到正则化的效果,有效地防止模型的过拟合(bin数量决定了正则化的程度,bin越少惩罚越严重,欠拟合风险越高) 。

因为xgboost的近似分割算法也用了分桶,这里和xgboost中的weight quantile sketch算法做一个比较,xgboost考虑的是对loss的影响权值,用的每个样本的hi来标识的,相当于基于hi的分布去找候选分割点,这样带来的一个问题就是每一层划分完了之后,下一次依然需要构建这样的直方图,毕竟样本被划分到了不同的节点中,二阶导分布也就变了。所以xgboost在每一层都得动态构建直方图,因为它这个直方图算法不是针对某个特定得feature得,而是所有feature共享一个直方图(每个样本权重得二阶导)。而lightgbm对每个特征都有一个直方图,这样构建一次就ok,并且分裂得时候还能通过直方图进行加速。故xgboost得直方图算法是不如lightgbm得直方图算法快得。

2.LightGBM得两大先进技术(GOSS&EFB)

接下来说lightgbm得两大先进技术(GOSS&EFB),这两大技术是lightgbm相对于xgboost独有得,分别是单边梯度抽样算法(GOSS)和互斥特征捆绑算法(EFB),GOSS可以减少样本得数量,而EFB可以减少特征得数量,这样就能降低模型分裂过程中得复杂度。

2.1 单边梯度抽样算法(GOSS)

goss通过减少样本数量去帮助lgb更快

单边梯度抽样算法(Gradient-based One-Side Sampling)是从减少样本得角度出发,排除大部分权重小得样本,仅用剩下得样本计算信息增益,它是一种在减少数据和保证精度上平衡得算法。

但是这个时候就有个问题权重从哪来,我们通过了解GBDT得原理,可以知道,在训练新模型得过程中,梯度比较小得样本对于降低残差得作用效果不是太大,所以我们可以关注梯度高得样本,这样就可以减少计算量了。这里我们再记录下为啥梯度小得样本对降低残差效果不大。

在这里插入图片描述

可以看到梯度就是残差得一个相反数,也就是

 

这个常数不用管,这样也就是说如果我新得模型想降低残差得效果好,那么样本得梯度应该越大越好,所以这就是为啥梯度小得样本对于降低残差得效果不大。也是为啥样本得梯度大小可以反映样本权重得原因。

但是要是盲目得直接去掉这些梯度小得数据,这样就会改变数据得分布了啊,所以lgb才提出了单边梯度抽样算法,根据样本得权重信息对样本进行抽样,减少了大量梯度小得样本,但是还能不会过多得改变数据集得分布。

GOSS算法保留了梯度大的样本,并对梯度小得样本进行随机抽样,为了不改变样本得数据分布,再计算增益时为梯度小得样本引入了一个常数进行平衡。具体:首先先根据样本得梯度对样本从大到小排序,然后拿到前a%得梯度大得样本,和剩下样本得b%,再计算增益时,后面得这b%通过乘上(1-a)/b来放大梯度小得样本得权重。一方面算法将更多得注意力放在训练不足得样本上,另一方面通过乘上权重来防止采样对原始数据分布造成太大得影响。

我们来看一个具体得例子:

在这里插入图片描述

通过上面,我们就通过采样得方式,选出了我们得样本,两个梯度大得6号和7号,然后又从剩下得样本里面随机选取了2个梯度小得,4号和2号,这时候我们看看goss算法怎么做:

在这里插入图片描述 

这里得Ni是样本数,梯度小得样本乘上相应的权重之后,我们再基于采样样本得估计直方图中可以返现Ni得总个数依然是8个,虽然6个梯度小得样本中去掉了4个,留下了两个。但是这2个样本再梯度上和个数上都进行了3倍数得方法,所以可以防止采样对原始数据分布造成太大得影响。 

2.2 互斥特征捆绑算法(EFB)

 EFB是从减少特征的角度去帮助lgb更快。

高维度得数据往往是稀疏得,这种稀疏性启发我们设计一种无损得方法来减少特征的维度。通常被捆绑得特征都是互斥得,这样两个特征捆绑起来才会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,我们可以选择把不完全互斥得两个特征捆绑,而不影响最后得精度。

举一个很极端得例子。

在这里插入图片描述

可以看到,每一个特征都只有一个训练样本时非0且都不是同一个训练样本,这样的话特征之间也没有冲突了。这样得情况就可以把这四个特征捆绑成一个,这样维度就减少了。

EFB指出如果将一些特征进行融合绑定,则可以降低特征数量。这样再构建直方图得时候时间复杂度从O(#data*#feature)变成O(#data*#bundle),这里得#bundle指的是特征融合后特征包得个数,且#bundle<<#feature。针对这个特征捆绑融合,有两个问题需要解决。 

  • 怎么判断哪些特征应该绑在一起?
  • 特征绑在一起之后,特征值应该如何确定呢?

对于问题一,EFB算法利用特征和特征间得关系构造一个加权无向图,并将其转换为图着色得问题来求解,解释下就是这样得:

1.首先将所有得特征看成图得各个顶点,将不相互独立得特征用一条边连起来,边得权重就是两个相连接得特征得总冲突值(也就是这两个特征上同时不为0得样本个数)。

2.然后按照节点得度对特征降序排序,度越大,说明与其他特征得冲突越大

3.对于每一个特征,遍历已有得特征簇,如果发现该特征加入到特征簇中得矛盾数不超过某一个阈值,则将该特征加入到该簇中。如果该特征不能加入任何一个已有得特征簇,则新建一个簇,将该特征加入到新建得簇中。

具体可以看下面得例子:

在这里插入图片描述

上面这个过程得时间复杂度其实是O(#features^2)得,因为要遍历特征,每个特征还要遍历所有得簇,在特征不多得情况下还行,但是如果特征维度很大,就不好使了。所以为了改善效率,可以不建立图,而是将特征按照非零值个数进行排序,因为更多得非零值得特征会导致更多得冲突,所以跳过了上面得第一步,直接排序然后第三步分簇。 

对于问题二,捆绑完了之后特征应该如何取值呢?这里面得一个关键就是原始特征能从合并得特征中分离出来,也就是,绑定几个特征在同一个bundle里需要保证绑定前得原始特征得值可以在bundle里面进行识别,考虑到直方图算法将连续得值保存为离散得bins,我们可以是的不同特征得值分到簇中不同bins里面去,这可以通过在特征值中加入一个偏置常数来解决。

比如,我们把特征A和B绑定到了同一个bundle里面,A特征得原始取值区间[0,10),B特征原始取值区间[0,20),这样如果直接绑定,那么会发现我们从bundle里面取出了一个值5,就分不出这个5到底是来自特征A还是B了。所以我们可以再B特征的取值上加一个常数10转换为[10,30),这样绑定好得特征取值就是[0,30),我如果再从bundle里面取出5,就知道这个来自特征A。

从而有趣的是,对于类别特征,如果转换为onehot编码,则这些onehot编码后得多个特征相互之间是互斥得,从而可以被捆绑成为一个特征。因此,对于指定为类别型得特征,lgb可以直接将每个特征取值和一个bin关联,从而自动得处理它们,而需要预处理成onehot编码多此一举。

3.LightGBM得生长策略(leaf-wise)

我们整理了lgb是如何再寻找最优分裂点得过程中降低时间复杂度得,我们说xgb再寻找最优分裂点得时间复杂度其实可以归到三个角度:特征得数量,分裂点得数量和样本得数量。而lgb也提出了三种策略分别从这三个角度进行优化,直方图算法是为了减少分裂点得数量,goss算法为了减少样本得数量,而efb算法为了减少特征得数量。

lgb除了在寻找最优分裂点过程中进行了优化,其实在树得生长过程中也进行了优化,它抛弃了xgb里面得按层生长(level-wise),而是使用了带有深度限制得按叶子生长(leaf-wise)。

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

在这里插入图片描述

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

在这里插入图片描述

因此,level-wise得做法会产生一些低信息增益得节点,浪费运算资源,但是这个对防止过拟合挺有用。而leaf-wise能够追求更好得精度,降低误差,但是会带来过拟合问题,其使用了max_depth来控制树得高度防止过拟合,另外直方图和goss得各个操作本身都有天然正则化得作用。

最后还有lgb得工程优化,看下面这个链接:

https://zhongqiang.blog.csdn.net/article/details/105350579

lightGBM - 知乎

在这里提一下lighgbm是第一个直接支持类别特征的GBDT工具。 

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

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

相关文章

JavaScript 评测代码运行速度的几种方法

一、使用 performance.now() API 在 JavaScript 中&#xff0c;可以使用 performance.now() API 来评测代码的运行速度。该 API 返回当前页面的高精度时间戳&#xff0c;您可以在代码执行前后调用它来计算代码执行所需的时间。 例如&#xff1a; let t0 performance.now();…

计算机组成与设计04——处理器

系列文章目录 本系列博客重点在深圳大学计算机系统&#xff08;3&#xff09;课程的核心内容梳理&#xff0c;参考书目《计算机组成与设计》&#xff08;有问题欢迎在评论区讨论指出&#xff0c;或直接私信联系我&#xff09;。 第一章 计算机组成与设计01——计算机概要与技…

idea整合svn

idea整合svn svn下载 链接&#xff1a;https://pan.baidu.com/s/1yS3R3lEE8lm9c9Ap-ndDKg 提取码&#xff1a;65ur 基础步骤 IDED中配置SVN没有svn.exe解决办法 以下是两种解决方案 需要卸载原 svn&#xff08;不推荐&#xff09; 参考网址&#xff1a; https://blog.csdn.…

ansible以及playbook

文章目录1.ansible1.概念2.工作原理3.安装ansible2.playbook1.组件2.角色详解3.剧本语法3.1基本语法3.2常用字段3.3 选项1.ansible 1.概念 ansible是一个可以服务端控制其他机器完成工作的一个应用工具&#xff0c; 1.服务没有客户端存在&#xff0c;通过模块对节点服务器进行…

设计模式--建造者模式 builder

设计模式--建造者模式 builder&#xff09;建造者模式简介建造者模式--小例子&#xff08;电脑购买&#xff09;1.产品类2.抽象构建者3.实体构建类4.指导者类5.客户端测试类小结建造者模式简介 建造者模式有四个角色,概念划分如下&#xff1a; Product &#xff1a; 产品类&a…

docker的基本管理

Docker的概念云计算三层架构服务说明应用IAAS基础设施及服务硬件&#xff08;服务器、网络设置、防火墙等&#xff09;虚拟化网络虚拟化&#xff08;大二层&#xff09;例&#xff1a;openstackPAAS平台及服务环境例&#xff1a;数据库、 docker 、kubernetesSAAS应用及服务应用…

内网渗透(十四)之内网信息收集-域环境中查找域内用户基本信息

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

终于进了字节,记录一下我作为一名测试员磕磕碰碰的三个月找工作经历...

我是裸辞后重新找工作的&#xff0c;从去年到今年&#xff0c;前前后后花了大概三个月&#xff0c;大大小小参加了几百场面试。不是我说&#xff0c;作为一名测试员是真的挺难的&#xff0c;不过很庆幸自己最后拿到了字节的offer&#xff0c;今天在这里做一下记录吧&#xff0c…

从GPT到ChatGPT:我们离那个理想的AI时代到底还有多远?

写在前面 在2023年新年伊始&#xff0c;科技界最为爆火一款产品无疑是OpenAI公司出品的ChatGPT了&#xff0c;作为一名NLP领域从业者&#xff0c;似乎也好久没有看到如此热闹的技术出圈场景了。诚然从现象来看&#xff0c;无论从效果惊艳度、社会效应、商业价值、科技发展方向…

C++【多态】

文章目录1、多态的概念2、多态的定义及实现2-1、多态的构成条件2-2、虚函数2-3、虚函数的重写2-4 多态样例2-5、协变2-6、 析构函数与virtual2-7、函数重载、函数隐藏&#xff08;重定义&#xff09;与虚函数重写&#xff08;覆盖&#xff09;的对比2-8、override 和 final&…

spring的简单理解

目录 1 .ioc容器&#xff08;控制反转&#xff09; 2. Aop面向切面编程 3. 事务申明 4. 注解的方式启动 5. spring是什么与他的优势 6. 代理设计模式&#xff08;比如aop&#xff09; 7. springmvc中相应json数据 8. 使用lombok来进行对代码的简化 9. 使用logback记录…

学习SpringCloudAlibaba(二)微服务的拆分与编写

目录 一、单体架构VS微服务架构 1.单体架构 ​&#xff08;1&#xff09;.单体架构的优点 &#xff08;2&#xff09;.单体架构的缺点 2.微服务架构 &#xff08;1&#xff09;微服务的特性 &#xff08;2&#xff09;微服务架构图 &#xff08;3&#xff09;微服务的优点 …

大数据之------------数据中台

一、什么是数据中台 **数据中台是指通过数据技术&#xff0c;对海量数据进行采集、计算、存储、加工&#xff0c;同时统一标准和口径。**数据中台的目标是让数据持续用起来&#xff0c;通过数据中台提供的工具、方法和运行机制&#xff0c;把数据变为一种服务能力&#xff0c;…

ChatGPT使用、原理及问题

引言 2022年11月30日&#xff0c;OpenAI公布了他们的新产品&#xff1a;ChatGPT。随后ChatGPT火得一塌糊涂。通过b站搜索“ChatGPT”的结果&#xff1a; 搞学术的想着从它身上找点创新&#xff0c;吃瓜群众吃着这锅热瓜&#xff0c;想赚钱的眼睛贼亮&#x1f31f;&#x1f31f…

C++11中function和bind的用法

C11中function和bind的用法一、简介二、std::function的用法2.1、保存普通函数2.2、保存lambda表达式2.3、保存成员函数三、std::bind用法总结一、简介 在设计回调函数的时候&#xff0c;无可避免地会接触到可回调对象。在C11中&#xff0c;提供了std::function和std::bind两个…

云端IDE系列教程6:初识 WeTTY,想说爱你不容易

原文作者&#xff1a;行云创新产品总监 John 概述 今天我们接着上一期的文章《玩转云原生 Terminal 之 TTY 的前世今生》&#xff0c;继续来聊一聊云原生 Terminal。为了在 TitanIDE 上玩转云原生 Terminal &#xff0c;首先找到了 WeTTY&#xff0c;在这个过程中&#xff0c;…

ITSM | 限时优惠,帮助您的团队终结不良服务管理!

不良服务管理&#xff08;Bad Service Management &#xff0c;简称BSM&#xff09;是一种糟糕的状况&#xff0c;困扰着使用传统ITSM工具的公司。现在&#xff0c;它已经在许多IT团队中蔓延&#xff0c;并迅速攻击业务的其他领域&#xff0c;使他们无法处理来自不同业务领域的…

ROS2机器人编程简述humble-第四章-AN OBSTACLE DETECTOR THAT USES TF2 .1

如何检测一个障碍物呢&#xff1f;视觉、雷达&#xff1f;可视化效果如何&#xff1f;机器人所装备的传感器例如感知设备&#xff0c;主要负责环境的获取和识别。然后&#xff0c;结果发送给电机控制运动&#xff0c;在环境中自主、智能决策和规划。需要先简单看一下仿真可视化…

一篇带你MySQL运维

1. 日志 1.1 错误日志 错误日志是 MySQL 中 重要的日志之一&#xff0c;它记录了当 mysqld启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&…

全栈自动化测试技术笔记(二):准备工作的切入点

自动化测试技术笔记(二)&#xff1a;准备工作的切入点 上篇整理的技术笔记&#xff0c;聊了自动化测试的前期调研工作如何开展&#xff0c;最后一部分也提到了工作的优先级区分。 这篇文章&#xff0c;接上篇文章的内容&#xff0c;来聊聊自动化测试前期的准备工作&#xff0…