Xgboost算法详解

时间:2024-03-17 21:24:24

目录:
一、xgboost算法整体思路
二、本质区别
三、结构分的推导
四、增益公式
五、其他相关问题

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

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

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

三、结构分的推导
结构分的意义:当已知树的结构时的损失函数的最小值。Xgboost的增益定义就是分裂前的结构分减去分裂后的结构分,选择增益最大的分割点作为最优分割点,其意义为使分裂后模型损失比分裂前损失减小最大的那个分割点。这样的增益定义方法拟合的该轮残差树效果很优。

第k轮迭代时模型表达式:
Xgboost算法详解

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

第k轮时模型的损失函数为:
Xgboost算法详解
其中,Xgboost算法详解表示第k轮的正则化项,这是Xgboost与GBDT的其中一个区别。
Xgboost算法详解

变形一:损失函数泰勒二阶展开
泰勒公式二街展开为:Xgboost算法详解
Xgboost算法详解
其中,Xgboost算法详解表示第i个样本的一阶导数,也称一阶残差;Xgboost算法详解表示第i个样本的二阶导数,也称二阶残差。由公式可知,在每轮迭代之前,每个样本的一、二阶残差已经可以确定。注意,Xgboost算法详解Xgboost算法详解是在每轮迭代之前就已经可知确定的了。

所以,损失函数的泰勒二阶展开表达式为:
Xgboost算法详解

变形二:损失函数去掉常数项
因为结构分数的意义是已知树的结构时的损失函数的最小值。我们的目的是要求损失函数的最小值,在求极值的过程可以把常数项Xgboost算法详解去掉,简化为:
Xgboost算法详解

变形三:将树结构转化为叶子结构
为什么要转化为叶子结构?
结构分最后推导出的结构是用gi和hi表示的,即只要求得每轮的gi和hi就能求出每轮的结构分,即只要求得每轮的gi和hi就能求出每轮中所有分割点的增益。将树结构表达式转化为叶子结构的表达式是为了推导能够用gi和hi表示结构分做准备。

将残差树映射成关于叶子(即样本)的函数
先不考虑复杂的决策树生成过程,假设最后生成的残差树如下所示:
Xgboost算法详解
树结构时的表示为Xgboost算法详解,用另一种方法表示这棵树:用每个叶子节点的输出Xgboost算法详解(唯一值)表示这棵树,函数表达式为:Xgboost算法详解
假设gi=(0.2,0.8,0.5,0.1),Xgboost算法详解,对所有样本范围内求
Xgboost算法详解
=[0.28+0.89+0.59+0.110]
=[(0.2)*8+(0.8+0.5)*9+(0.1)*10]
Xgboost算法详解
同理,对于Xgboost算法详解
Xgboost算法详解
Xgboost算法详解

变形四:求出最小值,即结构分
假设wj与Gj,Hj无关,即假设一直树的结构,Xgboost算法详解对wj求导=0,即:
Xgboost算法详解
得:
极值点Xgboost算法详解
代入得结构分:Xgboost算法详解
即结构分的意义:当已知树的结构时的损失函数的最小值。

四、增益
增益的意义
Xgboost的增益定义就是分裂前的结构分减去分裂后的结构分,选择增益最大的分割点作为最优分割点,其意义为使分裂后模型损失比分裂前损失减小最大的那个分割点。这样的增益定义方法拟合的该轮残差树效果很优。
最终增益表达式如下:
Xgboost算法详解
举例,在某一轮迭代时进行节点2分裂某一个分割点分裂后如下:

Xgboost算法详解
分裂前的gi,hi为2节点的样本所对应的gi,hi,分裂后的gli,hli为节点4的样本所对应的gi,hi,分裂后的gri,hri为节点5的样本所对应的gi,hi。

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

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

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

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

xgboost根据什么准则进行分裂?(祥见宝典)
根据分裂前后结构分数之差作为增益:
Xgboost算法详解
在设置γ不等于0的时候,这个值有什么作用?
Xgboost算法详解
设置γ不等于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算法详解》)
Xgboost算法详解