1 简述

  XGBoost(eXtreme Gradient Boosting,极端梯度提升算法)是Gradient Boosting框架下的一种高效能实现。为了提升性能,XGBoost算法主要在以下几个方面做了提升:

  • 在目标函数上,XGBoost会考虑模型复杂度,这样可以使学习出来的模型更简单,防止过拟合。此时,XGBoost算法中每一步迭代时的目标函数为:J(ft)=∑i=1NL(yi,y^it−1+ft(xi))+Ω(ft)+CJ(f_{t})=\sum_{i=1}^{N}L(y_{i},\widehat y_{i}^{t-1}+f_{t}(x_{i}))+\Omega(f_{t})+CJ(ft​)=i=1∑N​L(yi​,y​it−1​+ft​(xi​))+Ω(ft​)+C其中CCC为常数项,Ω(ft)\Omega(f_{t})Ω(ft​)为模型复杂度,NNN为训练样本个数。
  • 另外在梯度提升方法求解加法模型时,只考虑了一阶导数(负梯度方向)。为了能让梯度下降的更快更准,可以考虑同时使用一阶和二阶导数。依据泰勒展开公式:f(x+Δx)≈f(x)+f′(x)Δx+12f′′(x)Δx2f(x+\Delta x)\approx f(x)+f^{'}(x)\Delta x+\frac{1}{2}f^{''}(x)\Delta x^{2}f(x+Δx)≈f(x)+f′(x)Δx+21​f′′(x)Δx2可以将上述目标公式改为如下:J(ft)=∑i=1N[L(yi,y^it−1)+gift(xi)+12hift2(xi)]+Ω(ft)+CJ(f_{t})=\sum_{i=1}^{N}[L(y_{i},\widehat y_{i}^{t-1})+g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i})]+\Omega(f_{t})+CJ(ft​)=i=1∑N​[L(yi​,y​it−1​)+gi​ft​(xi​)+21​hi​ft2​(xi​)]+Ω(ft​)+C其中gig_{i}gi​为损失函数的一阶导数,hih_{i}hi​为损失函数的二阶导数,其公式如下:gi=∂L(yi,y^it−1)∂y^it−1,hi=∂2L(yi,y^it−1)∂y^it−1g_{i}=\frac{\partial L(y_{i},\widehat y_{i}^{t-1})}{\partial \widehat y_{i}^{t-1}},h_{i}=\frac{\partial^{2}L(y_{i},\widehat y_{i}^{t-1})}{\partial \widehat y_{i}^{t-1}}gi​=∂y​it−1​∂L(yi​,y​it−1​)​,hi​=∂y​it−1​∂2L(yi​,y​it−1​)​
  • 当XGBoost算法使用CART作为基模型时,为了加快寻找特征的最佳分割点,XGBoost算法在训练之前预先将样本按照特征进行排序,并将结果保存在block结构中。同时,XGBoost算法中使用多线程同时计算多个特征的分裂增益。
2 XGBoost算法

  XGBoost算法中不仅可以使用CART作为基模型,还可以使用线性模型。下面以使用CART作为基模型的XGBoos为例对其进行详细介绍。

2.1 目标函数化简

  当使用CART作为基模型时,用叶结点数与叶结点权值表示模型复杂度。其公式如下:Ω(ft)=γT+λ2∑j=1Twj2\Omega(f_{t})=\gamma T+\frac{\lambda}{2}\sum_{j=1}^{T}w_{j}^{2}Ω(ft​)=γT+2λ​j=1∑T​wj2​其中,TTT为决策树叶子结点数,wjw_{j}wj​为叶子结点的权值。结合泰勒公式,对其目标函数进行化简优化,具体如下:J(ft)=∑i=1N[L(yi,y^it−1+ft(xi))]+Ω(ft)+C=∑i=1N[L(yi,y^it−1)+gift(xi)+12hift2(xi)]+Ω(ft)+C=∑i=1N[gift(xi)+12hift2(xi)]+Ω(ft)+C=∑i=1N[giwq(xi)+12hiwq(xi)2]+γT+λ2∑j=1Twj2+C=∑j=1T[(∑i∈Ijgi)wj+12(∑i∈Ijhi)wj2]+γT+λ2∑j=1Twj2+C=∑j=1T[(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)wj2]+γT+C\begin{aligned}J(f_{t})&=\sum_{i=1}^{N}[L(y_{i},\widehat y_{i}^{t-1}+f_{t}(x_{i}))]+\Omega(f_{t})+C\\ &=\sum_{i=1}^{N}[L(y_{i},\widehat y_{i}^{t-1})+g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i})]+\Omega(f_{t})+C \\ &=\sum_{i=1}^{N}[g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i})]+\Omega(f_{t})+C\\&=\sum_{i=1}^{N}[g_{i}w_{q(x_{i})}+\frac{1}{2}h_{i}w_{q(x_{i})}^{2}]+\gamma T+\frac{\lambda}{2}\sum_{j=1}^{T}w_{j}^{2}+C\\&=\sum_{j=1}^{T}[(\sum_{i\in I_{j}}g_{i})w_{j}+\frac{1}{2}(\sum_{i\in I_{j}}h_{i})w_{j}^{2}]+\gamma T+\frac{\lambda}{2}\sum_{j=1}^{T}w_{j}^{2}+C\\&=\sum_{j=1}^{T}[(\sum_{i\in I_{j}}g_{i})w_{j}+\frac{1}{2}(\sum_{i\in I_{j}}h_{i}+\lambda)w_{j}^{2}]+\gamma T+C\end{aligned}J(ft​)​=i=1∑N​[L(yi​,y​it−1​+ft​(xi​))]+Ω(ft​)+C=i=1∑N​[L(yi​,y​it−1​)+gi​ft​(xi​)+21​hi​ft2​(xi​)]+Ω(ft​)+C=i=1∑N​[gi​ft​(xi​)+21​hi​ft2​(xi​)]+Ω(ft​)+C=i=1∑N​[gi​wq(xi​)​+21​hi​wq(xi​)2​]+γT+2λ​j=1∑T​wj2​+C=j=1∑T​[(i∈Ij​∑​gi​)wj​+21​(i∈Ij​∑​hi​)wj2​]+γT+2λ​j=1∑T​wj2​+C=j=1∑T​[(i∈Ij​∑​gi​)wj​+21​(i∈Ij​∑​hi​+λ)wj2​]+γT+C​令Gj=∑i∈IjgiG_{j}=\sum_{i\in I_{j}}g_{i}Gj​=∑i∈Ij​​gi​,Hj=∑i∈IjhiH_{j}=\sum_{i\in I_{j}}h_{i}Hj​=∑i∈Ij​​hi​。则:J(ft)=∑j=1T[Gjwj+12(Hj+λ)wj2]+γT+CJ(f_{t})=\sum_{j=1}^{T}[G_{j}w_{j}+\frac{1}{2}(H_{j}+\lambda)w_{j}^{2}]+\gamma T+CJ(ft​)=j=1∑T​[Gj​wj​+21​(Hj​+λ)wj2​]+γT+C对www求偏导数,得到∂J(ft)∂wj=Gj+(Hj+λ)wj\frac{\partial J(f_{t})}{\partial w_{j}}=G_{j}+(H_{j}+\lambda)w_{j}∂wj​∂J(ft​)​=Gj​+(Hj​+λ)wj​令上式等于0,则可以得到:wj=−GjHj+λw_{j}=-\frac{G_{j}}{H_{j}+\lambda}wj​=−Hj​+λGj​​将得到的wjw_{j}wj​带入的目标公式中,得到:J(ft)=−12∑j=1TGj2Hj+λ+γTJ(f_{t})=-\frac{1}{2}\sum_{j=1}^{T}\frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma TJ(ft​)=−21​j=1∑T​Hj​+λGj2​​+γT

2.2 决策树生长策略

  由于决策树的树结构是无穷的,不可能枚举所有可能树结构并计算出该树结构所对应的J(ft)J(f_{t})J(ft​)的值。XGBoost算法使用贪心策略构建每一棵决策树。其步骤如下:

  1. 从深度为0的树开始,对每个叶节点枚举所有的可用特征。
  2. 针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的最大收益(为了降低计算复杂度,XGBoost中使用block保存每个特征的排序结果,降低计算复杂度)。假设当前节点为CCC,其分裂之后得到的左右子树分别为LLL和RRR,则该节点的分裂增益为当前节点的目标函数值减去左右子树目标函数值之和,即:Gain=12[GL2HL+λ+GR2HR+λ−(GL+GR)2HL+HR+λ]−γGain=\frac{1}{2}[\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}]-\gammaGain=21​[HL​+λGL2​​+HR​+λGR2​​−HL​+HR​+λ(GL​+GR​)2​]−γ
  3. 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集。
  4. 回到第1步,递归执行到满足特定条件为止。
2.3 防止过拟合

  XGBoost算法中防止过拟合的策略主要有两个方面:(1)shrinkage(衰减): GBDT算法中使用的也是该策略,不在赘述。(2).列采样:类似于随机森林的处理方法,既能防止过拟合,又能减少训练时间。

2.4 优缺点

  与GBDT相比,XGBoost在以下方面有提升:

  • GBDT使用CART作为基模型,XGBoost不近可以使用CART作为基模型,还可以使用线性分类器,此时相当于引入L1L1L1和L2L2L2正则化项的逻辑回归和线性回归。
  • GBDT在优化时仅使用了一阶导数,而XGBoost对目标函数做了泰勒展开,使用了一阶导数和二阶导数。使用了二阶导数之后,梯度下降的更快更准。同时,可以在不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就可以进行叶子分裂优化计算,本质上也就把损失函数的选取和模型算法优化/参数选择分开了。
  • 当样本存在缺失值时,XGBoost能自动学习分裂方向。
  • XGBoost支持列抽样。
  • XGBoost中引入了正则化项,控制了模型的复杂度,防止模型过拟合。
  • XGBoost在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
  • XGBoost支持特征粒度上的并行。XGBoost已经预先对数据进行了排序。各个特征的增益计算可以并行进行。
  • 可并行的近似直方图算法。

  XGBoost的缺点主要有以下两个方面:

  • XGBoost需要保存各个特征预先排序的结果,占用内存。
  • XGBoost采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;
3 实现

  下面以xgboost中的scikit-learning接口中的XGBClassifier和XGBRegresso为例,介绍其主要参数及其用法(所有参数的介绍,可以查询参考资料3):

  • n_estimators: 基学习器数量。
  • booster: 指定基模型。常用的有‘gblinear’、‘gbtree’、‘dart’。其中,‘gblinear’为线性模型。
  • eta: 或者为learning_rate,学习率参数。其作用即为上文提到的衰减。
  • gamma:或者为min_split_loss。只有损失函数的减少值超过该参数指定值时,才会进行下一步的分裂。
  • max_depth:树的深度。
  • subsample:训练样本抽样比例。主要是为了防止过拟合。
  • sampling_method: 训练样本抽样方法。
  • colsample_bytree, colsample_bylevel, colsample_bynode:控制列抽样的三个参数。colsample_bytree指定构造每一棵树时的列抽样比例;colsample_bylevel指定树的每一层的列抽样比例;colsample_bynode指定每一次分裂时的列抽样比例。
  • lambda: L2L2L2正则化系数。
  • alpha: L1L1L1正则化系数。
  • tree_method: XGBoost中的树生成算法。
  • scale_pos_weight:指定正负样本比例。
  • missing: 指定空值。
  • objective: 目标类型。常用的参数如下:

  • eval_metrics: 评估指标。

import pandas as pd
import numpy as np
from xgboost import XGBRegressor
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_errorboston=load_boston()
X=pd.DataFrame(boston.data,columns=boston.feature_names)
y=pd.Series(boston.target)x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)xgbr=XGBRegressor(booster='gbtree',n_estimators=100,max_depth=3)
xgbr.fit(x_train, y_train,eval_metric='rmse',verbose=1)
y_pred=xgbr.predict(x_test)
score=np.sqrt(mean_squared_error(y_test, y_pred))
print("RMSE:{:.3f}".format(score))#获取树结构
xgbr.get_booster().dump_model('a.txt')

参考资料

  1. https://www.zybuluo.com/yxd/note/611571
  2. https://blog.csdn.net/smartcat2010/article/details/103219643
  3. https://xgboost.readthedocs.io/en/latest/parameter.html
  4. https://zhuanlan.zhihu.com/p/90520307
  5. https://zhuanlan.zhihu.com/p/115879247

机器学习:XGBoost算法相关推荐

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

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

  2. xgboost算法_回归建模的时代已结束,算法XGBoost统治机器学习世界

    作者 | 冯鸥 发布 | ATYUN订阅号 Vishal Morde讲了这样一个故事:十五年前我刚完成研究生课程,并以分析师的身份加入了一家全球投资银行.在我工作的第一天,我试着回忆我学过的一切.与此 ...

  3. 机器学习集成学习进阶Xgboost算法案例分析

    目录 1 xgboost算法api介绍 1.1 xgboost的安装 2 xgboost参数介绍 2.1 通用参数(general parameters) 2.2 Booster 参数(booster ...

  4. 机器学习算法(15)之Xgboost算法

    前言:前一篇文章对boosting的两个方法做了阐述,这篇文章将会是对前两篇文章的深化,谈的是一个更加优化了的boostIng算法,自从2014年9月份在 Kaggle 的希格斯玻色子机器学习大赛中夺 ...

  5. Python机器学习笔记:XgBoost算法(亲测)

    前言 1,Xgboost简介 Xgboost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器.因为Xgboost是一种提升树模型,所以它是将许多 ...

  6. xgboost算法_手把手机器学习实战系列:xgboost 算法

    算法简介 xgboost算法是一种boosting的集成学习算法,是将多个弱学习模型进行组合,从而获得更好的效果,使得组合后的模型有更强的泛化能力, 它通常是由基本的回归树(CART)树模型组成 如图 ...

  7. 机器学习与算法面试太难?

    机器学习与算法面试太难? 来源: https://mp.weixin.qq.com/s/GrkCvU2Ia_mEaQmiffLotQ 作者:石晓文 八月参加了一些提前批的面试,包括阿里.百度.头条.贝 ...

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

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

  9. 阿里资深AI工程师教你逐个击破机器学习核心算法

    01 近年来,随着 Google 的 AlphaGo 打败韩国围棋棋手李世乭之后,机器学习尤其是深度学习的热潮席卷了整个 IT 界. 所有的互联网公司,尤其是 Google 微软,百度,腾讯等巨头,无 ...

  10. Hessian矩阵在XGBoost算法的应用小结

    来源:机器学习算法那些事本文约1100字,建议阅读5分钟 本文深入浅出的总结了Hessian矩阵在XGboost算法中的两种应用,即权重分位点算法和样本权重和算法 . 前言 Hessian矩阵最常见的 ...

最新文章

  1. html中内联元素和块元素的区别、用法以及联系
  2. 矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法 | ICML 2021
  3. 【C++】复制构造函数
  4. 多功能复合机基于用户认证功能的实现过程详解
  5. vue 一个页面有点请求需要同时发送_前端性能优化,这些你都需要知道
  6. struts2,实现Ajax异步通信
  7. LeetCode 915. 分割数组
  8. 字段类型 sqoop_数据迁移工具Sqoop
  9. iview表单验证不生效问题注意点
  10. 模仿$.Callbacks实现
  11. The Generalist和Visualize Value在去中心化内容发布平台Mirror上发起众筹
  12. 深度学习-吴恩达-笔记-1-深度学习引言
  13. JavaScript字符转Unicode,顺便说句:GitHub的Oh no页面很亮
  14. img标签绝对位置定位,图片显示在签名之上。
  15. atitit。win7 win8 win9 win10 win11 新特性总结与战略规划
  16. ALOS 12.5米精度DEM数据下载与处理
  17. 企业微信 Android端开发
  18. Java中将将JPG图片转GIF动画和将GIF转JPG图片
  19. 基于Basys2的数码管动态扫描module(verilog)的模块化设计
  20. 物联网-移远m26使用MQTT协议,AT指令对接阿里云

热门文章

  1. Windows设置自己的程序开机自动启动
  2. 基于Python的Bangumi中动画片排行榜数据可视化分析
  3. Java方法 根据经纬度计算距离
  4. WinFR 界面版 - 免费好用的数据恢复软件,误删文件轻松找回
  5. 计算机网络管理员试题实操,网络管理员试题(实操).doc
  6. NorthWind基本数据库添加问题
  7. [笔记] Mac直接运行Windows迷你迅雷
  8. k3服务器注册,K3服务器信任注册设置
  9. ios睡眠分析 卧床 睡眠_HealthKit睡眠分析
  10. 脉冲神经网络 神经元模型-HH模型(1)