XGBoost是GBDT的改进和重要实现,主要在于:

  1. 提出稀疏感知(sparsity-aware)算法。
  2. 加权分位数快速近似学习算法。
  3. 缓存访问模式,数据压缩和分片上的实现上的改进。
  4. 加入了Shrinkage和列采样,一定程度上防止过拟合。

提升算法

  XGBoost也是一个加法模型,首先其在目标函数中加入了正则化项:

  泰勒级数

  yi(t)是第i个实例在第t次迭代的预测值,需要加入 ft来最小化以下目标

  通过泰勒二阶展开近似来快速优化目标函数

  其中

  即l的一阶和二阶导数。移除常数项得到:

  定义 Ij = {i|q(xi)=j}作为叶子结点j的实例集合。将上式展开为:

  计算权重公式:

  带入目标函数得(一阶和二阶导数合并成了一项):

  这一项算出的值就是第t棵树要优化目标函数,使其尽量小。下图展示计算过程,目标函数越小越好。

  枚举所有可能结构的树是不可能的,通过贪心算法从叶节点开始迭代得添加分支,IL、IR分别是分割点左右分支的实例集,分割的损失下降定义为:

Weighted Quantile Sketch-加权分位

  近似算法通过特征百分位点作为划分候选。使集合代表样本点的第k个特征值和二阶导数。定义排序函数:

  上式表示特征值小于z的样本占整体的比例。目标是找到候选切分点{sk1, sk2, ···,skl}使得:

  其中ε是近似因子,这意味着有1/ε个候选点,每个数据点权重是hi,下式说明为什么用它做权重:

  其中hi即为平方损失的权重,对于大数据集,找到满足条件的候选分裂是非常重要的。以前的分位算法中没有权重,因为加权数据集没有分位数。

  为了解决这个问题,XGBoost提出了新颖的分布式加权的分位数算法,作者理论证明它可以处理加权的数据。总的思路是提出一个支持合并和修剪操作的数据结构,每个操作都被证明保持一定的准确性水平。 证明见xgboost-supp.pdf

Sparsity-aware Split Finding

  真实数据很多都是稀疏的数据,有很多原因:1.数据中有缺失值。2.统计中频繁出现0条目。3.人工特征工程造成,例如one-hot。为了算法稀疏感知,XGBoost每个树节点加入了默认方向,如图:

  当数据值缺失的时候,样本被划分到默认方向,默认方向是通过学习数据获得的,其算法如下图,关键提升在于只看不缺失的实例进入Ik,所提出的算法将不存在作为缺失值处理,并学习处理缺失值的最佳方向。 通过将枚举限制为恒定的解决方案,当不存在对应于用户指定的值时,也可以应用相同的算法。

  大多数现有的树学习算法或者只是针对密集数据进行优化,或者需要特定的程序来处理有限的情况,如分类编码。 XGBoost以统一的方式处理所有的稀疏模式。 更重要的是,作者的方法利用稀疏性使计算复杂度与输入中非缺失条目的数量成线性关系。 下图显示了稀疏感知和对Allstate-10K数据集简单实现的比较。 作者发现稀疏感知算法的运行速度比原始版本快50倍。这证实了稀疏感知算法的重要性。

参考

XGBoost原理-XGBoost A Scalable Tree Boosting System

XGBoost原理简介的更多相关文章

  1. xgboost原理及应用

    1.背景 关于xgboost的原理网络上的资源很少,大多数还停留在应用层面,本文通过学习陈天奇博士的PPT 地址和xgboost导读和实战 地址,希望对xgboost原理进行深入理解. 2.xgboo ...

  2. storm 原理简介及单机版安装指南——详细版【转】

    storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...

  3. Java进阶(二十四)Java List集合add与set方法原理简介

    Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...

  4. kafka原理简介并且与RabbitMQ的选择

    kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...

  5. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  6. 一文读懂机器学习大杀器XGBoost原理

    http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起 ...

  7. xgboost原理

    出处http://blog.csdn.net/a819825294 1.序 距离上一次编辑将近10个月,幸得爱可可老师(微博)推荐,访问量陡增.最近毕业论文与xgboost相关,于是重新写一下这篇文章 ...

  8. Nginx 负载均衡原理简介与负载均衡配置详解

    Nginx负载均衡原理简介与负载均衡配置详解   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...

  9. Nginx 反向代理工作原理简介与配置详解

    Nginx反向代理工作原理简介与配置详解   by:授客  QQ:1033553122   测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...

随机推荐

  1. idea内存溢出解决方法

    在Run/Debug configuration 的vm options里面输入 -server -XX:PermSize=128M -XX:MaxPermSize=256m eclipse: -Xm ...

  2. SSISDB8:查看SSISDB记录Package执行的消息

    在执行Package时,SSISDB都会创建唯一的OperationID 和 ExecutionID,标识对package执行的操作和执行实例(Execution Instance),并记录opera ...

  3. sql 存储过程笔记3

    16:22 2014/1/26一.定义变量--简单赋值declare @a int set @a = 5 print @a --使用select语句赋值declare @user1 nvarchar( ...

  4. windows10 L2tP nat 下无法连接的处理

    事件查看器中没有错误代码显示. Windows 10 L2TP/IPsec Manual Setup Instructions Bold items are things you will click ...

  5. 关于 reduce 和 map

    一  reduce() 函数 是python 的 模块的内容,是关于累 的 计算 在调用的时候先导入reduce模块 reduce() 接收的参数有两个,reduce(function,sequenc ...

  6. GetHashCode之于引用类型和值类型及其特性

    GetHashCode 方法可由派生类型重写.如果 GetHashCode 未重写,则通过调用基类的 Object.GetHashCode 方法来计算引用类型的哈希代码. 引用类型:Object.Ge ...

  7. SQLite3学习笔记(3)

    SQLite 表达式 表达式是一个或多个值.运算符和计算值的 SQL函数的组合. SQL表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. SELECT语句的基本语法如下: S ...

  8. config.json读取和存储

    json格式的配置文件的读取和存储 public class ConfigHelper { public static T GetConfig<T>(string path) { if ( ...

  9. python 前置程序窗口,还原最小化的窗口

    python 前置程序窗口,还原最小化的窗口 在网上找了比较久,大多是: win32gui.FindWindow(class_name, window_name) win32gui.SetForegr ...

  10. JS 时间差计算 XX秒前、XX小时前、XX天前

    //时间差 function GetTime(time) {//di作为一个变量传进来 //如果时间格式是正确的,那下面这一步转化时间格式就可以不用了 var dateBegin = new Date ...