LightGBM——提升机器算法(图解+理论+安装方法+python代码)

原文地址:https://blog.csdn.net/huacha__/article/details/81057150

前言

LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升框架。可用于排序,分类,回归以及很多其他的机器学习任务中。

在竞赛题中,我们知道XGBoost算法非常热门,它是一种优秀的拉动框架,但是在使用过程中,其训练耗时很长,内存占用比较大。在2017年年1月微软在GitHub的上开源了一个新的升压工具--LightGBM。在不降低准确率的前提下,速度提升了10倍左右,占用内存下降了3倍左右。因为他是基于决策树算法的,它采用最优的叶明智策略分裂叶子节点,然而其它的提升算法分裂树一般采用的是深度方向或者水平明智而不是叶,明智的。因此,在LightGBM算法中,当增长到相同的叶子节点,叶明智算法比水平-wise算法减少更多的损失。因此导致更高的精度,而其他的任何已存在的提升算法都不能够达。与此同时,它的速度也让人感到震惊,这就是该算法名字   的原因。

  • 2014年3月,XGBOOST最早作为研究项目,由陈天奇提出

     (XGBOOST的部分在我的另一篇博客里:https://blog.csdn.net/huacha__/article/details/81029680

  • 2017年1月,微软发布首个稳定版LightGBM

在微软亚洲研究院AI头条分享中的「LightGBM简介」中,机器学习组的主管研究员王太峰提到:微软DMTK团队在github上开源了性能超越其它推动决策树工具LightGBM后,三天之内星了1000+次,叉了超过200次。知乎上有近千人关注“如何看待微软开源的LightGBM?”问题,被评价为“速度惊人”,“非常有启发”,“支持分布式” “代码清晰易懂”,“占用内存小”等。以下是微软官方提到的LightGBM的各种优点,以及该项目的开源地址。

科普链接:如何玩转LightGBM https://v.qq.com/x/page/k0362z6lqix.html

目录

前言

一、"What We Do in LightGBM?"

二、在不同数据集上的对比

三、LightGBM的细节技术

1、直方图优化

2、存储记忆优化

3、深度限制的节点展开方法

4、直方图做差优化

5、顺序访问梯度

6、支持类别特征

7、支持并行学习

四、MacOS安装LightGBM

五、用python实现LightGBM算法


一、"What We Do in LightGBM?"

下面这个表格给出了XGBoost和LightGBM之间更加细致的性能对比,包括了树的生长方式,LightGBM是直接去选择获得最大收益的结点来展开,而XGBoost是通过按层增长的方式来做,这样呢LightGBM能够在更小的计算代价上建立我们需要的决策树。当然在这样的算法中我们也需要控制树的深度和每个叶子结点的最小数据量,从而减少过拟合。

小小翻译一下,有问题还望指出

 XGBoostLightGBM
树木生长算法

按层生长的方式

		<p>有利于工程优化,但对学习模型效率不高</p></td><td style="width:306px;"><p>直接<strong>选择最大收益的节点</strong>来展开,在更小的计算代价上去选择我们需要的决策树</p><p>控制树的深度和每个叶子节点的数据量,能减少过拟合</p></td></tr><tr><td style="width:115px;">划分点搜索算 法</td><td style="width:207px;">对特征预排序的方法</td><td style="width:306px;">直方图算法:将特征值分成许多小筒,进而在筒上搜索分裂点,减少了计算代价和存储代价,得到更好的性能。另外数据结构的变化使得在细节处的变化理上效率会不同</td></tr><tr><td style="width:115px;">内存开销</td><td style="width:207px;">8个字节</td><td style="width:306px;">1个字节</td></tr><tr><td style="width:115px;">划分的计算增益</td><td style="width:207px;">数据特征</td><td style="width:306px;">容器特征</td></tr><tr><td style="width:115px;">高速缓存优化</td><td style="width:207px;">无</td><td style="width:306px;">在Higgs数据集上加速40%</td></tr><tr><td style="width:115px;">类别特征处理</td><td style="width:207px;">无</td><td style="width:306px;">在Expo数据集上速度快了8倍</td></tr></tbody></table></div><h1 id="%E5%9C%A8%E4%B8%8D%E5%90%8C%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8A%E7%9A%84%E5%AF%B9%E6%AF%94"><a name="t2"></a>二、在不同数据集上的对比</h1>

higgs和expo都是分类数据,yahoo ltr和msltr都是排序数据,在这些数据中,LightGBM都有更好的准确率和更强的内存使用量。

准确率   

内存使用情况

计算速度的对比,完成相同的训练量XGBoost通常耗费的时间是LightGBM的数倍之上,在higgs数据集上,它们的差距更是达到了15倍以上。

三、LightGBM的细节技术

1、直方图优化

XGBoost中采用预排序的方法,计算过程当中是按照value的排序,逐个数据样本来计算划分收益,这样的算法能够精确的找到最佳划分值,但是代价比较大同时也没有较好的推广性。

在LightGBM中没有使用传统的预排序的思路,而是将这些精确的连续的每一个value划分到一系列离散的域中,也就是筒子里。以浮点型数据来举例,一个区间的值会被作为一个筒,然后以这些筒为精度单位的直方图来做。这样一来,数据的表达变得更加简化,减少了内存的使用,而且直方图带来了一定的正则化的效果,能够使我们做出来的模型避免过拟合且具有更好的推广性。

看下直方图优化的细节处理

可以看到,这是按照bin来索引“直方图”,所以不用按照每个“特征”来排序,也不用一一去对比不同“特征”的值,大大的减少了运算量。

2、存储记忆优化

当我们用数据的bin描述数据特征的时候带来的变化:首先是不需要像预排序算法那样去存储每一个排序后数据的序列,也就是下图灰色的表,在LightGBM中,这部分的计算代价是0;第二个,一般bin会控制在一个比较小的范围,所以我们可以用更小的内存来存储

3、深度限制的节点展开方法

LightGBM使用了带有深度限制的节点展开方法(Leaf-wise)来提高模型精度,这是比XGBoost中Level-wise更高效的方法。它可以降低训练误差得到更好的精度。但是单纯的使用Leaf-wise可能会生长出比较深的树,在小数据集上可能会造成过拟合,因此在Leaf-wise之上多加一个深度限制

4、直方图做差优化

直方图做差优化可以达到两倍的加速,可以观察到一个叶子节点上的直方图,可以由它的父亲节点直方图减去它兄弟节点的直方图来得到。根据这一点我们可以构造出来数据量比较小的叶子节点上的直方图,然后用直方图做差来得到数据量比较大的叶子节点上的直方图,从而达到加速的效果。

5、顺序访问梯度

预排序算法中有两个频繁的操作会导致cache-miss,也就是缓存消失(对速度的影响很大,特别是数据量很大的时候,顺序访问比随机访问的速度快4倍以上  )。

  • 对梯度的访问:在计算增益的时候需要利用梯度,对于不同的特征,访问梯度的顺序是不一样的,并且是随机的
  • 对于索引表的访问:预排序算法使用了行号和叶子节点号的索引表,防止数据切分的时候对所有的特征进行切分。同访问梯度一样,所有的特征都要通过访问这个索引表来索引。

这两个操作都是随机的访问,会给系统性能带来非常大的下降。

LightGBM使用的直方图算法能很好的解决这类问题。首先。对梯度的访问,因为不用对特征进行排序,同时,所有的特征都用同样的方式来访问,所以只需要对梯度访问的顺序进行重新排序,所有的特征都能连续的访问梯度。并且直方图算法不需要把数据id到叶子节点号上(不需要这个索引表,没有这个缓存消失问题)

6、支持类别特征

传统的机器学习一般不能支持直接输入类别特征,需要先转化成多维的0-1特征,这样无论在空间上还是时间上效率都不高。LightGBM通过更改决策树算法的决策规则,直接原生支持类别特征,不需要转化,提高了近8倍的速度

7、支持并行学习

LightGBM原生支持并行学习,目前支持特征并行(Featrue Parallelization)数据并行(Data Parallelization)两种,还有一种是基于投票的数据并行(Voting Parallelization)

  • 特征并行的主要思想是在不同机器、在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
  • 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点

LightGBM针对这两种并行方法都做了优化。

  • 特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信。
  • 数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。
  • 基于投票的数据并行(Voting Parallelization)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。

下图更好的说明了以上这三种并行学习的整体流程:

在直方图合并的时候,通信代价比较大,基于投票的数据并行能够很好的解决这一点。

 

四、MacOS安装LightGBM

  1. #先安装cmake和gcc,安装过的直接跳过前两步
  2. brew install cmake
  3. brew install gcc
  4. git clone --recursive https://github.com/Microsoft/LightGBM
  5. cd LightGBM
  6. #在cmake之前有一步添加环境变量
  7. export CXX=g++-7 CC=gcc-7
  8. mkdir build ; cd build
  9. cmake ..
  10. make -j4
  11. cd ../python-package
  12. sudo python setup.py install

来测试一下:

大功告成!

值得注意的是:pip list里面没有lightgbm,以后使用lightgbm需要到特定的文件夹中运行。我的地址是:

/Users/ fengxianhe / LightGBM /python-package

 

五,用python实现LightGBM算法

为了演示LightGBM在蟒蛇中的用法,本代码以sklearn包中自带的鸢尾花数据集为例,用lightgbm算法实现鸢尾花种类的分类任务。

  1. # coding: utf-8
  2. # pylint: disable = invalid-name, C0111
  3. # 函数的更多使用方法参见LightGBM官方文档:http://lightgbm.readthedocs.io/en/latest/Python-Intro.html
  4. import json
  5. import lightgbm as lgb
  6. import pandas as pd
  7. from sklearn.metrics import mean_squared_error
  8. from sklearn.datasets import load_iris
  9. from sklearn.model_selection import train_test_split
  10. from sklearn.datasets import make_classification
  11. iris = load_iris() # 载入鸢尾花数据集
  12. data=iris.data
  13. target = iris.target
  14. X_train,X_test,y_train,y_test =train_test_split(data,target,test_size=0.2)
  15. # 加载你的数据
  16. # print('Load data...')
  17. # df_train = pd.read_csv('../regression/regression.train', header=None, sep='\t')
  18. # df_test = pd.read_csv('../regression/regression.test', header=None, sep='\t')
  19. #
  20. # y_train = df_train[0].values
  21. # y_test = df_test[0].values
  22. # X_train = df_train.drop(0, axis=1).values
  23. # X_test = df_test.drop(0, axis=1).values
  24. # 创建成lgb特征的数据集格式
  25. lgb_train = lgb.Dataset(X_train, y_train) # 将数据保存到LightGBM二进制文件将使加载更快
  26. lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # 创建验证数据
  27. # 将参数写成字典下形式
  28. params = {
  29. 'task': 'train',
  30. 'boosting_type': 'gbdt', # 设置提升类型
  31. 'objective': 'regression', # 目标函数
  32. 'metric': {'l2', 'auc'}, # 评估函数
  33. 'num_leaves': 31, # 叶子节点数
  34. 'learning_rate': 0.05, # 学习速率
  35. 'feature_fraction': 0.9, # 建树的特征选择比例
  36. 'bagging_fraction': 0.8, # 建树的样本采样比例
  37. 'bagging_freq': 5, # k 意味着每 k 次迭代执行bagging
  38. 'verbose': 1 # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
  39. }
  40. print('Start training...')
  41. # 训练 cv and train
  42. gbm = lgb.train(params,lgb_train,num_boost_round=20,valid_sets=lgb_eval,early_stopping_rounds=5) # 训练数据需要参数列表和数据集
  43. print('Save model...')
  44. gbm.save_model('model.txt') # 训练后保存模型到文件
  45. print('Start predicting...')
  46. # 预测数据集
  47. y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration) #如果在训练期间启用了早期停止,可以通过best_iteration方式从最佳迭代中获得预测
  48. # 评估模型
  49. print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5) # 计算真实值和预测值之间的均方根误差

输出结果:

可以看到预测值和真实值之间的均方根误差为0.722972。

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

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

相关文章

这个NLP工具,玩得根本停不下来

今天推荐一个有趣的自然语言处理公众号AINLP&#xff0c;关注后玩得根本停不下来&#xff01;AINLP的维护者是我爱自然语言处理&#xff08;52nlp&#xff09;博主&#xff0c;他之前在腾讯从事NLP相关的研发工作&#xff0c;目前在一家创业公司带技术团队。AINLP公众号的定位是…

论文浅尝 | 基于Universal Schema与Memory Network的知识+文本问答

来源&#xff1a;ACL 2017链接&#xff1a;http://aclweb.org/anthology/P17-2057本文提出将 Universal schema 用于自然语言问答中&#xff0c;通过引入记忆网络&#xff0c;将知识库与文本中大量的事实信息结合起来&#xff0c;构建出一个由问答对&#xff08;question-answe…

数据结构--图 Graph

文章目录1. 概念2. 存储方法2.1 邻接矩阵 Adjacency Matrix2.2 邻接表 Adjacency List3. 图的遍历3.1 广度优先搜索BFS&#xff08;Breadth First Search&#xff09;3.2 BFS代码&#xff08;基于邻接表&#xff09;3.3 深度优先搜索DFS&#xff08;Depth First Search&#xf…

2019最新拼多多Java面试题:幻影读+分段锁+死锁+Spring Cloud+秒杀

拼多多Java一面 简短自我介绍 事务的ACID&#xff0c;其中把事务的隔离性详细解释一遍 脏读、幻影读、不可重复读 红黑树、二叉树的算法 平常用到哪些集合类&#xff1f;ArrayList和LinkedList区别&#xff1f;HashMap内部数据结构&#xff1f;ConcurrentHashMap分段锁&…

视频问答兴起,多跳问答热度衰退,92篇论文看智能问答的发展趋势

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 舒意恒&#xff08;南京大学硕士生&#xff0c;知识图谱方向&#xff09;编 | 北大小才女小轶2019年的时候&#xff0c;舒意恒Y.Shu整理了一份《2019年&#xff0c;智能问答有哪些研究方向&#xff1f;…

论文浅尝 | 知识图谱相关实体搜索

本文转载自公众号&#xff1a;南大Websoft。相关搜索&#xff08;Relevance Search&#xff09;是信息检索中的一个经典问题&#xff0c;相关搜索是指给定一个查询实体&#xff0c;返回与其相关度最高的实体&#xff08;一个类似的问题Similarity Search&#xff0c;一般来说指…

最新美团Java面试题目(共3面)

一面 线程池用过哪些&#xff0c;线程池有哪些参数&#xff0c;然后问我几个常用线程池的用法和实际场景问题。 集合框架的知识&#xff0c;hashmap&#xff0c;ArrayList&#xff0c;LinkedList源码相关知识&#xff0c;基本整个介绍了一遍&#xff0c;与hastable&#xff0c…

PersonGraphDataSet近十万的开放人物关系图谱项目

PersonGraphDataSet PersonGraphDataSet, nearly 10 thousand person2person relationship facts that build from extraction method, which can be applied to person kg search and inference applications。 人物图谱数据集&#xff0c;近十万的人物关系图谱事实数据库&am…

图Graph--寻找二度好友(BFS应用)

社交网络可以用图来表示&#xff08;查阅图的概念&#xff09;。 寻找二度好友&#xff0c;这个问题就非常适合用图的广度优先搜索BFS算法来解决&#xff0c;因为广度优先搜索是层层往外推进的。 首先&#xff0c;遍历与起始顶点最近的一层顶点&#xff0c;也就是用户的一度好…

技术动态 | TechKG:一个面向中文学术领域的大型知识图谱

作者&#xff1a;东北大学-知识图谱研究组 任飞亮TechKG 是一个面向中文、面向学术、多领域的大型知识图谱知识库&#xff0c;知识库由“东北大学-知识图谱研究组”开发完成。和已有知识图谱如 Freebase 或 YAGO 相比&#xff0c;TechKG 具有如下主要特点&#xff1a;1、是一个…

技术总结:图算法、开源工具及其在工业界的应用场景概述

知识图谱本质上是一种图结构&#xff0c;在图内部数据规模大且质量高、外部算力足够的情况下&#xff0c;充分利用好图算法&#xff0c;能够最大程度地发挥出其数据价值。实际上&#xff0c;图&#xff08;Graph&#xff09;是一个常见的数据结构&#xff0c;现实世界中有很多很…

SIGIR2020 | 淘宝提出结合知识图谱与大规模推荐的新框架ATBRG

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 江城编 | 夕小瑶今天分享一篇淘宝发表在 SIGIR2020 上的关于知识图谱应用于大规模推荐的论文《ATBRG: Adaptive Target-Behavior Relational Graph Network for Effective Recommendation》&#xff0c…

图Graph--农夫过河问题(BFS/DFS应用)

农夫过河问题&#xff1a; /*** description: 农夫过河问题&#xff08;羊&#xff0c;白菜&#xff0c;狼&#xff09;&#xff0c;一次最多带一个东西过河&#xff0c;* 农夫不在的情况下羊会吃白菜&#xff0c;狼会吃羊&#xff0c;如何平安过河* author…

机器学习之「二分类算法」-----银行营销案例分析

原文地址&#xff1a; <di&#xff1a;https://blog.csdn.net/weixin_44696674/article/details/88231922iv id“article_content” class“article_content clearfix” data-track-view"{“mod”:“popu_307”,“con”:",https://blog.csdn.net/weixin_44696674/…

论文浅尝 | 直译优于翻译?混合语言的知识库问答方法研究

动机作者思考&#xff0c;如果一个人懂多个语言&#xff0c;那么只要他知道某一语言的某个事实&#xff0c;就能以它作为另一语言问题的答案&#xff0c;同时希望证明计算机是否也能做到这一点&#xff0c;并完成混合语言的简单问题知识问答任务&#xff08;Code-Mix Simple Qu…

2018最新Java面试78题:数据结构+网络+NoSQL+分布式架构

算法和数据结构 数组、链表、二叉树、队列、栈的各种操作&#xff08;性能&#xff0c;场景&#xff09; 二分查找和各种变种的二分查找 各类排序算法以及复杂度分析&#xff08;快排、归并、堆&#xff09; 各类算法题&#xff08;手写&#xff09; 理解并可以分析时间和空…

工程实践:基于规则模式的军事和医药领域知识图谱问答快速实现

知识结构化问答是知识图谱的一个重要的应用方向&#xff0c;虽然现在许多真实的使用体验上&#xff0c;会被评价为“鸡肋且智障”&#xff0c;并且在落地上还没有太多的付费场景&#xff0c;但也不乏有不少学生、公司、机构在尝试花时间去做这个事情。当前&#xff0c;医疗知识…

图Graph--最小生成树

文章目录1.概念2.构造最小生成树Prim算法3.构造最小生成树Kruskal算法1.概念 对图运用不同的遍历方法就可能得到图的不同遍历顺序&#xff0c;每一种遍历顺序对应于一棵生成树对于无向连通图&#xff0c;所有的生成树中必有一棵树的所有边的权的总和最小的&#xff0c;称之为最…

Longformer:超越RoBERTa,为长文档而生的预训练模型

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | ChrisCao, 小轶前言今天要与大家分享的是AllenAI今年发表的最新工作&#xff0c;Longformer——一种可高效处理长文本的升级版Transformer。作者团队提供了开源代码&#xff0c;大家可快速复现&#xff…

工程实践:基于规则句法的事件关系与主谓宾三元组抽取项目实现

目前&#xff0c;知识图谱在学术界如火如荼地进行&#xff0c;但受限于知识图谱各个环节中的性能问题&#xff0c;还尚未能够在工业界大规模运用。而与知识图谱中以实体为知识节点&#xff0c;实体关系为实体关系边对知识进行组织不同&#xff0c;以事件作为节点&#xff0c;事…