机器学习——LightGBM

LightGBM(light gradient boosting machine,轻量梯度提升机)是对XGBoost进行改进的模型版本,其三者之间的演变关系为:GBDT-》XGBoost-》LightGBM依次对性能进行优化,尽管XGBoost已经很高效了,但是仍然有缺陷,故此时就得到一个更为高效的模型版本LightGBM

由于XGBoost的复杂度是由于对每个特征值进行预排序,遍历所有可能的分裂点计算增益,其排序算法的复杂度=特征数×特征分裂点的数量×样本数。对XGBoost优化主要就从特征数、特征分裂点、样本数三个方面进行优化

 其涉及的优化方面涉及算法和策略(机器学习的三要素:模型、策略和算法),以下是LightGBM采样的四个优化方法:

①直方图算法(Histogram-based Split,从特征分裂点的优化)

由于XGBoost通过对每个特征值进行排序,遍历所有可能的分裂点计算增益,其计算复杂度高(特征数×特征分裂点数×样本量),内存消耗较大。其优化的方式是将连续特征离散化转化为直方图的bins,仅需遍历所有的bins而非所有的样本来寻找最优特分裂点。使得其复杂度降低到O(特征数×bins数×样本量),同时还可以通过直方图差加速(父结点直方图剪去子结点直方图得到另外一个子结点的直方图),其速度提升十倍,内存消耗降低到1/10

知识补充:

在机器学习中,bins(即分箱或者区间)指的是将连续型特征(年龄、收入、温度等)的数值范围离散化为多个区间,对每个区间进行整数编号即划分区间

②单边梯度抽样(Gradient-based One-Side Sampling,从对应样本量的优化)

这个单边梯度抽样是分为对高梯度样本和低梯度样本进行分别抽样,使得在减少30%~50%的数据量时,几乎不损失精度。这种方法避免了传统随机采样过程中可能丢失重要样本信息

核心思想分为三个 :

A.保留高梯度样本:选取梯度绝对值最大的前a%样本,

B.随机抽样低梯度样本:从剩余样本中随机抽取b%,并为其梯度乘以(1-a)/b作为补偿分布偏移。一般a和b的默认取值为0.2和0.1

C.仅用抽样数据计算分裂增益值,降低原本使用全部样本进行增益计算的计算复杂度。

其分裂增益计算的数学表达式:

知识补充:

梯度在GBDT中代表样本的预测难度,即梯度的绝对值越大,样本越难拟合

③互斥特征捆绑算法(Exclusive Feature Bunding,从特征数上优化)

高维特征中,许多特征是互斥的(如“用户性别”和“怀孕次数”不会同时为非零值),对于这种互斥或者冲突最少的特征进行捆绑,将捆绑的特征映射到同一个bin范围(如原特征A的bin范围是0-10,特征B的bin范围为11-20);那么怎么识别这种互斥或者冲突最少的特征呢?可以选择使用贪心算法和图着色算法获取冲突最少特征。那么如何定义冲突最少呢?此时可以定义一个捆绑特征冲突率,当该冲突率低于阈值(max_conflict_rate)时,即可对其特征进行捆绑。

知识补充1:

(如“用户性别”和“怀孕次数”不会同时为非零值)这一内容怎么理解?

对于性别为男性的用户,怀孕次数几乎总是 0(除非特殊场景)。

对于性别为女性的用户,怀孕次数可能为 0、1、2 等。如果在一些场景为>0的样本

结论:在同一行数据中,这两个特征不会同时为非零值(男性怀孕次数为0,女性怀孕次数可能为非零)。因此它们是互斥特征(如果其为男性,那么其怀孕次数自动为0;而怀孕次数不为0,一定是女性,在这种场景下两个特征就可以视为单一特征)

知识补充2:

捆绑特征选择算法(图着色算法):将所有特征视为图的各个顶点,用一条边连接两个不互相独立的特征,边的权重则表示两个相连接的特征的冲突比率(max_conflict_rate),通过阈值比较判定两点之间是否需要被涂上同一个颜色。但是这样会存在一个问题,特征捆绑后怎么进行取值的问题?比如一个特征A的取值范围是[20,40),另外一个特征B的取值范围为[30,60),此时特征捆绑后不做什么特殊处理后,就会得到取值范围为[20,60],那么我现在有一个值为30的特征值,我该放进A特征中,还是放进B特征中呢?故需要对不互相独立的特征进行一个偏置处理,即比如对特征B的取值范围加上一个10的偏置值,使得B特征的取值范围变成[40,70],此时就可以对里面的特征进行很好的区分了

④leaf-wise生长策略(带有深度限制叶子结点生长,即有max_depth作为叶子结点生长限制条件,为了避免出现XGBoost的过拟合的问题)

XGBoost的Level_wise策略:逐层分裂所有叶子结点,避免过拟合但产生冗余分裂(出现某些增益低的结点无需分裂),故其产生的是一个对称树。

LightGBM的leaf_wise策略:只分裂增益最大的叶子,生成不对称树,并通过设置max_depth来防止过拟合。故其产生的是一个不对称树

综上,LightGBM较XGBoost更适合处理大规模(百万级别以上的样本)、高维特征、实时性高的数据样本;而对于小规模本地上运行的样本、样本需要精细调制的、需要强解释的模型,建议使用XGBoost框架。

幸运的是,LightGBM作为工业级的框架,其已经封装成库,直接可以在pycharm中通过pip install lightgbm的指令进行安装。Lightgbm库提供了分类和回归两大类接口,以及可以绘制模型特征重要性图

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是SQL作业

SQL作业是在数据库服务器上按特定时间或间隔自动执行的计划任务或流程,这些作业由Microsoft SQL Server中的SQL Server代理管理,对于自动执行日常任务(如数据库系统中的备份、数据导入和报告生成)以及确保及时准确地处理和更新数据…

小程序内表格合并功能实现—行合并

功能介绍:支付宝小程序手写表格实现行内合并,依据动态数据自动计算每次需求合并的值,本次记录行内合并,如果列内合并,同理即可实现 前端技术:grid布局 display:grid 先看实现效果: axml&…

CD19.【C++ Dev】类和对象(10) 日期类对象的成员函数(日期+天数)

目录 日期天数 需要考虑的几个问题 1.天数加在日上,有可能会溢出,需要进位 2.对月进位,也有可能导致月会溢出,需要进位 3.对年进位,需要考虑是否为闰年 代码设计 取得指定月的天数GetMonthDay函数 方法1:if判断或switch/case 方法2:查表 版本1 版本2 operator 初始…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.3实战案例:在笔记本电脑上运行轻量级LLM

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 实战案例:在笔记本电脑上运行轻量级LLM2.2.3 模型架构设计与实现1. 环境与工具准备1.1 硬件要求1.2 软件栈选择2. 轻量级模型架构设计2.1 模型参数配置2.2 关键技术优化3. 实战流程3.1 数据准备流程3.2…

新手村:逻辑回归-理解04:熵是什么?

新手村:逻辑回归04:熵是什么? 熵是什么? 前置条件 在开始学习逻辑回归中的熵理论之前,需要掌握以下基础知识: 概率论与统计学: 概率分布(如伯努利分布、正态分布)。条件概率和贝叶斯定理。期…

linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像

Linux》》docker: 默认情况下,Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时,Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成,这些…

Processor System Reset IP 核 v5.0(vivado)

这个IP的作用,我的理解是,比普通按键复位更加高效灵活,可以配置多个复位输出,可以配置复位周期。 1、输入信号: 重要的信号有时钟clk信号,一般连接到系统时钟;输入复位信号,一般是外…

SQL中累计求和与滑动求和函数sum() over()的用法

[TOC](SQL中累计求和与滑动求和函数sum() over()的用法) 一、窗口函数功能简介 sum(c) over(partition by a order by b) 按照一定规则汇总c的值,具体规则为以a分组,每组内按照b进行排序,汇总第一行至当前行的c的加和值。 sum()&#xff1a…

优雅的开始一个Python项目

优雅的开始一个Python项目 这是我在初始化一个Python项目时,一键生成的项目文件。它自动完成了git初始化、环境管理、日志模块这三件事情,并在最后进入了虚拟环境。 uv安装 uv是一个现代的Python包管理和项目管理工具。uv中文文档 安装uv: # unix: …

【Django】教程-2-前端-目录结构介绍

【Django】教程-1-安装创建项目目录结构介绍 3. 前端文件配置 3.1 目录介绍 在app下创建static文件夹, 是根据setting中的配置来的 STATIC_URL ‘static/’ templates目录,编写HTML模板(含有模板语法,继承,{% static ‘xx’ …

Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?

🚀 Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?🤔 父组件:identify-list.vue子组件:fake-clue-list.vue 嘿,各位前端探险家!👋 今天我们要在 Vue 2 的代码丛林…

docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库

1、找一个文件夹,比如 E:\zqy\file\mysql,cd到这个目录下创建文件docker-compose.yml 2、将下面的代码块复制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

【Java SE】包装类 Byte、Short、Integer、Long、Character、Float、Double、Boolean

参考笔记:java 包装类 万字详解(通俗易懂)_java包装类-CSDN博客 目录 1.简介 2.包装类的继承关系图 3.装箱和拆箱 3.1 介绍 3.2 手动拆装箱 3.3. 自动拆装箱 ​4.关于String类型的转化问题 4.1 String类型和基本类型的相互转化 4.1.1 String —…

《网络安全等级测评报告模版(2025版)》

网络安全等级保护(以下简称“等保测评”)制度是我国网络安全领域现行的基本制度。所谓等保测评,即具有资质的测评机构,依据国家网络安全等级保护规范规定,按照有关管理规范和技术标准,对等保对象&#xff0…

【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2DEffector效应器

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南

本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具(一款跨平台、命令行驱动的烧录利器),通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤,帮助用户实现Air780E…

SpringMVC的请求与响应

SpringMVC的请求与响应 SpringMVC请求处理流程请求映射和参数绑定RequestMapping注解RequestMapping的属性RequestMapping的请求参数绑定HTML代码JavaBean代码controller代码在控制器中使用原生的ServletAPI对象 SpringMVC响应数据处理及跳转结果跳转方式ModelAndViewServletAP…

【QT继承QLabel实现绘制矩形、椭圆、直线、多边形功能,并且支持修改大小,移动位置,复制,粘贴,删除功能】

文章目录 介绍绘制一个矩形(椭圆)roi绘制一个多边形roi对矩形roi的缩放:对多边形rio的缩放(移动点的位置) 介绍 绘制矩形,椭圆,直线实际用的都是是同一个思路:鼠标第一次点击就确定…

3.0 Disruptor的使用介绍(一)

Disruptor: 其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。 其组成部分比较多,先介绍几个常用的概念: …

ubuntu 2204键盘按键映射修改

键盘的按键和实际输出不一致&#xff0c;可以通过以下方法重新修改按键keycode. 1.在终端执行如下命令&#xff1a; xev -event keyboard 上边64是alt_l&#xff0c;但是键盘上对应的super(windows)。 2.vim /usr/share/X11/xkb/keycodes/evdev //<LALT> 64; 注释&l…