当前位置: 首页 > news >正文

聊聊XGBoost CatBoost LightGBM RF GBDT

树增强在机器学习算法中广泛应用。陈天奇提出了XGBoost,它是一种分布式机器学习系统,该系统能够纵向扩展树增强算法。XGBoost主要优势在于快速的并行构建树,并且同时具有容错性。XGBoost在单节点可以处理上千万的样本,通过分布式计算可以处理超过十亿级别的样本。

XGBoost的主要贡献在于

提出了一种基于块数据的方式来加速树的构建,同时利用内存和外部存储;

提出了一种树搜索的分布式近似算法;

构建了一种通用的、可靠的、具有容错性的分布式通信协议

下面简单介绍下树增强算法。给定一个样本集

其中样本数为n,特征数为m。集成树模型即为

其中K是树的棵树,

是回归树所构成的空间。

这里的q表示如何将某个样本映射到某个叶子节点的结构,w表示叶子节点的权重向量。简而言之,q是决定分类路径的,w能够决定最终的评分。在XGBoost中,集成树的目标函数的形式如下

这里的目标函数带有二阶约束。l是可微凸函数,

可以用来衡量模型的复杂度,并且可以防止过拟合。

XGBoost的训练方式是加法式的,每次迭代之后就会在目标函数中新加入一棵树。对于给定的树结构q,下面的打分函数可以用来衡量其效果,

这里的

分别是梯度和二阶梯度。打分计算示例如下

打分越小,就说明分支策略越好。

基于树的学习算法中关键在于寻求最优分割,这就需要针对所有特征枚举所有可能的分割。下面的算法伪代码给出了如何在单机上并行寻找最优分割,关键思想在于需要根据特征对样本进行排序,然后将梯度直方图加入到打分函数中。

基于树的学习算法中最耗时的就是对数据进行排序,这个过程的复杂度为 O(n log n)。陈天奇为了降低排序的复杂度,提出将数据重构到内存单元中,这里的内存单元称为块。每个块中的数据都存成CSC格式(Compressed Column Storage),每一列都是通过特征的取值来排序。这样操作的好处在于训练之前只需计算一次,之后的迭代中可以重复利用。将所有数据放入一个块中之后,可以通过线性扫描预排序的数据来寻找最优的分割。

如此一来,可以将构建树的复杂度降到 O(n)。

一个节点不能存储所有数据时,也可以将数据存在多个块中。此时需要在每个块中给出潜在的比较好的分割,然后基于这些潜在的分割和直方图来给出最终分割。当潜在分割 数目比较少时,基于多个块可以比较高效的得到直方图累加。这种情况下,找到比较好的潜在分割比较重要,可以利用近似分位数搜寻算法来给出潜在分割。此时分位数搜寻和直方图构建都可以达到线性时间复杂度,这种操作也比较容易并行得到特征的直方图。

XGBoost中比较关键的技术还有一个就是梯度的缓存。计算累加直方图时会由于丢失缓存而变得比较慢,为了解决这个问题,XGBoost在每个线程分配了内部缓冲,该缓冲可以存贮梯度,然后以小批的形式来计算直方图。数据量比较大时,这种缓存技术可以有效的缩短运行时间。

XGBoost还可以使用外存,数据量很大时,可以将数据存放在磁盘中,每次只取一部分数据。这样操作可以应对数据量大于单机的内存的情形,也可以较好的应对内存资源较少的情形。

在分布式算法中,计算分布式分位数预估以及直方图聚合时需要一种通信协议。XGBoost中采用的同步协议是Allreduce。这种协议在其他机器学习算法如线性模型中已经得以应用。Allreduce的主要优势在于从单机转换到分布式很直接。Allreduce能够在程序本身中自然的保持程序状态,这种特性在复杂机器学习算法中非常重要,因为机器学习算法的每次迭代中会设计多轮约简,并且在复杂机器学习算法中精确的检查点很难捕捉到中间阶段的程序状态。很多现有Allreduce在迭代之间不具容错性,陈天奇提出了一种容错Allreduce协议来解决这个问题。

该协议简而言之即为,对于出错的节点,调用检查点获取正常节点的状态来恢复该节点。然后再恢复Allreduce的结果。

下面是实验结果,主要跟python的sklearn以及R的gbm进行了对比。

随机森林能够给出特征的重要性,并且比较容易并行实现,但是在噪声较大时,随机森林容易过拟合。

GBDT 能够达到比较高的准确率,但是其中的各个决策树之间的关系是串联的,比较难以并行实现。

XGBoost中能够对列进行抽样,这样可以在一定程度上防止过拟合,也可以降低计算复杂度,此外,XGBoost能够比较好的处理缺失值。XGBoost基于预排序的策略可以比较准确地确定分支策略。但是,XGBoost的时间消耗和空间消耗都比较大。

LightGBM训练速度很快,非常高效,所需内存也少,准确率较高,能够分布式处理大数据。

CatBoost能够比较好的处理含有类别型特征的数据。

 

XGBoost源码简析

XGBoost支持的目标函数类型有线性回归、逻辑回归(概率回归、二值分类、分类评分)

泊松回归

生存分析

 

伽马回归

Tweedie回归

学习模块

预测

更新某一步迭代

增强某一步迭代

评价某一步迭代

计算打分

计算权重

添加分割

剪枝策略

RECOMMEND

推荐阅读

点击书封了解详情并购买

推荐语:大厂工程师撰写,帮你打通高效机器学习脉络,掌握竞赛神器XGBoost。以机器学习基础知识做铺垫,深入剖析XGBoost原理、分布式实现、模型优化、深度应用等。

往期精彩回顾

 书讯 | 4月书讯 | 一大波好书来袭,最美华章四月天

赠书 | 【第1期】MySQL为什么叫MySQL
干货 | 用户画像的核心技术盘点

收藏 | 有图有真相——图神经网络到底是什么?

相关文章:

  • 干货收藏!一文看懂8个常用Python库从安装到应用
  • 5G、物联网的加持下,区块链是否未来可期?
  • 大数据分析与挖掘——跟张良均老师学大数据
  • 【第2期】学大数据分析与挖掘?看这几本书就够了
  • 【收藏】记住这五个字,入门朴素贝叶斯模型
  • 当当 “书香节” | 每满100减50! 优惠码再减30!170元买400块的书!
  • 听说出版圈有人要模仿李佳琦直播卖书了?
  • “乔帮主”的云技术实践绝学,“降云十八掌”
  • 想转行做数据产品经理?这份书单赶紧收藏起来
  • 机器智能正在代替人类做的5件事
  • 五一在家宅5天?前端开发工程师必读书单送给你!(文末大彩蛋!)
  • 一文掌握数据库最核心的功能——优化器
  • 干货收藏!快速掌握用户画像项目的开发流程(附流程图)
  • OpenShift : 通往云原生、DevOps、微服务和Serverless的大门
  • 何谓云原生?如何走近云原生?
  • Debian下无root权限使用Python访问Oracle
  • Java的Interrupt与线程中断
  • js如何打印object对象
  • sessionStorage和localStorage
  • 阿里研究院入选中国企业智库系统影响力榜
  • 测试开发系类之接口自动化测试
  • 彻底搞懂浏览器Event-loop
  • 浏览器缓存机制分析
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 转载:[译] 内容加速黑科技趣谈
  • ​虚拟化系列介绍(十)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (全注解开发)学习Spring-MVC的第三天
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转) ns2/nam与nam实现相关的文件
  • (转)nsfocus-绿盟科技笔试题目
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net生成的类,跨工程调用显示注释
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [Avalon] Avalon中的Conditional Formatting.
  • [C#]winform部署yolov9的onnx模型
  • [c++] C++多态(虚函数和虚继承)
  • [English]英语积累本
  • [Flexbox] Using order to rearrange flexbox children
  • [Hibernate] - Fetching strategies
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...
  • [LeetBook]【学习日记】获取子字符串 + 颠倒子字符串顺序
  • [MICROSAR Adaptive] --- autosar官方文档阅读建议
  • [OS-Linux] CentOS 7.x 使用密钥登录安全设置
  • [Prism]Composite Application Guidance for WPF(9)——命令
  • [SpringBoot] SpringBoot JDBC访问数据库
  • [SystemC]SystemC Hierarchical Channels
  • [TLSR8266] 1、搭建tlsr8266编译框架在win服务器中