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

4. xgboost: https://github.com/dmlc/xgboost

机器学习(四)--- 从gbdt到xgboost的更多相关文章

  1. 机器学习算法中GBDT和XGBOOST的区别有哪些

    首先xgboost是Gradient Boosting的一种高效系统实现,并不是一种单一算法.xgboost里面的基学习器除了用tree(gbtree),也可用线性分类器(gblinear).而GBD ...

  2. Boosting学习笔记(Adboost、GBDT、Xgboost)

    转载请注明出处:http://www.cnblogs.com/willnote/p/6801496.html 前言 本文为学习boosting时整理的笔记,全文主要包括以下几个部分: 对集成学习进行了 ...

  3. 机器学习总结(一) Adaboost,GBDT和XGboost算法

    一: 提升方法概述 提升方法是一种常用的统计学习方法,其实就是将多个弱学习器提升(boost)为一个强学习器的算法.其工作机制是通过一个弱学习算法,从初始训练集中训练出一个弱学习器,再根据弱学习器的表 ...

  4. 机器学习(八)—GBDT 与 XGBOOST

    RF.GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性.  根据个体学习器的生成方式,目前 ...

  5. 一步一步理解GB、GBDT、xgboost

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  6. 提升学习算法简述:AdaBoost, GBDT和XGBoost

    1. 历史及演进 提升学习算法,又常常被称为Boosting,其主要思想是集成多个弱分类器,然后线性组合成为强分类器.为什么弱分类算法可以通过线性组合形成强分类算法?其实这是有一定的理论基础的.198 ...

  7. 常见算法(logistic回归,随机森林,GBDT和xgboost)

    常见算法(logistic回归,随机森林,GBDT和xgboost) 9.25r早上面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终 ...

  8. GB、GBDT、XGboost理解

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  9. 机器学习 | 详解GBDT在分类场景中的应用原理与公式推导

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第31篇文章,我们一起继续来聊聊GBDT模型. 在上一篇文章当中,我们学习了GBDT这个模型在回归问题当中的原理.GBD ...

  10. GBDT,Adaboosting概念区分 GBDT与xgboost区别

    http://blog.csdn.net/w28971023/article/details/8240756 ============================================= ...

随机推荐

  1. Gym 100851K

    Problem King's Inspection 题目大意 给一张n个点m条边的无向图,问是否存在一条欧拉回路. n<=10^5, 0<=m<=n+20. 解题分析 注意到数据范围 ...

  2. 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    #!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...

  3. kinnect相关

    1. kinnect的现状. http://tech.qq.com/a/20150909/046760.htm 2. kinnect的相关工作 http://baike.baidu.com/link? ...

  4. bxSlider 在网页里添加幻灯片效果

    幻灯片效果在网页上很常见,本文介绍用 bxSlider 轻松实现的方法. bxSlider是什么 bxSlider 是用 JQuery 和 CSS 实现网页中幻灯片效果的工具.可在 http://bx ...

  5. 对弈类游戏的人工智能(5)--2048游戏AI的解读

    前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对 ...

  6. 用collectionview实现瀑布流-转

    算法总体思路 先说一下总体上的思路.既然图片的大小.位置各不一样,我们很自然地会想到需要算出每个item的frame,然后把这些frame赋值给当前item的UICollectionViewLayou ...

  7. MFC resizer封装

    用法: #include "resizer.h" 在mfc对话框头文件里面添加成员: CResizer m_Resizer; mydialog.cpp里面: OnInitDialo ...

  8. Python 安装mysqldb

    切换目录: cd /usr/local/src/ 一.下载资源 wget http://sourceforge.net/projects/mysql-python/files/mysql-python ...

  9. Python copy and deepcopy

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  10. MyEclipse Spring 学习总结三 SpringMVC 表单处理

    SpringMVC 表单处理的项目结构如下图所示: Student.java 文件 public class Student { private Integer age; private String ...