lightGBM与XGBoost的区别:(来源于:http://baijiahao.baidu.com/s?id=1588002707760744935&wfr=spider&for=pc)

切分算法(切分点的选取)

占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。

降低了计算的代价:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。(相当于LightGBM牺牲了一部分切分的精确性来提高切分的效率,实际应用中效果还不错)

空间消耗大,需要保存数据的特征值以及特征排序的结果(比如排序后的索引,为了后续快速计算分割点),需要消耗两倍于训练数据的内存

时间上也有较大开销,遍历每个分割点时都需要进行分裂增益的计算,消耗代价大

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

XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;但这种做法有以下缺点

LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点在于

决策树生长策略上:

XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)

LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此 LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

histogram 做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

直接支持类别特征:LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开。并在决策树算法上增加了类别特征的决策规则。

分布式训练方法上(并行优化)

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

在数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行(Parallel Voting)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。

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

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

原始

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

Cache命中率优化

基于直方图的稀疏特征优化

DART(Dropout + GBDT)

GOSS(Gradient-based One-Side Sampling):一种新的Bagging(row subsample)方法,前若干轮(1.0f / gbdtconfig->learning_rate)不Bagging;之后Bagging时, 采样一定比例g(梯度)大的样本

LightGBM优点小结(相较于XGBoost)

速度更快

内存消耗更低

分裂点寻找算法

  • Basic Exact Greedy Algorithm

在每一次寻找中,枚举所有可能的分裂点,然后利用score确定最佳分裂点。
代表的实现软件有:sklearn, R的GBM, 单机版的XGBoost。
算法首先对特征进行排序,然后依次访问数据,并以此数据该维特征的值作为分裂点,计算score。

  • 近似方法
    精确寻找不适用与分布式数据,近似方法通过特征的分布,按照百分比确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。
    两种策略:全局策略和局部策略。在全局策略中,对每一个特征确定一个全局的候选分裂点集合,就不再改变;而在局部策略中,每一次分裂
    都要重选一次分裂点。前者需要较大的分裂集合,后者可以小一点。论文中对比了补充候选集策略与分裂点数目对模型的影响。
    全局策略需要更细的分裂点才能和局部策略差不多

xgboost gbdt特征点分烈点相关推荐

  1. 决策树是如何选择特征和分裂点?

    ©PaperWeekly 原创 · 作者|贲忠奇 单位|便利蜂算法工程师 研究方向|推荐算法.反作弊 缘起 在解决回归和分类问题的时候,一般会使用 Random Forest.GBDT.XGBoost ...

  2. XGBoost输出特征重要性以及筛选特征

    XGBoost输出特征重要性以及筛选特征 1,梯度提升算法是如何计算特征重要性的? 使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个属性的重要性得分.一般来说,重要性分数,衡量了特征在 ...

  3. ML之xgboost:利用xgboost算法(特征筛选和GridSearchCV)对数据集实现回归预测

    ML之xgboost:利用xgboost算法(特征筛选和GridSearchCV)对数据集实现回归预测 目录 输出结果 实现代码 输出结果 ['EnterCOD', 'EnterBOD', 'Ente ...

  4. 一日一学--如何对数值型特征进行分桶

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 120 篇文章,本文大约 1200 字,阅读大约需要 3 分钟 今天这 ...

  5. ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略

    ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略 目录 三.模型训练 ...

  6. [机器学习] 树模型(xgboost,lightgbm)特征重要性原理总结

    在使用GBDT.RF.Xgboost等树类模型建模时,往往可以通过 feature_importance 来返回特征重要性,各模型输出特征重要性的原理与方法 一 计算特征重要性方法 首先,目前计算特征 ...

  7. XGBoost中特征重要性计算方法对比

    XGBoost作为比赛大杀器,内置了几种重要性函数,今天我们就在这篇文章中梳理三种常见的特征重要性计算方法,并思考他们的使用场景. xgboost.plot_importance(booster, a ...

  8. 特征选择 GBDT 特征重要度

    Tree ensemble算法的特征重要度计算 集成学习因具有预测精度高的优势而受到广泛关注,尤其是使用决策树作为基学习器的集成学习算法.树的集成算法的著名代码有随机森林和GBDT.随机森林具有很好的 ...

  9. Xgboost筛选特征重要性

    基本思想 根据结构分数的增益情况计算出来选择哪个特征的哪个分割点,某个特征的重要性,就是它在所有树中出现的次数之和. 使用代码 import pandas as pd import xgboost a ...

最新文章

  1. Docker部署微服务详解
  2. oracle用dba登陆怎么登,以SQLDBA身份登录isqlplus
  3. 关于注册登陆时候进行的归档解档--严焕培
  4. 方案解析:纸张计数精准测量出200张纸?!第1名妥妥的
  5. linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
  6. Netty构建游戏服务器(一)--基本概念与原理
  7. 史上最新最全的来自成都的Azure系列文章,助你上云!老少皆宜,童叟无欺!
  8. 如何将pdf导出html,如何导出PDF版、导出EXE版、导出HTML离线版?
  9. c语言变长数组参数,使用gdb跟踪C语言中变长数组的实现
  10. mssql 设置自增字段的起始值
  11. powermockito测试私有方法_使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十)在项目中准备测试环境...
  12. svn一些基本操作含义
  13. 23种设计模式之适配器模式(Adapter模式)
  14. spring中的web上下文,spring上下文,springmvc上下文区别(超详细)
  15. 基于Mybatis的语音播报随机点到系统
  16. 数据结构之算法——递归
  17. 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH03-UDP千兆光通信
  18. 论文笔记:Meta-attention for ViT-backed Continual Learning CVPR 2022
  19. 2020华为春招面试:一面二面三面(一下午4h左右完成)已挂
  20. linux ps-x,Linux总结----PS命令

热门文章

  1. 重庆市计算机二级证丢失,重庆计算机二级证书丢了怎么办
  2. mysql bin.000013_mysql的binlog安全删除的一种方法
  3. formdata接收数据怎么接收数组_LBT是什么?怎么增加通信可靠性?
  4. 微型计算机3月2017,2017年3月计算机一级基础及MSOffice习题
  5. java查询类提供的方法_查询一个类的方法和构建器的JAVA程序
  6. aem是什么意思_一台400匹的宽体RX7不装转子引擎,那装的是什么?
  7. java程序中可以如何异常处理?_如何处理罗茨鼓风机在运行过程中出现异常噪音和叶片的运行特性...
  8. python eel 多线程_利用Eel使JavaScript调用Python程序
  9. bim 模型web页面展示_BIM+装配式建筑工程师2020年必须拿下的技能证书
  10. 归并排序比较次数_归并排序「从入门到放弃」