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 使其训练速度更快。
- 基于梯度的一侧采样(GOSS)
- 树节点分裂中基于直方图的最佳值搜索
- 分类特征的最佳分割
- 独家功能捆绑
- 叶向树生长策略
- 并行优化
1. 基于梯度的单侧采样(GOSS)
经典的基于树的梯度提升(GBDT)训练是一个重复过程,用于训练新树以适应所有训练集实例上先前树集的预测误差。(预测误差是所有训练集实例上的损失函数梯度)
因此,默认情况下,GBDT 使用所有训练集实例来训练其集合中的每棵树。
针对这一点,LightGBM引入了GOSS,其中我们只需要使用部分训练集来训练每个集成树。GOSS 的直觉是
- 具有大梯度的训练实例意味着该实例具有较大的当前预测误差,并且应该是适合下一个集成树的主要目标
- 小梯度的训练实例意味着该实例当前的预测误差相对较小,不需要下一个集成树过多担心,因此我们可以以某种概率丢弃它。
一般来说,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)”。一般来说,这一“一对一”策略的问题是
- 它往往会在子节点中生成不平衡的数据点分配(例如左子节点比右子节点分配更多的数据点)并且需要增长得很深才能获得良好的准确性
- 由于需要生长很深的树,需要多次节点分裂,所以建树效率很低。
受这些问题的启发,LightGBM 采用了如下多对多策略。
对于给定的分类特征
- 对于特征的每个类别,计算平均值 Sum(y)/Count(y)
- 按平均值对所有类别进行排序(如下图所示)。
- 从最低平均值到最大平均值枚举分割值,以找到最佳分割值。分裂值将所有类别分为两部分(类别均值小于或大于分裂值),这就是节点分裂条件。
4. 独家功能捆绑
EFB旨在通过合并特征来减少特征,具体来说就是合并互斥的特征,这些特征很少同时取非零值。
LightGBM提供了以下两种算法来实现
- 从训练集中识别互斥的特征包
- 合并功能包并为该包分配一个值

下面是一个 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 在以下方面表现出色:
- 训练效率快
- 内存使用率低
- 高精度
- 并行学习
- 处理大规模数据的能力
相关文章:
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爬虫从网易音乐获取音频的方法&…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
