机器学习---lightGBM

1. lightGBM演进过程

AdaBoost是⼀种提升树的方法,和三个臭皮匠,赛过诸葛亮的道理⼀样。 AdaBoost两个问题:

(1) 如何改变训练数据的权重或概率分布提高前⼀轮被弱分类器错误分类的样本的权重,降低前⼀

轮被分对的权重 (2) 如何将弱分类器组合成⼀个强分类器,亦即,每个分类器,前面的权重如何设

置采取”多数表决”的方法。加大分类错误率小的弱分类器的权重,使其作用较大,而减小分类错误

率大的弱分类器的权重,使其在表决中起较小的作用。

GBDT和AdaBosst很类似,但是又有所不同。 GBDT和其它Boosting算法⼀样,通过将表现⼀般的

几个模型(通常是深度固定的决策树)组合在⼀起来集成⼀个表现较好的模型。 AdaBoost是通过

提升错分数据点的权重来定位模型的不足, Gradient Boosting通过负梯度来识别问题,通过计算

负梯度来改进模型,即通过反复地选择⼀个指向负梯度方向的函数,该算法可被看做在函数空间里

对目标函数进行优化。 因此可以说 。 GradientBoosting = GradientDescent + Boosting

GBDT ->预排序方法(pre-sorted) (1) 空间消耗大。 这样的算法需要保存数据的特征值,还保存了

特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍

的内存。(2) 时间上也有较大的开销。 在遍历每⼀个分割点的时候,都需要进行分裂增益的计算,

消耗的代价大。(3) 对内存(cache)优化不友好。 在预排序后,特征对梯度的访问是⼀种随机访问,

并且不同的特征访问的顺序不⼀样,⽆法对cache进行优化。 同时,在每⼀层长树的时候,需要随

机访问⼀个行索引到叶子索引数组,并且不同特征访问顺序也不⼀样,也会造成较⼤cache miss。

常用的机器学习算法,例如神经网络等算法,都可以以mini-batch的方式训练,训练数据的大小不

会受到内存限制。 而GBDT在每⼀次迭代的时候,都需要遍历整个训练数据多次。 如果把整个训

练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常⼤

的时间。 尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。 LightGBM提出的

主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。

2. lightGBM原理

lightGBM 主要基于以下方面优化,提升整体特性: 1. 基于Histogram(直方图)的决策树算法

2. Lightgbm 的Histogram(直方图)做差加速 3. 带深度限制的Leaf-wise的叶子生长策略 4. 直接支

持类别特征 5. 直接支持高效并行

2.1 基于Histogram(直方图)的决策树算法

直方图算法的基本思想是:先把连续的浮点特征值离散化成k个整数,同时构造⼀个宽度为k的直方

图。 在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历⼀次数据

后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储

预排序的结果,而且可以只保存特征离散化后的值,而这个值⼀般用8位整型存储就足够了,内存

消耗可以降低为原来的1/8。 

然后在计算上的代价也大幅降低,预排序算法每遍历⼀个特征值就需要计算⼀次分裂的增益,而直

方图算法只需要计算 k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到

O(k#features)。 当然,Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确

的分割点,所以会对结果产生影响。 但在不同的数据集上的结果表明,离散化的分割点对最终的

精度影响并不是很大,甚至有时候会更好⼀点。原因是决策树本来就是弱模型,分割点是不是精确

并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差

比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。

2.2 Lightgbm 的Histogram(直方图)做差加速

⼀个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。 通常构造直方图,

需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。 利⽤这个方法,

LightGBM可以在构造⼀个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在

速度上可以提升⼀倍。

2.3 带深度限制的Leaf-wise的叶子生长策略

Level-wise遍历⼀次数据可以同时分裂同⼀层的叶子,容易进行多线程优化,也好控制模型复杂

度,不容易过拟合。 但实际上Level-wise是⼀种低效的算法,因为它不加区分的对待同⼀层的叶

子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

Leaf-wise则是⼀种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的⼀个叶子,然

后分裂,如此循环。 因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多

的误差,得到更好的精度。 Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此

LightGBM在Leaf-wise之上增加了⼀个最大深度的限制,在保证高效率的同时防止过拟合。

2.4 直接支持类别特征

实际上大多数机器学习⼯具都无法直接支持类别特征,⼀般需要把类别特征,转化到多维的0/1特

征,降低了空间和时间的效率。 而类别特征的使用是在实践中很常用的。基于这个考虑,

LightGBM优化了对类别特征的⽀持,可以直接输⼊类别特征,不需要额外的0/1展开。并在决策树

算法上增加了类别特征的决策规则。 在Expo数据集上的实验,相比0/1展开的方法,训练速度可以

加速8倍,并且精度⼀致。目前来看,LightGBM是第⼀个直接支持类别特征的GBDT工具。 Expo

数据集介绍:数据包含1987年10月至2008年4月美国境内所有商业航班的航班到达和离开的详细信

息。这是⼀个庞大的数据集:总共有近1.2亿条记录。主要用于预测航班是否准时。

2.5 直接支持高效并行

LightGBM还具有支持高效并行的优点。LightGBM原⽣支持并行学习,目前支持特征并行和数据并

行的两种。 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后

在机器间同步最优的分割点。 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的

合并,最后在合并的直方图上面寻找最优分割点。 LightGBM针对这两种并行方法都做了优化: 在

特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;

在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和

计算,并利用直方图做差,进⼀步减少了⼀半的通信量。

基于投票的数据并行(Voting Parallelization)则进⼀步优化数据并行中的通信代价,使通信代价变成

常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。

3. lightGBM参数介绍 

下表对应了 Faster Speed ,better accuracy ,over-fitting 三种目的时,可以调的参数

4. lightGBM案例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
import lightgbm as lgb
# 加载数据
iris = load_iris()
data = iris.data
target = iris.target
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)
gbm = lgb.LGBMRegressor(objective='regression', learning_rate=0.05, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], eval_metric='l1', early_stopping_rounds=5)
gbm.score(X_test, y_test)
# 0.810605595102488
# ⽹格搜索,参数优化
estimator = lgb.LGBMRegressor(num_leaves=31)
param_grid = {
'learning_rate': [0.01, 0.1, 1],
'n_estimators': [20, 40]
}
gbm = GridSearchCV(estimator, param_grid, cv=4)
gbm.fit(X_train, y_train)
print('Best parameters found by grid search are:', gbm.best_params_)
# Best parameters found by grid search are: {'learning_rate': 0.1, 'n_estimators': 40}
gbm = lgb.LGBMRegressor(num_leaves=31, learning_rate=0.1, n_estimators=40)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], eval_metric='l1', early_stopping_rounds=5)
gbm.score(X_test, y_test)
# 0.9536626296481988

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

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

相关文章

vue3、vue2文件导入事件

一、vue3写法 1、html部分 <el-buttontype"info"plainicon"Upload"click"handleImport"v-hasPermi"[system:user:import]">导入</el-button><!-- 导入对话框 --><el-dialog :title"upload.title" v-…

mysql进阶-索引基础

目录 1. 概念-索引是什么&#xff1f; 2. 索引的数据结构(索引模型) 2.1 二分查找&#xff1a; 2.2 二叉查找树&#xff08;BST Binary Search Tree&#xff09;&#xff1a; 2.3 平衡二叉树(AVL Tree Balanced binary search trees) 2.4 多路平衡查找树(B Tree Balanced…

推荐一款通过ssh连接linux服务的开源工具WindTerm

文章目录 前言WindTerm介绍WindTerm使用主密码和锁屏总结 前言 工作一入门便是游戏服务器开发&#xff0c;所以常常有连接Linux服务器的需求&#xff0c;之前用的最多的是Xshell&#xff0c;最近这个软件个人版只能免费使用一个月了&#xff0c;超过时间会提示更新无法正常使用…

C++学习笔记——输入、输出和文件

目录 一、标准输入输出 2.1下面是它们的基本用法 解释 二、格式化输入输出 2.2下面是一个示例 解释 三、文件读写 3.3下面是一个文件读写的示例 解释 四、异常处理和错误检测 4.1下面是一个示例 解释 五、一个实例代码 5.1如何读取 CSV 文件&#xff0c;并计算每…

【数据结构】交换排序

插入排序链接。 这篇文章讲解交换排序的两种排序&#xff1a;冒泡排序与快速排序。 目录 冒泡排序&#xff1a;完整代码&#xff1a; 快速排序&#xff1a;单趟排序&#xff1a;hoare&#xff1a;挖坑&#xff1a;前后指针&#xff1a; 完整代码&#xff08;3种方式&#xff0…

3 - AOP

1. 快速入门 1.1 基本说明 AOP(aspect oriented programming) &#xff0c;面向切面编程 切面类中声明通知方法&#xff1a; 前置通知&#xff1a;Before返回通知&#xff1a;AfterReturning异常通知&#xff1a;AfterThrowing后置通知&#xff1a;After环绕通知&#xff1…

2、Redis持久化、主从与哨兵:构建强大而稳定的数据生态

Redis作为一款高性能的内存数据库&#xff0c;其在持久化、主从复制和哨兵系统方面的支持使其在大规模应用和高可用性场景中脱颖而出。本文将深入探讨Redis的持久化机制、主从复制以及哨兵系统&#xff0c;为构建强大而稳定的数据生态揭示关键技术。 持久化&#xff1a;数据的…

二进制与十六进制,二进制与八进制之间的相互转换技巧

目录 1.二进制转换为八进制 2.八进制转换为二进制 3.二进制转换为十六进制 4.十六进制转换为二进制 1.二进制转换为八进制 转换为8进制 第一步&#xff1a;以小数点为分界线&#xff0c;整数部分自右向左&#xff0c;小数部分自左向右每3位取成1位&#xff1a; 整数部分…

【python入门】day28:记录用户登录日志

演示 代码 #-*- coding:utf-8 -*- print(记录用户登录日志----------------------------) import time def show_info():print(输入提示数字,执行相应操作:0退出,1查看登录日志) def write_logininfo(username):#----------记录日志with open(log.txt,a,encodingutf-8)as file…

如何高效阅读Linux的man page

有时候需要在man page中查某个命令的用法&#xff0c;我们一般会使用man command的方式来查询&#xff0c;例如man vmstat.但是对于一些bash内置的命令&#xff0c;如alias,如果使用man alias会打开General Commands Manual ,如下图 可以看到&#xff0c;内置命令很多&#xff…

COBOL语言 :一种主要专注于解决业务问题的编程语言

译文&#xff1a; 什么是COBOL? COBOL是一种主要专注于解决业务问题的编程语言。COBOL的完整形式是面向业务的通用语言。它主要用于公司和政府的商业、金融和行政系统。这种语言也被用来解决许多数据处理问题。 它是由CODASYL(数据系统语言会议)开发的。它被用作大型机中的一…

基于 InternLM 和 LangChain 搭建你的知识库

如何打造垂域大模型是一个重要落地方向。 如何打造个人专属的大模型应用也是重要的问题。 RAG 外挂一个知识库 优势&#xff1a;成本低&#xff0c;实时更新 劣势&#xff1a;能力受基座模型影响大&#xff0c;RAG每次需要将检索文档和问题提交给大模型&#xff0c;极大占用上下…

工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

C++力扣题目701--二叉搜索树中的插入操作

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效的插入方式&a…

苏州倍丰智能新型雾化粉末技术量产成功!金属3D打印全产业链更进一步

苏州倍丰智能深耕金属3D打印技术领域&#xff0c;以金属3D打印全产业链为目标&#xff0c;围绕金属3D打印设备&#xff0c;涵盖包括金属粉末前后处理设备、金属粉末原材料制备、先进工艺研发等多个领域&#xff0c;完成了一整条自上而下的金属3D打印全产业链。 近日&#xff0c…

大数据Doris(五十四):SQL函数之日期函数(二)

文章目录 SQL函数之日期函数(二) 一、DAYOFMONTH(DATETIME date) 二、dayofweek(DATETIME date)

HarmonyOS 通过 animateTo讲解尺寸动画效果

上文 HarmonyOS讲解并演示 animateTo 动画效果 我们已经做出了基本的动画效果 也对 animateTo 的使用比较熟悉了 第一个参数是 配置动画参数的json 第二个参数 则是改变我们元素属性值的事件 但属性值 远远不止位置属性 本文 我们来说 通过尺寸变化 完成动画效果 如果你有看过…

代码随想录算法训练营第4天 | 24. 两两交换链表中的节点 , 19.删除链表的倒数第N个节点 , 面试题 02.07. 链表相交 , 142.环形链表II

链表知识基础 文章链接&#xff1a;https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html# 24. 两两交换链表中的节点 题目链接&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/ 使用虚拟头结点&#xff0c;这样会方便很…

Centos7编译Python3.11源码并安装完成的详细教程

Python3.11的Linux源码&#xff1a; Index of /ftp/python/https://www.python.org/ftp/python/由于Centos7里自带的openssl是1.0版本的&#xff0c;而Centos Stream8和9用的是openssl-1.1.1版本的。 注意&#xff1a;openssl必须是openssl-1.1.1版本的&#xff0c;虽然最高版…

QT的事件机制

QT的事件机制 文章目录 QT的事件机制 1、QT的事件机制。2、QT事件的整体流程。1、事件处理函数。1、鼠标按下与鼠标释放事件。2、事件的接收与忽略(accept()和ignore()函数&#xff09;。 2.事件的分发enevt()1、事件分发的dome。2、enevt事件的缺点。 3、事件的过滤器。 3、总…