目录(?)[-]

  1. 一GBDTGBRT
  2. 二Xgboost

gbdt(又称Gradient Boosted Decision Tree/Grdient Boosted Regression Tree),是一种迭代的决策树算法,该算法由多个决策树组成。它最早见于yahoo,后被广泛应用在搜索排序、点击率预估上。

xgboost是陈天奇大牛新开发的Boosting库。它是一个大规模、分布式的通用Gradient Boosting(GBDT)库,它在Gradient Boosting框架下实现了GBDT和一些广义的线性机器学习算法。

本文首先讲解了gbdt的原理,分析了代码实现;随后分析了xgboost的原理和实现逻辑。本文的目录如下:

一、GBDT

1. GBDT简介

2. GBDT公式推导

3. 优缺点

4. 实现分析

5. 常用参数和调优

二、Xgboost

1. Xgboost简介

2. Xgboost公式推导

3. 优缺点

4. 实现分析

5. 常用参数和调优

一、GBDT/GBRT

1. GBDT简介

GBDT是一个基于迭代累加的决策树算法,它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。

树模型也分为决策树和回归树,决策树常用来分类问题,回归树常用来预测问题。决策树常用于分类标签值,比如用户性别、网页是否是垃圾页面、用户是不是作弊;而回归树常用于预测真实数值,比如用户的年龄、用户点击的概率、网页相关程度等等。由于GBDT的核心在与累加所有树的结果作为最终结果,而分类结果对于预测分类并不是这么的容易叠加(稍等后面会看到,其实并不是简单的叠加,而是每一步每一棵树拟合的残差和选择分裂点评价方式都是经过公式推导得到的),所以GBDT中的树都是回归树(其实回归树也能用来做分类的哈)。同样的我们经常会把RandomForest的思想引入到GBDT里面来,即每棵树建树的时候我们会对特征和样本同时进行采样,然后对采样的样本和特征进行建树。

好啦,既然每棵树拟合的值、预测值、分裂点选取都不是随便选取的,那么到底是如何选择的呢?我们先进入GBDT的公式推导吧

2. GBDT公式推导

我们都知道LR的映射函数是,损失函数是。对于分类问题来说,我们一般选取映射函数,构造损失函数,然后逐步求解使得损失函数最小化就行了,可是对于回归问题,求解的方式就有些不同了。那么GBDT的目标函数和损失函数分别又是什么的呢?每个树拟合的残差是什么呢?首先GBDT和LR是不一样的,因为GBDT是希望组合一组弱的学习器的线性组合,于是我们有:

那么它的目标函数就如下,其中如上公式中是p步长,而h(x;am)是第m颗树的预测值---梯度方向。我们可以在函数空间上形式使用梯度下降法求解,首先固定x,对F(x)求其最优解。下面给出框架流程和Logloss下的推导,框架流程如下:

我们需要估计g_m(x),这里使用决策树实现去逼近g_m(x),使得两者之间的距离尽可能的近。而距离的衡量方式有很多种,比如均方误差和Logloss误差。我在这里给出Logloss损失函数下的具体推导:

(GBDT预测值到输出概率[0,1]的sigmoid转换)

下面,我们需要首先求解F0,然后再求解每个梯度。

Step 1. 首先求解初始值F0,令其偏导为0。(实现时是第1颗树需要拟合的残差)

Step2. 估计g_m(x),并用决策树对其进行拟合。g_m(x)是梯度,实现时是第m颗树需要拟合的残差:

Step3.  使用牛顿法求解下降方向步长。r_jm是拟合的步长,实现时是每棵树的预测值:

Step4. 预测时就很简单啦,把每棵树的预测值乘以缩放因子加到一起就得到预测值啦:

注意如果需要输出的区间在(0,1)之间,我们还需要做如下转换:

3. 优缺点

GBDT的优点当然很明显啦,它的非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换。

GBDT的缺点也很明显,Boost是一个串行过程,不好并行化,而且计算复杂度高,同时不太适合高维洗漱特征。

4. 实现分析

5. 参数和模型调优

GBDT常用的参数有如下几个:

1. 树个数
                        2. 树深度
                        3. 缩放因子
                        4. 损失函数
                        5. 数据采样比
                        6. 特征采样比

二、Xgboost

xgboost是boosting Tree的一个很牛的实现,它在最近Kaggle比赛中大放异彩。它 有以下几个优良的特性:

1. 显示的把树模型复杂度作为正则项加到优化目标中。

2. 公式推导中用到了二阶导数,用了二阶泰勒展开。(GBDT用牛顿法貌似也是二阶信息)

3. 实现了分裂点寻找近似算法。

4. 利用了特征的稀疏性。

5. 数据事先排序并且以block形式存储,有利于并行计算。

6. 基于分布式通信框架rabit,可以运行在MPI和yarn上。(最新已经不基于rabit了)

7. 实现做了面向体系结构的优化,针对cache和内存做了性能优化。

在项目实测中使用发现,Xgboost的训练速度要远远快于传统的GBDT实现,10倍量级。

1. 原理

在有监督学习中,我们通常会构造一个目标函数和一个预测函数,使用训练样本对目标函数最小化学习到相关的参数,然后用预测函数和训练样本得到的参数来对未知的样本进行分类的标注或者数值的预测。一般目标函数是如下形式的,我们通过对目标函数最小化,求解模型参数。预测函数、损失函数、正则化因子在不同模型下是各不相同的。

其中预测函数有如下几种形式:

1. 普通预测函数

a. 线性下我们的预测函数为

b. 逻辑回归下我们的预测函数为

2. 损失函数:

a. 平方损失函数:

b. Logistic损失函数:

3. 正则化:

a. L1  参数求和

b. L2  参数平方求和

其实我个人感觉Boosting  Tree的求解方式和以上略有不同,Boosting Tree由于是回归树,一般是构造树来拟合残差,而不是最小化损失函数。且看GBDT情况下我们的预测函数为:

而Xgboost引入了二阶导来进行求解,并且引入了节点的数目、参数的L2正则来评估模型的复杂度。那么Xgboost是如何构造和预测的呢?

首先我们给出结果,Xgboost的预测函数为:

而目标函数为:

那么作者是如何构思得到这些预测函数和优化目标的呢?它们又如何求解得到的呢? 答案是作者巧妙的利用了泰勒二阶展开和巧妙的定义了正则项,用求解到的数值作为树的预测值。

我们定义正则化项:

可以得到目标函数转化为:

然后就可以求解得到:

同样在分裂点选择的时候也,以目标函数最小化为目标。

2. 实现分析:

3. 参数调优:

a. 初阶参数调优:

1). booster

2). objective

3). eta

4). gamma

5). min_child_weight

6). max_depth

7). colsample_bytree

8). subsample

9). num_round

10). save_period

参考文献:

1. xgboost导读和实践:http://vdisk.weibo.com/s/vlQWp3erG2yo/1431658679

2. GBDT(MART) 迭代决策树入门教程: http://blog.csdn.NET/w28971023/article/details/8240756

3. Introduction to Boosted Trees : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf

gbdt和xgboost区别相关推荐

  1. GBDT与XGBoost区别与联系 GBDT近些年来更因为被用于构建搜索排序的机器学习模型而引起广泛的关注

    https://blog.csdn.net/xavier_muse/article/details/84403207?utm_medium=distribute.pc_relevant.none-ta ...

  2. CTR 预测理论(九):Boosting 集成算法中 Adaboost, GBDT 与 XGBoost 的区别

    https://blog.csdn.net/Dby_freedom/article/details/81975255 最近总结树模型,尝试将主流 Boosting 实现方式做一个分析汇总,文中部分内容 ...

  3. GBDT和Xgboost:原理、推导、比较

    写在前面 网上有很多关于GBDT和Xgboost的文章,但是我在读的时候感觉对于提升树.GBDT和Xgboost之间的关系,以及他们和残差.梯度的关系,所以自己整理了一下,涉及的知识点比较多.Xgbo ...

  4. GBDT和Xgboost对比

    一.GBDT有哪些参数,如何确定树的深度,学习率怎样确定.  答:本题答案引自http://www.07net01.com/2016/12/1742073.html  在sk-learn中,Gradi ...

  5. 【机器学习】一文详解GBDT、Xgboost、Boosting与Bagging之间的区别

    GBDT与Xgboost的区别 N问GBDT 1. 怎么设置单棵树的停止生长条件? 2. 如何评估特征的权重大小? 3. 当增加样本数量时,训练时长是线性增加的吗? 4. 当增加树的颗数时,训练时长是 ...

  6. AdaBoost -> GBDT -> XGBOOST 的区别

    AdaBoost -> GBDT -> XGBOOST 最主要的区别在于如何识别模型的问题. AdaBoost 通过不断修改样本权重(增大分错样本权重,降低分对样本权重),不断加入弱分类器 ...

  7. xgboost原理,怎么防止过拟合。随机森林,GBDT,Xgoost的区别,bagging和boosting

    一.bagging和boosting的区别 参考:https://www.cnblogs.com/liuwu265/p/4690486.html Bagging和Boosting都是将已有的分类或回归 ...

  8. 一文搞定 GBDT、Xgboost 和 LightGBM 的面试

    来自 | 知乎   作者 | 丢丢 链接 | https://zhuanlan.zhihu.com/p/148050748 编辑 | AI有道 本文经作者授权发布,禁二次转载 GBDT和XGB基本上是 ...

  9. 数据挖掘算法(logistic回归,随机森林,GBDT和xgboost)-腾讯云社区

    机器学习就是样本中有大量的x(特征量)和y(目标变量)然后求这个function.(了解更多可以看: https://zhuanlan.zhihu.com/p/21340974?refer=mlear ...

最新文章

  1. 怎么判断日出时间早晚_珠海最全防堵攻略,知道这些上班时间或缩短半小时!有大数据分析!...
  2. php配置文件修改数据库上传,请问php.ini上传文件大小限制配置修改路径在哪里?是在数据库哪里吗?表头是?...
  3. Linux newgrp命令用法详解:切换用户的有效组
  4. Leet Code OJ 328. Odd Even Linked List [Difficulty: Easy]
  5. pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)
  6. 【剑指offer】面试题19:正则表达式匹配(Java)
  7. InceptionNet V2整理总结
  8. 设定应用程式上的 Badge -- IOS
  9. 剑指offer系列14---合并两个升序链表
  10. cocos2d-x 调用java_cocos2d-x中通过Jni实现Java与C++的互相调用
  11. 系统设计说明书案例_VAV系统设计要点与案例分析
  12. PHP网页截图-网页快照实现
  13. C Tricks(十三)—— trim 的实现
  14. Python 使用Selenium 爬取Linkedin领英数据
  15. 上海富勒wms_国内WMS前三名是哪几家
  16. CorelDRAW入门教程-用CDR制作漂亮小雨伞
  17. 将Tomcat注册成系统服务,并且设置成系统自启动项
  18. 苹果手机用户流失严重,竟是因为这个原因?
  19. vim加载systemverilog语法高亮
  20. win7系统怎么调计算机,分辨率,教您Win7如何调电脑的分辨率

热门文章

  1. MySQL 优化原理(三)
  2. Python操作Memcached
  3. 系统设计:负载均衡(负载均衡算法、转发实现、session)
  4. Java:异常处理的一些注意事项
  5. html图片墙 无限滚动,尝试用CSS3实现无限循环的无缝滚动
  6. java if赋值语句_Java基础第3天+运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符)、Scanner键盘录入、if语句...
  7. 华擎b365m itx 黑苹果_迷你ITX小机箱装机实录,黑苹果首选
  8. oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?
  9. python 面试题 博客园_python面试题
  10. Py之pandas:利用isin函数对dataframe格式数据按照多个字段的条件筛选