背景知识:AdaBoost / BoostTree

一、GBoost

对于GBoost的讲解将在BoostTree的基础上进行,如果大家对BoostTree不了解,可以参考上述列出的博文。
BoostTree本质:

  • 将AdaBoost的弱分类器定为了“决策树”;
  • 采用第m-1次训练得到的分类器fm-1(xi)的值与label yi的残差,来训练第m次的弱分类器Gm(x),这里fm(x) = fm-1(x) + Gm(x);

与BoostTree相比,GBoost不是使用残差来训练弱分类器,而是使用损失函数一阶导来作为残差的近似值,训练弱分类器。即:利用一阶导作为训练第m次弱分类器的sample。对于平方损失 L=(yi - fm-1(xi))2来讲,其关于fm-1(xi)的导数为:2(yi - fm-1(xi)),与残差公式相近,而对于logistic损失来讲,则可用损失函数L的一阶导来近似残差: yi - fm-1(xi)。

GBoost算法伪代码如下:

在实际应用中,我们可以对GBoost分类器添加一个shrinkage(0.1),即:fm(x) = fm-1(x) + shrinkage * Gm(x),shrinkage的作用是使每次拟合的弱分类器只能拟合残差的部分值,从而使得残差的拟合 从“一步到位” 变为了 “分很多小步逐渐实现完全拟合”,这种做法可以有效防止GBoost过拟合。

二、xGBoost

xGBoost的核心思想是,通过“泰勒展开”,将损失函数变为了 L = L’(yi,fm-1(xi)) * parameter + L’'(yi,fm-1(xi)) * parameter2 + regularization 的形式。
从而使得parameter的求解可以通过解二次方程 ax2 + bx 来得到(这里的parameter是一种Tree structure的叶子节点值)。
得到parameter后,我们既可计算出损失函数L。
对于每一轮Iteration中加入的Tree,我们可以通过损失函数来确定其具体结构,其step如下:

  1. 生成一棵depth=0的Tree;
  2. 从top到down,通过损失函数L来判断,叶子节点是否应该被split,其公式为:Gain = node_right + node_left - node + lambda < 0 ,说明node应该split,否则不split。这里,node_right指node的right分支的损失函数值,其它变量含义类似。

下面具体介绍xGBoost的工作原理:

  1. 首先不考虑xGBoost的model type,我们单纯考虑,其损失函数的定义,即定义xGBoost要优化的“目标函数”。在一般的损失函数定义中,往往包含2方面的内容:(1)我们希望由该损失函数优化获得的模型能够尽可能的拟合数据,即具有较小的bias;(2)我们希望由该损失函数优化得到的模型具有较好的泛化能力,即具有较小的variance。根据这2部分要求,我们可以将损失函数分解为2部分,一部分最小化bias,一部分抑制模型的复杂度,从而使其具有较好的泛化能力。根据这2部分,我们可以将损失函数定义为:
    其前一部分为训练样本的平方和损失,后一部分为regularization,用于控制模型复杂度。
  2. 在定义了xGBoost损失函数类型以后,我们来定义xGBoost的抽象表达,由于xGBoost是一种Boost方法,其由若干个弱分类器组合而成,在xGBoost中,弱分类器为“回归树”。xGBoost可抽象表示为 yit = yit-1 + ft(xi),其中ft(xi)为第t次iteration得到的弱分类器。yit-1为第t-1次得到的xGBoost模型的预测值,yit为第t次得到的xGBoost模型的预测值。
  3. 在定义完xGBoost的抽象表达后,下面我们来具体化损失函数的各个部分表达式:
    首先,来看平方损失项:Lsquare = [yi - (yit-1 + ft(xi))]2 = [(yi - yit-1)2 + ft2(xi) + 2(yit-1 - yi)ft(xi)],由于(yi - yit-1)2与待求函数ft(xi)无关,因此,我们将其舍去,平方损失变为:[2(yit-1 - yi)ft(xi) + ft2(xi)] 。
    上述平方损失变形还可以通过泰勒公式展开得到,具体如下:
    考虑利用泰勒公式,将Lsquare展开。
    泰勒公式可表示为:
    Lsquare = L(yi, yit-1 + ft(xi)) = L(yi, yit-1) + L’(yi, yit-1)ft(xi) +0.5 L’‘(yi, yit-1)*ft2(xi),令gi = L’,hi = L’'。则Lsquare = L(yi, yit-1) + gi * ft(xi) + 0.5 * hi * ft2(xi);
    将gi = 2(yi - yit-1),hi = 2,代入Lsquare,得: Lsquare = L(yi, yit-1) + 2(yi - yit-1) * ft(xi) + ft2(xi);由于L(yi, yit-1) 为常数项,将其省略,则 Lsquare = 2(yi - yit-1) * ft(xi) + ft2(xi);
    上述是平方损失最后的化简形式,如果我们衡量biase的损失函数采用更为一般的损失函数时,则Lsquare = gi * ft(xi) + 0.5 * hi * ft2(xi);
    在定义完bias以后,接下来我们看regularization项的定义:
    首先我们先定义ft(xi)的形式为:ft(xi) = wq(xi),具体释义如下图所示:

    则regularization项可表示为如下形式:
  4. 通过第3步,我们定义了xGBoost各个部分的损失函数,现将损失函数重新组合为如下形式:

    根据上述公式,我们即可以通过已知量 gi,hi,即“二次方程ax2 + bx的求解公式”,求得给定Tree结构ft(xi)的情况下,ft(xi)中的w值,T为Tree中的结点个数;据此,我们可以求出给定Tree结构下的Objt。Objt代表第t次iteration中xGBoost模型的损失函数。
    通过上述分析,我们好像已经求出了ft(xi),但是,此时求得的ft(xi)是未经优化的Tree结构,那么我们如何获得ft(xi)的最优Tree结构呢,下一步将重点说明;
  5. ft(xi)的Tree结构可以采用“后减枝”的策略获得,具体思路如下:
    first. 先根据残差yi - yit-1 ,构建ft(xi);
    second. 第一步构建的ft(xi)为一个depth=0的树根;
    third. 根据损失函数Objt,求得一棵树分支与不分枝其损失函数的减小量D,我们将Gain = -D,Gain的具体计算公式,见如下几张PPT:



    根据Gain 是否大于0,我们可以判断一个分枝是否合理:当Gain > 0时,保留分枝,否则,去除分枝;
  6. 通过上述步骤,已经确定了ft(xi)中,分枝的保留策略,根据这个策略,我们可以利用“决策树”的构造方式,来构建ft(xi)。
    下面,给出“决策树” Best Spliting的寻找算法:
  7. 通过上述6步,可以求出一个最优的ft(xi),每次iteration中,我们都可用同样的方法来求得一个f(xi)。为了保证得到的xGBoost不过拟合,我们可以给f(xi)定义一个shrinkage(0.1),则 xGBoost = sum( shrinage * ft(xi) ) ,t=1,2,…,T。
  8. 通过以上步骤即可求得xGBoost模型。

三、GB,GBDT,xgboost 比较

收集了一些博文,以便更深入了解多种boost方法差别:
一步一步理解GB、GBDT、xgboost
xgboost的python实现
XGboost数据比赛实战之调参篇(完整流程)
XGBoost——机器学习(理论+图解+安装方法+python代码)
Python机器学习(六)-XGBoost调参
机器学习:机器学习时代三大神器GBDT、xGBoost、LightGBM

GBoost 和 xGBoost相关推荐

  1. 住房月租金预测大数据赛

    [Python数据分析实战项目]之 住房月租金预测大数据赛分析|详解 注:图片源于http://www.dcjingsai.com 完整源代码及训练测试集数据请使劲戳 ☛☛ https://githu ...

  2. 机器学习—集成学习(ensemble learning)

    一.集成学习 集成学习是将多个弱机器学习器结合,构建一个有较强性能的机器学习器的方法,也就是通过构建并合并多个学习器来完成学习任务,其中构成集成学习的弱学习器称为基学习器.基估计器. 1.根据集成学习 ...

  3. Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付

    全文链接:http://tecdat.cn/?p=26184 在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何变化?( ...

  4. xgboost重要参数2为主但不全要参照1

    相信小伙伴都用过XGBoost模型了,因为效果好,透明易解释等优点,XGBoost已经成为了特别流行的算法模型,小编今天也来介绍一下XGBoost调参. 一.XGBoost参数解释 XGBoost有三 ...

  5. xgboost重要参数1

    XGBoost 重要参数(调参使用) 数据比赛Kaggle,天池中最常见的就是XGBoost和LightGBM. 模型是在数据比赛中尤为重要的,但是实际上,在比赛的过程中,大部分朋友在模型上花的时间却 ...

  6. xgboost lightgbm catboost 多分类 多标签

    xgboost 与 lightgbm 官方均支持多分类任务,但不直接支持多标签分类任务,实现多标签任务的方法之一是结合sklearn 提供的 multiclass 子类,如OneVsRestClass ...

  7. 梯度提升决策树(GBDT)与XGBoost、LightGBM

    20211224 [机器学习算法总结]XGBoost_yyy430的博客-CSDN博客_xgboost xgboost参数 默认:auto.XGBoost中使用的树构造算法.可选项:auto,exac ...

  8. 机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义

    0.随机森林的思考 随机森林的决策树是分别采样建立的,各个决策树之间是相对独立的.那么,在我们得到了第k-1棵决策树之后,能否通过现有的样本和决策树的信息, 对第m颗树的建立产生有益的影响呢?在随机森 ...

  9. XGBoost缺失值引发的问题及其深度分析 | CSDN博文精选

    作者 | 兆军(美团配送事业部算法平台团队技术专家) 来源 | 美团技术团队 (*点击阅读原文,查看美团技术团队更多文章)  背景 XGBoost模型作为机器学习中的一大"杀器", ...

最新文章

  1. CVPR2019目标检测方法进展综述
  2. 云计算如何对传统软件交付方式产生影响
  3. 什么都不必说 Gradle--buildTypes--productFlavors
  4. Linux下各种常见环境变量的配置
  5. PowerShell批量检查域密码弱口令
  6. HTTPS原理和CA证书申请
  7. Struts 2的OGNL表达式
  8. Linux-使用之vim出现的问题
  9. OpenGL6-纹理动画
  10. 阿里云贾扬清:数据湖正成为企业数据应用创新标配
  11. 《大数据》第2期“专题”——数据开放与政府治理创新
  12. Python中计算文件的MD5值
  13. 增强for循环 泛型
  14. android 上位机下位机串口通讯,上位机下位机串口通信.doc
  15. 无稽之谈--关于我自己的程序世界
  16. 为什么excel中取消隐藏行后仍然有隐藏的行
  17. 女巫攻击Sybil Attack 笔记
  18. 《守望先锋》中网络脚本化的武器和技能系统
  19. org/springframework/boot/actuate/metrics/cache/CacheMeterBinderProvider not found. Make sure your ow
  20. mysql客户端与服务端的区别,终于彻底把握了

热门文章

  1. 意大利黑手党2mac版下载
  2. UE5 - 后期盒子 全局曝光 亮度调节
  3. 重置Macbook Pro的4种方法
  4. 整体认知主要依靠周边视觉而非中央视觉
  5. CISCO 3560G-48TL SSH及telnet问题
  6. Access2013 Mssql2012 数据库连接字符串
  7. 《HTML 5+CSS 3入门经典》——第2章 去其糟粕,取其精华——HTML 5 的元素与属性...
  8. IDEA开发工具调试技巧(极大提升开发效率)
  9. matlab回归分析结果输出,科学网—回归分析的MATLAB和R程序实现 - 王福昌的博文...
  10. 批量上传图片_微信公众号关键词回复图片突破200条规则,怎么设置?