XGBoost算法介绍

  • 一、简介
  • 二、基本原理
  • 三、目标函数
    • 三、节点分裂
      • 3.1 贪心算法
      • 3.2 近似算法
    • 四、其它特点
      • 4.1 缺失值处理
      • 4.2 防止过拟合
    • 五、总结

一、简介

  XGBoost(eXtreme Gradient Boosting)又叫极度梯度提升树,是boosting算法的一种实现方式。针对分类或回归问题,效果非常好。在各种数据竞赛中大放异彩,而且在工业界也是应用广泛,主要是因为其效果优异,使用简单,速度快等优点。本文主要从以下几个方面介绍该算法模型:

二、基本原理

  xgb是boosting算法的一种实现方式,主要是降低偏差,也就是降低模型的误差。因此它是采用多个基学习器,每个基学习器都比较简单,避免过拟合,下一个学习器是学习前面基学习器的结果yity^{t}_{i}yit​和实际值yiy_{i}yi​的差值,通过多个学习器的学习,不断降低模型值和实际值的差。
yi0=0y_{i}^{0} = 0yi0​=0
yi1=f1(xi)=yi0+f1(xi)y_{i}^{1} = f_{1}(x_{i}) = y_{i}^{0}+f_{1}(x_{i})yi1​=f1​(xi​)=yi0​+f1​(xi​)
$yi2=f1(xi)+f2(xi)=yi1+f2(xi)y_{i}^{2}=f_{1}(x_{i})+f_{2}(x_{i})=y_{i}^{1}+f_{2}(x_{i})yi2​=f1​(xi​)+f2​(xi​)=yi1​+f2​(xi​)
yit=∑k=1tfk(xi)=yit−1+ft(xi)y_{i}^{t}=\sum_{k=1}^{t}f_{k}(x_{i})=y_{i}^{t-1}+f_{t}(x_{i})yit​=k=1∑t​fk​(xi​)=yit−1​+ft​(xi​)
基本思路就是不断生成新的树,每棵树都是基于上一颗树和目标值的差值来进行学习,从而降低模型的偏差。最终模型结果的输出如下:yi=∑k=1tfk(xi)y_{i}=\sum_{k=1}^{t}f_{k}(x_{i})yi​=∑k=1t​fk​(xi​),即所有树的结果累加起来才是模型对一个样本的预测值。那在每一步如何选择/生成一个较优的树呢?那就是由我们的目标函数来决定。

三、目标函数

  目标函数由两部分组成,一是模型误差,即样本真实值和预测值之间的差值,二是模型的结构误差,即正则项,用于限制模型的复杂度。
Obj(θ)=L(θ)+Ω(θ)=L(yi,yit)+∑k=1tΩ(fk(xi))Obj(\theta)=L(\theta)+\Omega(\theta)=L(y_{i},y_{i}^{t})+\sum_{k=1}^{t}\Omega(f_{k}(x_{i}))Obj(θ)=L(θ)+Ω(θ)=L(yi​,yit​)+k=1∑t​Ω(fk​(xi​))
因为yit=yit−1+ft(xi)y_{i}^{t}=y_{i}^{t-1}+f_{t}(x_{i})yit​=yit−1​+ft​(xi​),所以将其带入上面的公式中转换为:
Objt=∑n=1nL(yi,yit−1+ft(xi))+Ω(ft)+∑t=1T−1Ω(ft)Obj^{t}=\sum_{n=1}^{n}L(y_{i},y_{i}^{t-1}+f_{t}(x_{i}))+\Omega(f_{t})+\sum_{t=1}^{T-1}\Omega(f_{t})Objt=∑n=1n​L(yi​,yit−1​+ft​(xi​))+Ω(ft​)+∑t=1T−1​Ω(ft​),第t颗树的误差由三部分组成,n个样本在第t颗树的误差求和,以及第t颗树的结构误差和前t-1颗树的结构误差。其中前t-1颗树的结构误差是常数,因为我们已经知道前t-1颗树的结构了。
  假设我们的损失函数是平方损失函数(mse),则上述目标函数转换为:
Objt=∑i=1nL(yi,yit−1+ft(xi))+Ω(ft)+∑t=1T−1Ω(ft)=∑i=1n(yi−(yit−1+ft(xi)))2+Ω(ft)+constantObj^{t}=\sum_{i=1}^{n}L(y_{i},y_{i}^{t-1}+f_{t}(x_{i}))+\Omega(f_{t})+\sum_{t=1}^{T-1}\Omega(f_{t}) \\ =\sum_{i=1}^{n}(y_{i}-(y_{i}^{t-1}+f_{t}(x_{i})))^2+\Omega(f_{t})+constantObjt=i=1∑n​L(yi​,yit−1​+ft​(xi​))+Ω(ft​)+t=1∑T−1​Ω(ft​)=i=1∑n​(yi​−(yit−1​+ft​(xi​)))2+Ω(ft​)+constant
上述公式即为损失函数为mse时xgb第t步的目标函数。唯一的变量即为ftf_{t}ft​,此处的损失函数仍然是一个相对复杂的表达式,所以为了简化它,采用二阶泰勒展开来近似表达,即f(x+Δx)=f(x)+f′(x)Δx+1/2f′′(x)Δx2f(x+\Delta x)=f(x)+f^{'}(x)\Delta x+1/2f^{''}(x)\Delta x^2f(x+Δx)=f(x)+f′(x)Δx+1/2f′′(x)Δx2,所以另gi=∂yit−1l(yi,yit−1)g_{i}=\partial _{y_{i}^{t-1}}l(y_{i},y_{i}^{t-1})gi​=∂yit−1​​l(yi​,yit−1​),hi=∂yit−12l(yi,yit−1)h_{i}=\partial _{y_{i}^{t-1}} ^ 2 l(y_{i},y_{i}^{t-1})hi​=∂yit−1​2​l(yi​,yit−1​),即分别是l(yi,yit−1)l(y_{i},y_{i}^{t-1})l(yi​,yit−1​)的一阶导和二阶导。则上述损失函数转换为二阶导之后,Objt=∑i=1n[l(yi,yit−1)+gift(x)+1/2hift2(x)]+Ω(ft)+constantObj^{t}=\sum_{i=1}^{n}[l(y_{i},y_{i}^{t-1})+g_{i} f_{t}(x_{})+1/2h_{i} f_{t}^2(x)]+\Omega(f_{t})+constantObjt=i=1∑n​[l(yi​,yit−1​)+gi​ft​(x​)+1/2hi​ft2​(x)]+Ω(ft​)+constant,
  所以当损失函数是mse时,gi=2(yit−1−yi)g_{i}=2(y_{i}^{t-1}-y_{i})gi​=2(yit−1​−yi​),hi=2h_{i}=2hi​=2。
  经过转换之后,其中第一项是所有样本与第t-1颗树的误差之和,因为第t-1颗树是已知的,所以可以将其视为常数项,我们暂时在目标函数中将其舍去,我们的目标函数变为关于ft(x)f_{t}(x)ft​(x)的函数了。而ft(x)f_{t}(x)ft​(x)则是关于叶子节点输出www的函数,所以我们的目标函数全部转换为关于www的函数,Objt=∑i=1n[gift(x)+1/2hift2(x)]+Ω(ft)+constant=∑i=1n[giwq(xi)+1/2hiwq2(xi)]+γT+1/2λ∑j=1Twj2=∑j=1T[∑i∈Ij(gi)∗wj+1/2∗∑i∈Ij(hi+λ)wj2]+γTObj^{t}=\sum_{i=1}^{n}[g_{i} f_{t}(x_{})+1/2h_{i} f_{t}^2(x)]+\Omega(f_{t})+constant \\ =\sum_{i=1}^{n}[g_{i}w_{q}(x_{i})+1/2h_{i}w_{q}^2(x_{i})]+\gamma T+1/2\lambda\sum_{j=1}^{T}w_{j}^{2} \\ =\sum_{j=1}^{T}[\sum_{i \in I_{j}}(g_{i})*w_{j}+1/2*\sum_{i \in I_{j}}(h_{i}+\lambda)w_{j}^2]+\gamma TObjt=i=1∑n​[gi​ft​(x​)+1/2hi​ft2​(x)]+Ω(ft​)+constant=i=1∑n​[gi​wq​(xi​)+1/2hi​wq2​(xi​)]+γT+1/2λj=1∑T​wj2​=j=1∑T​[i∈Ij​∑​(gi​)∗wj​+1/2∗i∈Ij​∑​(hi​+λ)wj2​]+γT。我们令Gj=∑i∈Ij(gi)G_{j}=\sum_{i \in I_{j}}(g_{i})Gj​=∑i∈Ij​​(gi​),令Hj=∑i∈Ij(hi)H_{j}=\sum i \in I_{j}(h_{i})Hj​=∑i∈Ij​(hi​),则我们的目标函数转换为Objt=∑j=1TGj∗wj+1/2(Hj+λ)∗wj2+λTObj^{t}=\sum_{j=1}^{T}G_{j}*w_{j}+1/2(H_{j}+\lambda)*w_{j}^{2}+\lambda TObjt=j=1∑T​Gj​∗wj​+1/2(Hj​+λ)∗wj2​+λT。在上述表达式中,j表示第j个节点j表示第j个节点j表示第j个节点,i表示第i个样本i表示第i个样本i表示第i个样本。所以整个目标函数转换成了关于www即叶节点分数的一元二次函数,想要优化目标函数,就是求解最优的w,因此我们对目标求导,得到w∗=−Gi/(Hi+λ)w^{*}=-G_{i}/(H_{i}+\lambda)w∗=−Gi​/(Hi​+λ),将w∗w^{*}w∗代入目标函数中,则目标函数变为Objt=−1/2∑j=1TGj2/(Hj+λ)+λTObj^{t}=-1/2\sum_{j=1}^{T}G_{j}^{2}/(H_{j}+\lambda)+\lambda TObjt=−1/2j=1∑T​Gj2​/(Hj​+λ)+λT。如此简单,所以在求解二叉树的目标函数时,只要知道损失函数的一阶导、二阶导,以及样本落在哪个叶子节点上,我们只要求出在每个叶子节点上,该样本的一阶导和二阶导就能求出目标函数。也就能决定是否分裂该节点,依据哪个节点的特征值来进行分裂。

三、节点分裂

   xgb节点是否分裂取决于信息增益的变化,若分裂当前节点,信息增益>0,则进行分裂,若不大于0则不分裂,如何判断分列前后信息增益的变化呢。那就可以使用我们的目标函数来表示了。
Gain=GL2/(HL+λ)+GR2/(HR+λ)−(GL+GR)2/(HL+HR+λ)+γGain=G_{L}^{2}/(H_{L}+\lambda)+G_{R}^{2}/(H_{R}+\lambda)-(G_{L}+G_{R})^2/(H_{L}+H_{R}+\lambda)+\gammaGain=GL2​/(HL​+λ)+GR2​/(HR​+λ)−(GL​+GR​)2/(HL​+HR​+λ)+γ
  节点分裂有两种方式:1、贪心算法,2、近似算法

3.1 贪心算法

  贪心算法分裂的方式就是一种暴力搜索的方式,遍历每一个特征,遍历该特征的每一个取值,计算分裂前后的增益,选择增益最大的特征取值作为分裂点。

分裂流程如上图所示。

3.2 近似算法

   近似算法,其实就是分桶,目的是为了提升计算速度,降低遍历的次数,所以对特征进行分桶。就是将每一个特征的取值按照分位数划分到不同的桶中,利用桶的边界值作为分裂节点的候选集,每次遍历时不再是遍历所有特征取值,而是仅遍历该特征的几个桶(每个桶可以理解为该特征取值的分位数)就可以,这样可以降低遍历特征取值的次数。
  分桶算法分为global模式和local模式,global模式就是在第一次划分桶之后,不再更新桶,一直使用划分完成的桶进行后续的分裂。这样做就是计算复杂度降低,但是经过多次划分之后,可能会存在一些桶是空的,即该桶中已经没有了数据。
  local模式就是在每次分列前都重新划分桶,优点是每次分桶都能保证各桶中的样本数量都是均匀的,不足的地方就是计算量大。

四、其它特点

4.1 缺失值处理

   对于存在某一维特征缺失的样本,xgb会尝试将其放到左子树计算一次增益,再放到右子树计算一次增益,对比放在左右子树增益的大小决定放在哪个子树。

4.2 防止过拟合

   xgb提出了两种防止过拟合的方法:第一种称为Shrinkage,即学习率,在每次迭代一棵树的时候对每个叶子结点的权重乘上一个缩减系数,使每棵树的影响不会过大,并且给后面的树留下更大的空间优化。另一个方法称为Column Subsampling,类似于随机森林选区部分特征值进行建树,其中又分为两个方式:方式一按层随机采样,在对同一层结点分裂前,随机选取部分特征值进行遍历,计算信息增益;方式二在建一棵树前随机采样部分特征值,然后这棵树的所有结点分裂都遍历这些特征值,计算信息增益。

五、总结

  以上是对xgb的一些理解,大多是观看了很多大神的博客,通过不断的看别人总结的部分以及公式的推导,才让我逐渐理解xgb的各种特征。本文还是有很多不足的地方,后续逐渐补充,完善。

XGBoost算法介绍相关推荐

  1. 【白话机器学习】算法理论+实战之Xgboost算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  2. 数据分析利器:XGBoost算法最佳解析

    作者:symonxiong,腾讯 CDG 应用研究员 XGBoost是一种经典的集成式提升算法框架,具有训练效率高.预测效果好.可控参数多.使用方便等特性,是大数据分析领域的一柄利器.在实际业务中,X ...

  3. Xgboost算法原理详解及python实现

    Xgboost算法(回归树) 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.XGB.GBDT.LR与RF 5.python代码实现 导入相关包 读取数据并预处理 训练 贝叶斯初步 ...

  4. XGBoost算法概述

    学习笔记,仅供参考,有错必纠 转载自:终于有人说清楚了–XGBoost算法 文章目录 什么是XGBoost XGBoost树的定义 正则项:树的复杂度 树该怎么长 如何停止树的循环生成 XGBoost ...

  5. xgboost算法_工业大数据:分析算法

    一. 应用背景 大数据分析模型的研究可以分为3个层次,即描述分析(探索历史数据并描述发生了什么).预测分析(未来的概率和趋势)和规范分析(对未来的决策给出建议).工业大数据分析的理论和技术研究仍处于起 ...

  6. 干货▍全网通俗易懂的数据竞赛大杀器XGBoost 算法详解

    前言 xgboost一直在竞赛江湖里被传为神器,比如时不时某个kaggle/天池比赛中,某人用xgboost于千军万马中斩获冠军. 而我们的机器学习课程里也必讲xgboost,如寒所说:"R ...

  7. Datawhale集成学习笔记:XGBOOST算法

    引用:Datawhale XGBoost算法 XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学 ...

  8. 【MATLAB第9期】基于MATLAB的xgboost算法安装超详细教学(踩坑避雷指南)暂时仅限于Windows系统 #末尾含源码获取链接

    1.前言 网上基于MATLAB的xgboost源码资源太少了,而且找到的工具箱还不能立马用,对新手不太友好,接下来我将研究捣鼓半天的成果和经验分享给大家. 2.安装具备条件 1.有matlab软件,版 ...

  9. xgboost算法_xgboost算法原理篇

    1, 概述部分 这篇文章,主要来介绍一下xgboost的理论部分,可能会不够详细,由于xgboost算法相比较前三篇文章中提到的算法更加复杂,这里主要讲解一下损失函数正则化,切分点查找算法及其优化,叶 ...

最新文章

  1. SingleCellExperiment类使用
  2. 使用MongoDB存储Docker日志(续)
  3. php如何对几G的文本数据去重,Linux下导出数据库文件进行统计+去重
  4. C语言#define预处理
  5. 推荐staruml和最近一本不错的UML小册子
  6. zxr10交换机配置手册vlan_中兴ZXR10 G系列交换机SVLAN使用指导
  7. 手机社交游戏与触动用户的环节
  8. FreeRtos在RH850 D1L芯片上移植
  9. erphpdown最新版下载v11.12,WordPress内容付费插件
  10. intellij idea 2017破解
  11. android调色器 源代码,Android 上的调色板 —— Palette
  12. 计算机网络课后习题概略
  13. 全栈工程师就无敌吗?真的能做到个人即团队吗?
  14. zcmu-1410: Polynomial Showdown
  15. java和javascript有什么区别_javascript与java有什么区别?
  16. 【python绘图】seaborn可视化+鼠标滑动自动标注数据
  17. 学生管理系统:含注册登录操作
  18. LED技术50年秘史回顾:从指示灯到街灯
  19. PHP的环境安装基本的配置
  20. G. Good Key, Bad Key(暴力)

热门文章

  1. 3D打印CLI文件的读取(附代码)
  2. HIT CSAPP 程序人生(Hello‘s P2P)
  3. Spring中连接WebSocket报403错误
  4. macmini 修改显示器分辨率
  5. Figma是什么软件?
  6. 如何关闭台式计算机休眠,如何让电脑不自动休眠 Win7怎么关闭自动休眠功能
  7. js访问对方手机文件夹_[求助]苹果手机想向访问的https网页注入本地JS文件,请问如何实现?...
  8. kali 2017 安装wps
  9. 逆战打猎场显示与服务器,猎场跑图小技巧,你学会了吗?
  10. MAC 解压文件,中文乱码