Xgboost算法详解

【目录】
一、xgboost算法整体思路
二、本质区别
三、增益的推导
<1> 损失函数表达
<2> 泰勒二街展开近似代替损失函数
<3> 去掉常数项
<4> 把包含抽象残差树的损失函数转化为没有包含抽象残差树的形式(引入一个未知变量)
<5> 对未知变量求偏导=0,得到极值点代入损失函数,得到极值,即结构分
<6> 求增益:增益等于分裂前结构分减去分裂后左、右结构分
四、其他相关问题

一、xgboost算法整体思路
xgboost算法是属于boosting框架的算法。所以xgboost的整体思路满足boosting框架整体思路:
–>初始化f0(xi)
–>拟合残差树h1(xi)(通过不同的分裂准则,即不同的增益,这也是各个boosting算法的最大的区别,也是本节要讲的重点)
–>更新f1 = f0(xi) + h1(xi)
–>依次类推,不断迭代,直到模型满足收敛条件。

boosting框架的算法本质区别或讲解重点是在每一轮迭代过程中如何拟合一棵残差树。本文也是围绕这个展开,讲解xgboost算法如何在每轮迭代过程中拟合一棵残差树,主要是每轮拟合残差树分裂时增益公式的推导。

二、本质区别
每轮迭代拟合的残差树不同。残差树的不同本质是分裂准则不同,即增益不同。所以,无论是XGBoost还是其他boosting类的算法,其本质区别是每轮拟合残差树时增益定义的不同。Xgboost采用的增益是分裂前的结构分与分裂后的结构分之差。

三、增益的推导
Xgboost的亮点之一是定义一种分裂准则,使每次最优分割点的分裂都能比没有分裂时损失减少最大。这也是Xgboost高效的原因之一。因此,找到了一种方法:定义分裂前的结构分减去分裂后的结构分作为分割点的增益,然后找到增益最大的分割点作为该次分裂的最优分割点。结构分的意义:当已知树的结构时的损失函数的最小值。在已知gi,hi的条件下,结构分就可以求解。
结构分的意义:当已知树的结构时的损失函数的最小值。Xgboost的增益定义就是分裂前的结构分减去分裂后的结构分,选择增益最大的分割点作为最优分割点,其意义为使分裂后模型损失比分裂前损失减小最大的那个分割点。这样的增益定义方法拟合的该轮残差树效果很优。
<1> 损失函数表达
第k轮迭代时模型表达式:
在这里插入图片描述

其中,表示第k轮拟合的残差树

第k轮时模型的损失函数为:
在这里插入图片描述
其中,在这里插入图片描述表示第k轮的正则化项,这是Xgboost与GBDT的其中一个区别。
在这里插入图片描述

<2> 泰勒二街展开近似代替损失函数
泰勒公式二街展开为:在这里插入图片描述
在这里插入图片描述
其中,在这里插入图片描述表示第i个样本的一阶导数,也称一阶残差;在这里插入图片描述表示第i个样本的二阶导数,也称二阶残差。由公式可知,在每轮迭代之前,每个样本的一、二阶残差已经可以确定。注意,在这里插入图片描述在这里插入图片描述是在每轮迭代之前就已经可知确定的了。

所以,损失函数的泰勒二阶展开表达式为:
在这里插入图片描述

<3> 去掉常数项
因为结构分数的意义是已知树的结构时的损失函数的最小值。我们的目的是要求损失函数的最小值,在求极值的过程可以把常数项在这里插入图片描述去掉,简化为:
在这里插入图片描述

<4> 把包含抽象残差树的损失函数转化为没有包含抽象残差树的形式(引入一个未知变量)
为什么要转化为叶子结构?
结构分最后推导出的结构是用gi和hi表示的,即只要求得每轮的gi和hi就能求出每轮的结构分,即只要求得每轮的gi和hi就能求出每轮中所有分割点的增益。将树结构表达式转化为叶子结构的表达式是为了推导能够用gi和hi表示结构分做准备。

怎么转化?
通过以上公式,我们可以知道,只要将该轮迭代的残差树在这里插入图片描述做某种转化使损失函数不再用一棵抽象的残差树表示而是用具体的常量和转化后可能引入的某变量组成,这样就可以对转化后引入的变量求导从而用gi,hi这些常量表示损失函数的极值(即结构分)。以下就是讲解如何将该轮迭代的残差树在这里插入图片描述转化使损失函数不再用一棵抽象的残差树表示而是用具体的常量和转化后可能引入的某变量组成。
将残差树映射成关于叶子(即样本)的函数
先不考虑复杂的决策树生成过程,假设最后生成的残差树如下所示:
在这里插入图片描述
树结构时的表示为在这里插入图片描述,用另一种方法表示这棵树:用每个叶子节点的输出在这里插入图片描述(唯一值)表示这棵树,函数表达式为:在这里插入图片描述
假设gi=(0.2,0.8,0.5,0.1),在这里插入图片描述,对所有样本范围内求
在这里插入图片描述
=[0.28+0.89+0.59+0.110]
=[(0.2)*8+(0.8+0.5)*9+(0.1)*10]
在这里插入图片描述
同理,对于在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<5> 对未知变量求偏导=0,得到极值点代入损失函数,得到极值,即结构分
假设wj与Gj,Hj无关,即假设一直树的结构,在这里插入图片描述对wj求导=0,即:
在这里插入图片描述
得:
极值点在这里插入图片描述
代入得结构分:在这里插入图片描述
即结构分的意义:当已知树的结构时的损失函数的最小值。

<6> 求增益:增益等于分裂前结构分减去分裂后左、右结构分
增益的意义
Xgboost的增益定义就是分裂前的结构分减去分裂后的结构分,选择增益最大的分割点作为最优分割点,其意义为使分裂后模型损失比分裂前损失减小最大的那个分割点。这样的增益定义方法拟合的该轮残差树效果很优。
最终增益表达式如下:
在这里插入图片描述
举例,在某一轮迭代时进行节点2分裂某一个分割点分裂后如下:

在这里插入图片描述
分裂前的gi,hi为2节点的样本所对应的gi,hi,分裂后的gli,hli为节点4的样本所对应的gi,hi,分裂后的gri,hri为节点5的样本所对应的gi,hi。

四、其他相关问题
gi、hi的理解
gi,hi表示损失函数对某一样本的一阶导和二阶导,也叫样本误差。而不是整个目标函数的一阶导数和二阶导数。

*损失函数泰勒二阶展开的目的是什么?

*当基学习器不是决策树时(比如是线性回归算法)的xgboost是如何运行的?

怎样计算每个叶子节点的误差?
第j节点所有样本的误差之和
就是结构分数中的

xgboost根据什么准则进行分裂?(祥见宝典)
根据分裂前后结构分数之差作为增益:
在这里插入图片描述
在设置γ不等于0的时候,这个值有什么作用?
在这里插入图片描述
设置γ不等于0之后,当Gain<=0,则不进行分裂,这其实预剪枝的效果。

xgboost生长方式是什么样子的?
Level-wise

*xgboost的预排序算法是什么样子的?

xgboost如何做分类(或GBDT怎么做分类、lgb怎么做分类)

xgboost和GBDT的区别
1 损失函数:
xgboost损失函数二阶泰勒展开近似替代,只要损失函数有二阶导的都能用xgboost框架,所以不限制基函数的使用,GBDT只求一阶,基函数只能是CART;
xgboost在损失函数中加入正则化项,所以xgboost相比GBDT比较不容易过拟合。
2 优化速度:xgboost自定义的增益分裂(通过二阶泰勒展开推导得到),让每轮迭代模型损失函数减小的幅度最大;GBDT用负梯度代替残差,拟合残差树,每一轮迭代模型损失有减小,但减小的幅度不能保证最大。加快优化速度。
3 特征采样:xgboost采样类似随机森林的做法,对特征采样。这样做降低了计算量也防止过拟合。
4 并行:xgboost每一轮迭代中支持增益、样本损失并行,支持预测时并行。

*为什么xgboost比GBDT效果好?
xgboost自定义的增益分裂,让每轮迭代模型损失函数减小的幅度最大;GBDT用负梯度代替残差,拟合残差树,每一轮迭代模型损失有减小,但减小的幅度不能保证最大。

Xgboost的缺点(与LightGBM的区别,参考《LightGBM算法详解》)
在这里插入图片描述

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值