《机器学习公式推导与代码实现》chapter13-LightGBM

news2024/11/16 13:57:45

《机器学习公式推导与代码实现》学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅。

LightGBM

就GBDT系列算法的性能而言,XGBoost已经非常高效了,但并非没有缺陷。LightGBM就是一种针对XGBoost缺陷的改进版本,使得GBDT算法系统更轻便、更高效,能够做到又快又准。本章针对XGBoost可优化的地方,引出LightGBM的基本原理,包括直方图算法单边梯度抽样互斥特征捆绑算法以及leaf-wise生长策略

1 XGBoost可优化的地方

XGBoost通过预排序的算法来寻找特征的最优分裂点,虽然预排序算法能够准确找出特征的分裂点,但该方法占用空间太大,在数据量和特征量都比较多的情况下,会严重影响算法性能。XGBoost寻找最优分裂点的算法复杂度可以估计为:
复杂度 = 特征数 × 特征分裂点的数量 × 样本量 复杂度=特征数\times 特征分裂点的数量\times 样本量 复杂度=特征数×特征分裂点的数量×样本量
既然XGBoost的复杂度是由特征数特征分裂点的数量样本量决定的,LightGBM的优化方向也是从这三个方向考虑的。

2 LightGBM基本原理

LightGBM全称为light gradient boosting machine(轻量的梯度提升机),是由微软于2017年开源的一款顶级Boosting算法框架。跟XGBoost一样,LightGBM也是GBDT算法框架的一种工程实现,不过更快速、更高效。

2.1 直方图算法

为了减少特征分裂点数量和更加高效地寻找最优特征分裂点,lightGBM不同于XGBoost的预排序算法,采用直方图算法寻找最优特征分裂点。其主要思路是将连续的浮点特征值离散化为k个整数并构造一个宽度为k的直方图。对每个特征数据进行遍历的时候,将离散化后的值用于索引作为直方图的累计统计量。遍历完一次后直方图便可积累对应的统计量,然后根据该直方图寻找最优分裂点。

直方图的本质是一种数据离散化和分箱操作,虽然谈不上特别新颖的优化设计,但确实速度快性能优,计算代价和内存占用都大大减少。
在这里插入图片描述
直方图的另一个好处在于差加速。一个叶子结点的直方图可由其父结点的直方图与其兄弟结点的直方图做差得到,这也可以加速特征结点分裂。
在这里插入图片描述

2.2 单边梯度抽样

单边梯度抽样gradient-based one-side sampling, GOSS)算法是LightGBM减少样本的角度进行优化而设计的算法,是LightGBM的核心原理之一。

单边梯度抽样算法的主要思路是从减少样本的角度出发,将训练过程中大部分权重较小的样本剔除,仅对剩余样本数据计算信息增益。

chapter10中的AdaBoost算法中,该算法的一个关键要素是样本权重,通过在训练过程中不断调整样本分类权重从而达到最优分类效果。但在GBDT系列中并没有样本权重的相关设计,GBDT采用样本梯度来代替权重的概念。一般来说,训练梯度小的样本,其经验误差也小,说明这部分数据已经获得了较好的训练,GBDT的想法是在下一步的残差拟合中丢弃这部分样本,但这样做可能会改变训练样本的数据分布,影响最终的训练精度。

LightGBM提出采用GOSS采样算法,其目的是尽可能保留对计算信息增益有帮助的样本,提高模型训练速度。GOSS的基本做法是先将需要进行分裂的特征按照绝对值大小降序进行排序,取绝对值最大的前a%个数据,假设样本大小为n,在剩下的(1-a)%个数据中随机选择b%个数据,将这b%个数据乘以一个常数(1-a)/b:将小梯度样本乘上一个权重系数,将样本分布尽可能拉回来。这种做法会使得算法更加专注于训练不够充分的样本,并且原始的数据分布不会有太大改变。最后使用a+b个数据来计算该特征的信息增益。

GOSS算法主要从减少样本的角度来对GBDT进行优化。丢弃梯度较小的样本并且在不损失太多精度的情况下提升模型训练速度,这是LightGBM速度较快的原因之一。

2.3 互斥特征捆绑算法

直方图算法对应特征分裂点的优化,单边梯度抽样对应样本量的优化,最后还剩特征数的优化。

互斥特征捆绑(exclusive feature bunding, EFB)算法通过将两个互斥的特征捆绑为一个特征,在不丢失特征信息的前提下,减少特征数,从而加速模型训练。大多数时候两个特征不是完全互斥的,可以用定义一个冲突比率衡量特征不互斥程度,当冲突比率较低时,可以将不完全互斥的两个特征捆绑,这对最后模型精度没有太大影响。

所谓特征互斥,即两个特征不会同时为非零值,这一点跟分类特征的one-hot表达有点类似。互斥特征捆绑算法的关键问题有两个:一个是如何判断将哪些特征进行捆绑,另一个是如何将特征进行绑定,即绑定后的特征如何取值。

针对第一个问题,EFB算法将其转化为图着色问题(graph coloring problem)来求解。其基本思路是将所有特征看作图中各个顶点,用一条边连接不互相独立的两个特征,边的权重则表示两个相连接的特征的冲突比率,需要绑定在一起的特征就是图着色问题中要涂上同一种颜色的点(特征)。

第二个问题是要确定绑定后的特征如何进行取值,其关键在于能够将原始特征从合并后的特征中分离,即绑定到一个特征后,我们仍然能够从这个绑定的bundle中识别出原始特征。EFB算法针对该问题尝试从直方图的角度来处理,具体做法是将不同特征值分到绑定的bundle中不同的直方图中,通过在特征值中加一个偏置常量来处理。

举一个简单的例子,假设我们要绑定的特征A和特征B两个特征,特征A的取值范围为[10,20),特征B的取值范围是[10, 30), 我们可以给特征B的取值范围加一个偏置量10,则特征B的取值范围变成了[20, 40),绑定后的特征取值范围变成了[10,40),这样特征A和特征B就可以融合了。

2.4 leaf-wise生长策略

LightGBM还提出了区别于XGBoost的按层生长的叶子结点生长方式,即带有深度限制的按叶子结点(leaf-wise)生长的决策树生长方法。

XGBoost按层生长的level-wise算法,好处是可以多线程优化,也方便控制模型复杂度,且不易过拟合,缺点是不加区分地对待同一层所有叶子结点,大部分节点分裂和增益计算不是必须的,产生了额外的计算开销。

LightGBM提出按叶子结点生长地leaf-wise算法,精度更高且更高效,能够节约不必要的计算开销,同时为了防止某一结点过分生长而加上一个深度限制机制,能够保证在保证精度的同时一定程度上防止过拟合。

除以上四点改进算法外,LightGBM在工程实现上也有一些改进和优化,比如可以直接支持类别特征(不需要在对类别特征进行one-hot处理)、高效并行和cache(命中)命中率优化等。
在这里插入图片描述
在这里插入图片描述

3 LightGBM原生库示例

开源LightGBM项目的微软开发团队提供了该算法的原生库实现,lightgbm库提供了分类回归两大接口,下面以分类问题和iris数据集为例给出原生lightgbm接口的一个示例。

import lightgbm as lgb
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt

iris = load_iris()
data, target = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=43)
gbm = lgb.LGBMClassifier(
    objective='multiclass',
    num_class=3,
    num_leaves=31, # 控制每个决策树中叶子节点的数量,也就是决策树的复杂度
    learning_rate=0.05,
    n_estimators=20
)

gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=5)
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)
print(accuracy_score(y_pred, y_test))
lgb.plot_importance(gbm)
plt.show()
[1]	valid_0's multi_logloss: 1.02277
[2]	valid_0's multi_logloss: 0.943765
[3]	valid_0's multi_logloss: 0.873274
[4]	valid_0's multi_logloss: 0.810478
[5]	valid_0's multi_logloss: 0.752973
[6]	valid_0's multi_logloss: 0.701621
[7]	valid_0's multi_logloss: 0.654982
[8]	valid_0's multi_logloss: 0.611268
[9]	valid_0's multi_logloss: 0.572202
[10]	valid_0's multi_logloss: 0.53541
[11]	valid_0's multi_logloss: 0.502582
[12]	valid_0's multi_logloss: 0.472856
[13]	valid_0's multi_logloss: 0.443853
[14]	valid_0's multi_logloss: 0.417764
[15]	valid_0's multi_logloss: 0.393613
[16]	valid_0's multi_logloss: 0.370679
[17]	valid_0's multi_logloss: 0.349936
[18]	valid_0's multi_logloss: 0.330669
[19]	valid_0's multi_logloss: 0.312805
[20]	valid_0's multi_logloss: 0.296973
1.0

在这里插入图片描述
笔记本_Github地址

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

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

相关文章

【C++11】 列表初始化 auto 范围for 新增关键字 新增容器

文章目录 1 列表初始化2 auto && 范围for3 新增关键字3.1 decltype3.2 default3.3 delete3.4 final与override 4 总结 1 列表初始化 由c语言的规则我们知道:一般只有数组才会支持用{}初始化,但是C11新语法规定我们不仅可以用{}初始化各种对象(内…

企业微信 创建应用后如何构造网页授权 获取token 获取用户信息

第一次对接企业微信,上网找了各种方案。 目的是在企业微信中,公司发给员工一个地址,员工点开后打开画面,在这个画面上可以获取到这个员工的userid(后续功能操作就是各自不同的功能了哈,就不详细说了&#…

STM32F4_触摸屏

目录 1. 触摸屏原理 2. 电阻式触摸屏检测原理 3. 电容式触摸屏检测原理 4. 硬件配置 4.1 XPT2046驱动芯片 4.2 硬件设计 5. 代码详解 5.1 main.c 5.2 AT24C02.c 5.3 AT24C02.h 5.4 C_Touch_I2C.c 5.5 C_Touch_I2C.h 5.6 Touch.c 5.7 Touch.h 5.8 FT5206.c 5.9 …

ADAudit Plus:保护企业内部IT安全的强大解决方案

随着企业数字化的推进,IT系统和数据安全变得比以往任何时候都更加重要。为了保护企业的机密信息和敏感数据,企业需要一种可靠的IT安全解决方案。在众多选项中,ADAudit Plus是一款备受赞誉的软件,为企业内部的IT安全提供了强大的支…

Python入门自学进阶-Web框架——36、Web微信类实现初步

打开页面,会出现一个二维码,要使用手机微信扫一扫,才能登录。它的实现原理是什么? 下图为打开网页版微信登录的调试工具网络信息,定时发送请求,状态待处理(pending) 上图的挂起是pe…

网络安全|渗透测试入门案例分析,从零基础入门到精通—登录框页面的快速渗透常用检测手段

目录 引言 1、弱口令 2、万能密码绕过 ​编辑 3、登录认证绕过 3.1.令牌刷新端的错误配置 3.2. 错误的sso配置 3.3.CMS个例的访问问题 3.4.JWT Token的错误解析 3.5.暴力修改Authentication 4、图形验证码不失效 5、短信验证码不失效 6、短信攻击 7、反射型跨站脚…

【MySQL数据库】MySQL 高级SQL 语句二

MySQL 高级 SQL 语句二 一、连接查询1.1 inner join(内连接)1.2 left join (左连接)1.3 right join(右连接) 二、CREATE VIEW ---- 视图三、 UNION - - 连集3.1 UNION3.2 UNION ALL 四、交集值(取两个SQL语句结果的交集…

经典:商业智能BI解读,值得收藏

关注新闻的朋友们可能注意到了,最近这段时间关于数据要素、数字经济、数字化转型的相关行动越来越多,一方面是各级政府的政策规划以及大规模的发展行动,另一方面是则是各行各业的企业开始探寻数字经济,通过数字化转型进行改革&…

angular学习笔记

目录 1、认识Angular![在这里插入图片描述](https://img-blog.csdnimg.cn/17fe3ec067b64d75bf9d24a4e71403ed.png)2、路由2.1、路由懒加载2.2、路由守卫 3、模版指令4、生命周期4.1、父子生命周期 5、依赖注入6、RXJS7、自定义事件,自定义指令8、自定义管道9、获取d…

内网渗透(八十八)之委派攻击

委派 委派是大型网络中经常部署的应用模式,给多跳认证带来了很大的便利与此同时也带来了很大的安全隐患。利用委派,攻击者可结合其他漏洞进行组合攻击,导致攻击者可获取本地管理员权限甚至域管理员权限,还可以制作深度隐藏的后门。 委派是指将域内用户的权限委派给服务账…

【Adversarial Attack in Object Detection】物理对抗攻击和防御

目录 安全监控 **有无意义**无意义的补丁有意义的补丁 光学对抗攻击对抗灯干扰相机成像 攻击方法White-box attacksGradient-based attacks Optimization-based attacks Black-box attacksQuery-based attacksEvolution algorithm OUTLOOK 在计算机视觉中,根据实现…

征服Go世界,御剑江湖!学习路线与顶级资源一网打尽

引言 Go语言(也称为Golang)是一种开源的编程语言,由Google开发。它具有简洁的语法、高效的并发性能和良好的内存管理,因此在近年来迅速获得了广泛的关注和采用。本文将为您提供一条学习Go语言的路线图,并介绍一些优质…

二分查找 - 数据结构和算法教程

二分查找被定义为在排序数组中使用的一种搜索算法,它通过重复将搜索间隔分成两半来实现。二分查找的思想是利用数组被排序的信息,将时间复杂度降低到O(log N)。 在数据结构中应用二分查找的条件 数据结构必须排序。访问数据结构的…

mac为什么读取不了NTFS格式硬盘,Tuxera NTFS for Mac 2022 读写ntfs移动硬盘插件

使用 Mac 的巨大痛点之一:移动硬盘只能打开文件,但是无法写入新的资料。有人说格式化硬盘,改成苹果的 macOS扩展格式,但是原先硬盘的数据要转移,而且拿到 Windows 系统里无法被识别。 有人说格式化硬盘,改…

关于nginx,正向代理和反向代理是什么意思

为什么要使用nginx 很多公司会用到nginx做代理服务器,为什么用nginx,tomcat服务器不行吗? tomcat缺点:并发量小,用户使用的少 nginx:高并发,高性能,cpu、内存等资源消耗却非常低&…

在 Navicat Premium 中管理 MySQL 用户 | 第 4 部分:权限管理员工具

第 4 部分:权限管理员工具 在本系列中,我们一直在探索如何使用 Navicat 的旗舰产品 Navicat Premium 执行常见的用户管理任务。在上一篇文章中,我们研究了新用户对象选项卡的“服务器权限”、“权限”和“SQL预览”选项卡。 在上一篇文章中…

前程无忧guid、acw_sc__v2

文章目录 声明目标网站acw_sc__v2分析python调用测试话外拓展-风控浅析往期逆向文章推荐 声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除&#x…

【测试】Selenium操作Cookie

1.操作Cookie 操作Cookie无非就是读取和删除Cookie,下面这些是主要方法 from selenium.webdriver import Chrome, ChromeOptions from selenium.webdriver.chrome.service import Serviceoptions ChromeOptions() options.add_argument("--ignore-certifica…

07-source-map

source-map是从已转换的代码,映射到原始的源文件。使浏览器可以重构原始源并在调试器中显示重建的原始源。 根据源文件,生成source-map文件,webpack在打包时,可以通过配置生成source-map; 在转换后的代码,…

Springboot整合mybatisplus实战

Springboot整合mybatisplus,纯后端,验证结果是通过postman调用的,记录一下 1、建表语句以及初始化数据脚本 CREATE TABLE tbl_book (id int NOT NULL AUTO_INCREMENT,type varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT…