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中设置…

的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…

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

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

AIKit v4.11.0 – WordPress AI 自动编写器、聊天机器人、写作助手和内容重定向器 / OpenAI GPT 插件

AIKit v4.11.0&#xff1a;WordPress的AI革命 一、引言 AIKit v4.11.0是一款为WordPress用户精心设计的强大插件&#xff0c;该插件集成了OpenAI的GPT-3技术&#xff0c;为用户提供了前所未有的AI写作和聊天机器人功能。此版本的推出&#xff0c;将WordPress的功能扩展到了全新…

精华阅读第6期|程序猿的世界,你不懂!

上周&#xff0c;微信圈被一篇文章刷屏了&#xff01;那就是西乔出品的《你为什么总招不到程序员&#xff1f;》&#xff0c;西乔的漫画之所以这么火&#xff0c;很重要的原因就是她懂程序猿的生活&#xff0c;同时作品也能够引起大家的共鸣。其实&#xff0c;移动开发精英俱乐…

恒生估值系统_恒生指数和恒生国企指数投资价值分析

恒生指数和恒生国企指数都是港股的大蓝筹指数。恒生指数是从香港股票市场挑选出50只优质蓝筹股票组成的指数。恒生国企指数又称为H股指数。H股指注册地在内地&#xff0c;但是上市地在香港的外资股票。恒生国企指数的成分股数目是没有限制的&#xff0c;但是必须为市值最大&…

java程序练习

数组求和作业 开发环境&#xff1a;java 工具&#xff1a;eclipse 两种数据类型excel和csv 在同学建议下&#xff0c;我选择用csv文件打开&#xff0c;这就引来了第一个问题&#xff0c;在java中如何调用csv文件。以下是我百度的结果 http://www.educity.cn/java/627496.html &…

hwd是长宽高吗_五菱皮卡要来了,五种形态任你选,颜值是你期待的吗?

近日&#xff0c;网友上传了五菱皮卡的渲染图&#xff0c;引起了大家对五菱皮卡的热烈讨论。在刚过去的2020年&#xff0c;五菱凭借性价比超高的宏光MINI EV成为了新能源领域的领头羊&#xff0c;而后推出的‘大四座’家用车五菱凯捷也取得了五万台的预定量&#xff0c;五菱一时…

原创 通过PEB获得进程路径 (附完整工程)

完整工程&#xff1a;http://files.cnblogs.com/files/Gotogoo/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%99%A8%28x86%26%26x64%29.zip PEB&#xff08;Process Environment Block&#xff0c;进程环境块&#xff09;存放进程信息&#xff0c;每个进程都有自己的PEB信息。位于…

Windbg SOS and CLR版本不一致的解决方案

由于测试服务环境与Windbg运行环境的差异&#xff0c;这就可能出现Windbg在分析dump文件时.net sos.dll和mscordacwks.dll版本不一致问题&#xff0c;从而导致windbg调试器的扩展命令无法正常使用&#xff0c;具体的解决方法如下&#xff1a;1.首先定义Windgb symbols路径&…

[DIV/CSS] 【译】60个有用CSS代码片段

2019独角兽企业重金招聘Python工程师标准>>> 1、垂直对齐 如果你用CSS&#xff0c;则你会有困惑&#xff1a;我该怎么垂直对齐容器中的元素&#xff1f;现在&#xff0c;利用CSS3的Transform&#xff0c;可以很优雅的解决这个困惑&#xff1a; .verticalcenter{posi…