当前位置: 首页 > news >正文

LightGBM 的完整解释 - 最快的梯度提升模型

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

目录

1. 基于梯度的单侧采样(GOSS)

2. 基于直方图的树节点分裂

3. 分类特征的最优分割

4. 独家功能捆绑

5. Leaf-wise 树生长策略

6. 并行优化

7.总结


LightGBM是微软于2016年开发的梯度提升决策树模型(GBDT),与其他GBDT模型相比,LightGBM的最大特点是训练效率更快、准确率更高。

        LightGBM 与一般的 Gradient Boosting Decision Tree 模型在结构上没有根本的区别,但通过以下特殊技术,LightGBM 使其训练速度更快。

  1. 基于梯度的一侧采样(GOSS)
  2. 树节点分裂中基于直方图的最佳值搜索
  3. 分类特征的最佳分割
  4. 独家功能捆绑
  5. 叶向树生长策略
  6. 并行优化

1. 基于梯度的单侧采样(GOSS)

        经典的基于树的梯度提升(GBDT)训练是一个重复过程,用于训练新树以适应所有训练集实例上先前树集的预测误差。(预测误差是所有训练集实例上的损失函数梯度)

因此,默认情况下,GBDT 使用所有训练集实例来训练其集合中的每棵树。

        针对这一点,LightGBM引入了GOSS,其中我们只需要使用部分训练集来训练每个集成树。GOSS 的直觉是

  1. 具有大梯度的训练实例意味着该实例具有较大的当前预测误差,并且应该是适合下一个集成树的主要目标
  2. 小梯度的训练实例意味着该实例当前的预测误差相对较小,不需要下一个集成树过多担心,因此我们可以以某种概率丢弃它。

            一般来说,GOSS的主要思想是,在训练下一个集成树之前,我们保留梯度较大的训练实例,并丢弃一些梯度较小的训练实例。

下图为GOSS算法。

所有训练实例均按梯度排序,a表示大梯度实例的采样百分比,b表示小梯度实例的采样百分比。

 

通过使用 GOSS,我们实际上减少了训练下一个集成树的训练集的大小,这将使训练新树的速度更快。

2. 基于直方图的树节点分裂

在寻找最佳特征值来分割树节点时,LightGBM使用特征值直方图,并尝试所有直方图bin值,而不是尝试所有可能的特征值,因此可以减少寻找最佳特征吐出值的时间和计算量。顺便说一下,LightGBM 的分割标准是减少从父级到子级的梯度方差。

例如,给定下面的年龄特征,将直方图离散特征值放入不同的范围箱中,因此我们可以使用像Age⩽30,Age⩽40,,,,Age⩽100这样的吐槽标准,而不是尝试像Age这样的所有可能的年龄值⩽31、年龄⩽32 等

                           

用bin来替换原始数据相当于增加正则化,bin的数量决定了正则化的程度。bin 越小,惩罚越严重,欠拟合的风险越高。

同样在树分裂场景中,对于给定的特征,直方图是可加的

父节点直方图 = 左子直方图 + 右子直方图

因此,在计算子直方图时,我们只需要计算一个子直方图(选择较小尺寸的子直方图),另一子直方图是父直方图减去计算得到的直方图。

3. 分类特征的最优分割

通常,在处理树节点分裂中的分类特征时,我们总是使用One Vs Rest作为节点分裂规则,例如分裂条件是“Weather = Sunny” vs “All other Weather (Rainy, Cloudy, Snowy etc)”。一般来说,这一“一对一”策略的问题是

  1. 它往往会在子节点中生成不平衡的数据点分配(例如左子节点比右子节点分配更多的数据点)并且需要增长得很深才能获得良好的准确性
  2. 由于需要生长很深的树,需要多次节点分裂,所以建树效率很低。

受这些问题的启发,LightGBM 采用了如下多对多策略。

对于给定的分类特征

  1. 对于特征的每个类别,计算平均值 Sum(y)/Count(y)
  2. 按平均值对所有类别进行排序(如下图所示)。
  3. 从最低平均值到最大平均值枚举分割值,以找到最佳分割值。分裂值将所有类别分为两部分(类别均值小于或大于分裂值),这就是节点分裂条件。

4. 独家功能捆绑

EFB旨在通过合并特征来减少特征,具体来说就是合并互斥的特征,这些特征很少同时取非零值。

LightGBM提供了以下两种算法来实现

  1. 从训练集中识别互斥的特征包
  2. 合并功能包并为该包分配一个值

下面是一个 EFB 示例,显示了特征合并的结果。

在该示例中,最大冲突计数K=2,表明根据EFB算法,原来的5个特征可以减少到3个特征。

5. Leaf-wise 树生长策略

LightGBM 放弃了大多数 GBDT 工具所使用的 level-wise 决策树生长策略,而使用了具有深度限制的 leaf-wise 算法。

Leaf-wise策略中,每次从所有叶子中,找到分裂增益最高的叶子,然后分裂并循环。

在上面的树生长过程中,绿叶节点是分裂增益最高的节点,因此对其进行分裂,然后重新评估以找到下一个绿叶节点。

leaf-wise的好处是,对于每一次节点分裂,我们总是能为树带来最高的增益,因此它比level-wise更有效地生长树。但我们需要添加树深度和一些其他限制以避免过度拟合。

6. 并行优化

为了处理超大型数据集,LightGBM引入了分布式过程来并行计算特征直方图和最佳分割特征值。

LightGBM支持两种并行策略——特征并行和数据并行

特征并行算法

训练数据被垂直(列或特征)分割并分配到不同的工作计算机,以计算分配的特征的局部直方图和局部最佳分割,然后从所有工作器输出中全局选择最佳分割。

数据并行算法

训练数据被水平(行)分割并分配到不同的工作计算机,根据分配的训练子集计算所有特征的局部直方图,然后合并来自所有工作计算机的局部直方图的所有特征直方图。

LightGBM还对数据并行算法进行了进一步的优化,其思想是每个worker在本地选择前K个最佳分割特征,然后在全局投票选出顶级特征。

一旦获得顶部特征,我们只需要从所有工人本地直方图中合并顶部特征直方图。

7.总结

上述所有 LightGBM 创新技术的目的都是为了使其训练速度更快,它们使 LightGBM 在以下方面表现出色:

  1. 训练效率快
  2. 内存使用率低
  3. 高精度
  4. 并行学习
  5. 处理大规模数据的能力

相关文章:

LightGBM 的完整解释 - 最快的梯度提升模型

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…...

Think-Queue3一直提示[Exception]redis扩展未安装

场景 tp6tq3实现的任务队列,使用redis作为数据驱动,目前是tp6可以正常使用redis了,但tq3不行,一直提示[Exception]redis扩展未安装。 解决思路 1.分析tq3源码 定位到是这一行出了问题 if (!extension_loaded(redis)) {throw n…...

Spring cloud教程Gateway服务网关

Spring cloud教程|Gateway服务网关 写在前面的话: 本笔记在参考网上视频以及博客的基础上,只做个人学习笔记,如有侵权,请联系删除,谢谢! Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,…...

【C++代码】爬楼梯,不同路径,整数拆分,不同搜索树,动态规划--代码随想录

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推…...

设计模式(单例模式、工厂模式及适配器模式、装饰器模式)

目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式 0 、设计模式简介 设计模式可以分为以下三种: 创建型模式:用来描述 “如何创建对象”,它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、…...

为wget命令设置代理

使用-e参数 wget本身没有专门设置代理的命令行参数,但是有一个"-e"参数,可以在命令行上指定一个原本出现在".wgetrc"中的设置。于是可以变相在命令行上指定代理: -e, --executeCOMMAND 执行.wgetrc格式的命令 例如&…...

【C++深入浅出】模版初识

目录 一. 前言 二. 泛型编程 三. 函数模版 3.1 函数模版的概念 3.2 函数模版的格式 3.3 函数模版的原理 3.4 函数模板的实例化 3.5 模板参数的匹配原则 四. 类模版 4.1 类模版的定义 4.2 类模版的实例化 一. 前言 本期我们要介绍的是C的又一大重要功能----模版。通…...

系统架构设计师-第18章-安全架构设计理论与实践-软考学习笔记

安全架构概述 信息的可用性、元略性、机密性、可控性和不可抵赖性等安全保障显得尤为重要,而满足这些诉求,离不开好的架构设计. 信息安全面临的威胁 常见的安全威胁有以下几种. (1)信息泄露 (2) 破坏信息的元整性: 数据被非授极地进行增删、修改成破坏…...

2023年吉安市“振兴杯”职业技能大赛网络安全项目样题

2023年吉安市“振兴杯”职业技能大赛 网络安全项目样题 需要竞赛环境可私信博主 赛题说明 一、竞赛项目简介 竞赛共分为:A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四…...

python爬虫selenium和ddddocr使用

python爬虫selenium和ddddocr使用 selenium使用 selenium实际上是web自动化测试工具,能够通过代码完全模拟人使用浏览器自动访问目标站点并操作来进行web测试。 通过pythonselenium结合来实现爬虫十分巧妙。 由于是模拟人的点击来操作,所以实际上被反…...

【vim 学习系列文章 12 -- vimrc 那点事】

文章目录 系统级及本地 vimrc 文件设置 vimrc 的路径 系统级及本地 vimrc 文件 当 Vim 启动时,编辑器会去搜索一个系统级的 vimrc 文件来进行系统范围内的默认初始化工作。 这个文件通常在你系统里 $VIM/vimrc 的路径下,如果没在那里,那你可…...

spring.factories介绍

spring.factories 是 Spring Framework 中的一个配置文件,它用于自动装配和加载 Spring 应用程序中的各种组件。该文件位于 META-INF/spring.factories,通常位于 JAR 文件的资源路径下。 spring.factories 文件采用键值对的形式,每个键代表一…...

业务设计——用户敏感信息展示脱敏及其反脱敏

业务需求 将用户敏感信息脱敏展示到前端是出于保护用户隐私和信息安全的考虑。 敏感信息包括但不限于手机号码、身份证号、银行卡号等,这些信息泄露可能导致用户个人信息的滥用、身份盗用等严重问题。脱敏是一种常用的保护用户隐私的方式,它的目的是减少…...

Hadoop分布式安装

首先准备好三台服务器或者虚拟机,我本机安装了三个虚拟机,安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档:Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…...

Python——PyQt5以及Pycharm相关配置

PyQt5目录 常见的GUI框架一、安装pyqt5pip install pyqt5pip install pyqt5-tools二、Qt Designer三、在PyCharm中配置相关toolQtDisigner配置PyUIC配置PyRCC配置常见的GUI框架 Tkinter:Python内置的GUI框架,使用TCL实现,Python中内嵌了TCL解释器,使用它的时候不用安装额外…...

java集成海康预览抓图出现内存一直上涨问题

求助:在java 中集成海康sdk后批量抓图出现内存上涨问题,不论是预览后不关闭继续预览,还是预览后关闭预览,然后重新预览都没有解决这个问题(抓图正常),尝试使用第三方解码器ffmpeg来进行解码&…...

Spring Boot 使用 Disruptor 做内部高性能消息队列

这里写自定义目录标题 一 、背景二 、Disruptor介绍三 、Disruptor 的核心概念3.1 Ring Buffer3.2 Sequence Disruptor3.3 Sequencer3.4 Sequence Barrier3.5 Wait Strategy3.6 Event3.7 EventProcessor3.8 EventHandler3.9 Producer 四、案例-demo五、总结 一 、背景 工作中遇…...

一、灵动mm32单片机_开发环境的搭建(Keil)

1、安装Keil MDK。 略。 2、安装芯片对应的Pack包。 (1)这里以MM32F0130单片机为例。 (2)进入灵动微电子官网。上海灵动微电子股份有限公司 (3)点击“支持”→“KEILPacl”。 (3)点击下载Pack包。 (4)下载后,解压下载的压缩包,找到对应的Pack包&…...

【5G PHY】5G SS/PBCH块介绍(二)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...

简单而高效:使用PHP爬虫从网易音乐获取音频的方法

概述 网易音乐是一个流行的在线音乐平台,提供了海量的音乐资源和服务。如果你想从网易音乐下载音频文件,你可能会遇到一些困难,因为网易音乐对其音频资源进行了加密和防盗链的处理。本文将介绍一种使用PHP爬虫从网易音乐获取音频的方法&…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

LangFlow技术架构分析

🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...