lightgbm 保存模型 过大_机器学习之12—Lightgbm

Lightgbm模型和GBDT以及XGboost一样,都是基于决策树的boosting集成模型;

Lightgbm是一个快速高效、低内存占用、高准确度、支持并行大规模数据处理的数据科学工具。

关于GBDT和XGboost的介绍可以参考:

大饼:机器学习——提升算法(Adaboost、xgboost、GBDT)​zhuanlan.zhihu.com

Lightgbm主要特点

Histogram Algorithm(直方图)

将连续浮点特征值离散化为k个整数,并构造bins=k的直方图,只管来说,就是将连续值得特征划分为k个离散值(区间),并将每个符合该离散值范围的连续值加入到相应的bin的直方图中,数据的离散化有着存储方便、运算更快、鲁棒性强以及模型稳定的特点(正则化);

4b5212c3c77b72961ce6745b4c7036bd.png
  • 内存占用小,不需要预排序(XGboost),只保存离散化后的值,内存可以降低至1/8;
  • 计算代价小,预排序算法XGboost每遍历一个特征值就需要计算分裂增益,Lightgbm是计算k次的离散值即可,复杂度从O(#data#feature)降低至O(#k#feature),一般data>>k;
  • bins替代原始数据,增加了正则化;
  • 特征值离散化,意味着许多细节被抛弃,影响数据间的差异性以及模型的精度;

直方图做差加速

02cc8c0e634d70f32059efce632ecd08.png

叶子直方图可以由其父节点直方图和兄弟节点直方图做差得到,速度可以提升一倍,实际构建树的过程中,可以先计算直方图小的叶子节点,然后利用直方图做差获得直方图大的兄弟节点,降低计算代价。

带深度限制的Leaf-wise算法

无论是决策树、GBDT、Adaboost还是XGBoost,其树的生长方式都是level-wise策略,即每一个节点都分裂成两个子节点,Xgboost因为采用了多线程优化,遍历一次数据可以分裂同一层的节点,但是实际上很多叶子的分裂增益很低,可以不用继续分裂下去,增加计算开销。

25bebbeab9ac453b58f488b1f35edb3a.png

leaf-wise生长策略,每次从当前所有叶子中寻找分裂增益最大的叶子进行分裂,leaf-wise可以降低误差提高精度,并且避免很多不必要的计算开销,但是缺点就是容易长出比较深的决策树,产生过拟合,因此会配合最大深度限制,保持高效率的同时,减缓过拟合。

单边梯度采样(Goss)

Goss算法从减少样本的角度出发排除大部分小梯度的样本,仅用剩下的样本计算信息增益,是一种在减少数据量和保证精度上平衡的算法。

AdaBoost中,样本权重是数据重要性的指标。然而在GBDT中没有原始样本权重,不能应用权重采样。幸运的是,我们观察到GBDT中每个数据都有不同的梯度值,对采样十分有用。即梯度小的样本,训练误差也比较小,说明数据已经被模型学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。

  • Goss首先将分裂的特征所有取值按照梯度绝对值大小降序排序(不用保存排序结果);
  • 选取绝对值最大的
    个数据;
  • 剩余的
    的较小梯度数据中随机选择
    个数据,并乘以一个常数
    ,这样模型会更关注训练不足的样本,而不改变原数据集的分布;
  • 最后用
    个数据来计算信息增益。

互斥特征捆绑算法(EFB)

高维度的数据往往存在很大的稀疏性,数据通常都是几千万维的稀疏数据,对于不同维度的数据合并一起,可以使得稀疏矩阵变成一个稠密矩阵。

  • 将特征按照非零值的个数进行排序;
  • 计算不同特征的冲突比率;(两个特征完全互斥时,比率为0)
  • 遍历每个特征并尝试合并特征,使冲突比率最小化;

支持类别特征

目前大部分的机器学习工具都无法有效的直接支持类别特征,一般需要将其转化为one-hot格式,Lightgbm优化了对于类别特征的支持,可以直接输入类别特征,不需要额外的0-1展开。

树模型遇到one-hot编码的类别特征时可能会遇到一些问题,比如切分方式只有是/否,很容易造成样本切分不均衡,切分增益小;另外这种不平衡的切分方式会使得一个叶节点只有极少数样本的情况出现,这对于决策树基于统计信息的学习会产生很大的影响。

8723c25316f7995917c113c3331e7a1e.png
左图为不平衡切分,右图为最优切分

Lightgbm处理分类特征主要是,在1个k维的类别特征中寻找最优切分。在枚举分割点之前,先把直方图按每个类别的均值进行排序,然后安装均值的结果依次枚举最优分割点。

  • 统计该类别特征每种离散值出现次数,排序,为每一个特征值建立bin容器,对于出现次数很少的bin容器可以抛弃掉;
  • 如果bin容器数里<4,可以使用One V Other的方法,逐个扫描每个bin,找出最佳分裂点,如果bins较多的话,先进行过滤,只让子集合较大的bin容器参加划分阈值计算,对每个符合条件的bin容器进行公式计算:当前bin容器所有样本一阶梯度之和/该bin容器下所有样本二阶梯度之和+正则项(cat_smooth)

539972844cb712512923535667d4306a.png

支持高效并行

  1. 特征并行

不同的机器在不同的特征集合上分别寻找最优的分割点,并在机器中同步最优分割点,这种方式对数据进行垂直划分,每台机器所含数据不同,使用不同的机器找到不同特征最优分割点,划分结果需要通过通信告知每台机器,增加额外复杂度。

Lightgbm是在每台机器上保存全部的训练数据,在得到最佳划分方案后可在本地执行划分而减少不必要的通信。

7454756da3d52d6044ba39d40b2cee2e.png

2. 数据并行

Lightgbm数据并行中使用分散规约把直方图合并的任务分摊到不同的机器,降低通信计算代价,利用直方图做差,减少一半通信量。

09102e3fdeb2e2e096bbc5447ba680a3.png

3. 投票并行

使用投票并行的方式,只合并部分特征的直方图从而达到降低通信量的目的,得到非常好的加速效果。

  • 本地找出Top k特征,并基于投票筛选出可能是最优分割点的特征;
  • 合并时只合并每个机器选出来的特征;

4485a660dd753a8347a5f79beae5bfb6.png

cache命中率优化

XGBoost在预排序之后,特征对梯度的访问是一种随机访问,不同的特征访问顺序不一样,无法优化cache,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

Lightgbm:

  • 所有特征采用相同的方式获得梯度(XGboost不同特征通过不同索引获得梯度),只需要对梯度进行排序可实现连续访问,提高缓存命中率。
  • 不需要存储行索引到叶子索引的数组,降低内存消耗,不存在Cache Miss问题。

和XGBoost的比较

XGBoost的缺点

  • 预排序空间消耗大,需保存数据特征值和排序结果(索引),需要训练集两倍的内存;
  • cache miss问题;
  • 遍历每个分割点都需要进行分裂增益计算,消耗代价大。

Lightgbm的优化

  • 基于histogram的决策树算法;
  • 单边梯度采样(Goss),减少大量小梯度数据,节省了很多时间和空间消耗;
  • 互斥捆绑特征(EFB),降维,减少特征维度;
  • 带深度限制的leaf-wise生长策略;
  • 支持类别特征;
  • 支持高效并行;
  • cache命中率优化。

参考博客:

LightGBM算法详解(教你一文掌握LightGBM所有知识点)_GFDGFHSDS的博客-CSDN博客_lightgbm详解​blog.csdn.net
3bfaee6fe6d0f967002c4399e9a710bd.png
LightGBM(lgb)详解_weixin_44023658的博客-CSDN博客_lgb介绍​blog.csdn.net
bc638518a2e4254b1e6a845d4681f740.png
LightGBM原理分析​www.jianshu.com
5cfce76e253e1a5d2adea1202f06f2ef.png

参考论文:

LightGBM: A Highly Efficient Gradient Boosting Decision Tree​papers.nips.cc

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

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

相关文章

python3 装饰器

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # encoding: utf-8 # author: eddy # contact: 278298125qq.com # site: http://my.oschina.net/eddylinux # file: study_deco.py # time: 2016-02-28 12:06 # version: 1.0#基础知识 #### 第一…

判断是否大于_电动车是否属于机动车的辩论要点

现行国家标准GB/T 24158-2009在3.1章节中对电动摩托车与电动轻便摩托车进行了定义,但将要在2019年4月1日实施的新标准却删除了该定义.在09标准中对电动轻便摩托车进行了如下定义:所以说,大于20km/h或大于40kg的电动车为机动车.但是这个标准删除了故对于电动车是否属于机动车不应…

Vim常用按键操作学习

对于Vi的学习&#xff0c;在这里算是做个笔记&#xff0c;对于一些常用的命令记录下&#xff0c;以后在使用起来会更方便&#xff0c;便于以后查阅使用&#xff0c;而不需要再从去搜索。读到这你应该看出&#xff0c;这是一个笔记了&#xff0c;会比较干了。补充一句&#xff0…

c++局部对象是什么_程序员每日一题-GCROOT对象

每天一题&#xff0c;进步一点答案&#xff1a;ABCD解析首先了解一下什么是GCROOT。了解这个概念之前&#xff0c;我们先了解一下垃圾回收。简单来说&#xff0c;JVM中程序的对象都会在堆区占据一定空间&#xff0c;如果不再使用了&#xff0c;JVM就会把它清除掉。那么如何判定…

项目如何用jetty运行_如何用Cloudbase Framework部署一个Vue项目?

Cloudbase Framework 是云开发官方出品的前后端一体化部署工具&#xff0c;无需修改业务代码&#xff0c;就能将 Vue 应用前后端一键托管部署在云开发平台。借助于 Cloudbase Framework&#xff0c;你可以一键部署一个已有的 Vue 项目&#xff0c;也可以快速创建一个新的 Vue 项…

在桌面上创建路径

2019独角兽企业重金招聘Python工程师标准>>> //实例化filemanager NSFileManager*fm[NSFileManager defaultManager]; //获取桌面路径并创建新路径 NSArray*URLs[fm URLsForDirectory:NSDesktopDirectory inDomains:NSUserDomainMask]; if (URLs.count>0) { NSUR…

小米手环无法模拟门卡_颜值与功能得到全面升级,小米手环4 NFC版上手体验

提到国产智能手环&#xff0c;相信不少人第一时间想到的就是小米手环系列&#xff0c;就在前不久的时候&#xff0c;小米米家正式举办了新品发布会&#xff0c;而小米手环4系列也正式登场。与前代产品相比&#xff0c;小米手环4系列在很多方面都进行了全面升级&#xff0c;比如…

[小记]Centos7网络配置DNS配置解决、yum出错解决。

2019独角兽企业重金招聘Python工程师标准>>> Centos7&#xff1a; yum install iptables-services Error List&#xff1a; Loaded plugins: fastestmirror, Error: cannot find a valid baseurl for repo : base/7/x86_64 ... Solutions&#xff1a; a) fastest…

怎么覆盖默认样式_图形设计软件cdr教程:设置默认字体

互联网时代&#xff0c;设计师们现在都是用电脑进行设计&#xff0c;那么对字体的需求就比较多&#xff0c;CorelDRAW作为强大的平面设计软件&#xff0c;怎么在其中设置某字体为默认字体呢&#xff1f;对很多新手朋友来说&#xff0c;可能不是很理解。本文小编介绍在CDR中设置…

LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。...

Guid id new Guid(item.pictureFile); var queryFile dbContext.file_upload.FirstOrDefault(u > u.ID id);转载于:https://www.cnblogs.com/lcyuhe/p/5230921.html

hive map格式转换为字符串_Hive与MySQL的不同之处之类型转换cast和covert函数

Hive&#xff1a;cast(xxx AS 类型)如&#xff1a;cast(tm AS bigint)附上Hive基本数据类型&#xff1a;数据类型所占字节开始支持版本TINYINT1byte&#xff0c;-128 ~ 127SMALLINT2byte&#xff0c;-32,768 ~ 32,767INT4byte,-2,147,483,648 ~ 2,147,483,647BIGINT8byte,-9,22…

LeetCode - 35. Search Insert Position

35. Search Insert Position Problems Link ---------------------------------------------------------------------------- Mean: 给定一个有序数组和一个数k&#xff0c;求k在这个数组中插入的下标. analyse: 二分查找. Time complexity: O(N) view code /*** -----…

的garch预测_随机森林预测

当涉及到预测数据(时间序列或其他类型的序列)时&#xff0c;人们会关注基本回归、ARIMA、ARMA、GARCH&#xff0c;甚至Prophet&#xff0c;但不排除使用随机森林来预测数据。随机森林通常被认为是一种分类技术&#xff0c;但回归问题绝对是随机森林可以处理的。在本文中&#x…

统计abacbacdadbc中的每个字母出现的次数,输出格式是:a(4)b(3)c(3)d(2)

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** 统计abacbacdadbc中的每个字母出现的次数&#xff0c;输出格式是&#xff1a;a(4)b(3)c(3)d(2)* * 选中TreeMa…

python isupper需要调包吗_密码强度等级

1# 思路&#xff1a;将统计情况放主函数中一起写&#xff0c;避免分开写时多次遍历密码字符串。while True:try:password input().strip()score 0 # 初始化得分为0# 长度得分if len(password) < 4:score 5elif 5 < len(password) < 7:score 10else:score 25# 字…

入侵分析十诫

这些年来&#xff0c;笔者一直积极参与入侵检测分析师的培训和发展工作&#xff0c;同时还担任了 SANS 信息安全课程《深入入侵检测》&#xff08;编号503&#xff09;的授课导师。笔者发现自己一直在不断改变对有效入侵检测的哲学认识。然而&#xff0c;不论该哲学如何演化&am…

python 寻找数组的中心索引_Leetcode724查找数组Python的中心索引,LeetCode724,寻找,python...

寻找数组的中心索引这一次打卡不知道又摸了多久的鱼&#xff0c;周五没做题&#xff0c;周日补上。题目给定一个整数类型的数组 nums&#xff0c;请编写一个能够返回数组“中心索引”的方法。我们是这样定义数组中心索引的&#xff1a;数组中心索引的左侧所有元素相加的和等于右…

算法--动态规划

动态规划需要弄清楚两个问题&#xff0c;首先子问题的最优解&#xff0c;其次重叠子问题。首先来看一个问题吧&#xff1a; 有3种硬币&#xff0c;对应的面值是1、2、4&#xff0c;如果要组成11元&#xff0c;最少需要几枚硬币呢&#xff1f; 思路&#xff1a;考虑组成0元&…

[译]机器人操作系统简介:终极机器人应用框架(上)

2019独角兽企业重金招聘Python工程师标准>>> [译]机器人操作系统简介&#xff1a;终极机器人应用框架 /*** 原文出处&#xff1a;https://www.toptal.com/robotics/introduction-to-robot-operating-system* author dogstar.huang <chanzonghuanggmail.com> 2…

底量超顶量超级大黑马指标源码_一旦出现底量超顶量形态,是超级大黑马诞生!...

一、底量超顶量当股价形成头部时&#xff0c;成交量必须放大&#xff0c;这种放量虽然不能和上市前三天相比&#xff0c;但也必须是相对天量&#xff0c;随即出现天价。但是&#xff0c;有些个股在形成头部之时&#xff0c;成交量只是象征性地放大&#xff0c;换手率低&#xf…