从头到尾理解树模型(三):XGBoost及面试常见问题

26 篇文章 13 订阅
26 篇文章 6 订阅

XGBoost在GBDT的基础上进行了改进,效果得到了明显的提升。一大不同是显式的引入了正则化项,用来约束决策树的复杂度。本文其实只是XGBoost求解过程的推导,并没有完整讲解明白,建议参考后面的参考文献,从开始建立一棵树,真正的弄明白XGBoost。

1. 引理

1.1 目标函数

我们求解任何一个监督学习问题,都需要目标函数。
Obj ⁡ ( Θ ) = L ( Θ ) + Ω ( Θ ) \operatorname{Obj}(\Theta)=L(\Theta)+\Omega(\Theta) Obj(Θ)=L(Θ)+Ω(Θ)

目标函数由两部分构成:损失函数和正则项。

损失函数: 用来衡量模型的拟合情况,构建更好的预测模型,eg. RMSE、Cross Entropy等。

正则项: 预测时,使得模型具有更小的方差,使得预测更加的稳定,同时避免过拟合,eg. L1、L2

1.2 泰勒公式

泰勒公式,是我们众多优化算法推导的基础,将复杂函数优化问题,转变成多项式函数问题。

泰勒公式:
f ( x ) = ∑ n = 0 ∞ f ( n ) ( x 0 ) n ! ( x − x 0 ) n f(x)=\sum_{n=0}^{\infty} \frac{f^{(n)}\left(x_{0}\right)}{n !}\left(x-x_{0}\right)^{n} f(x)=n=0n!f(n)(x0)(xx0)n

一阶泰勒公式:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) \approx f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right) f(x)f(x0)+f(x0)(xx0)

二阶泰勒公式:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) 2 2 f(x) \approx f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+f^{\prime \prime}\left(x_{0}\right) \frac{\left(x-x_{0}\right)^{2}}{2} f(x)f(x0)+f(x0)(xx0)+f(x0)2(xx0)2

2. XGBoost模型原理:

2.1 树集成:

前面已经介绍了,集成学习,也就是多棵树的集成,针对XGBoost详细介绍,集成的原理。前面的介绍的集成树,多是使用的普通决策树。GBDT引入回归树(CART)(classification and regression trees)。在XGBoost中不仅使用CART同时包括分类线性回归。

一颗CART树:

同样是对是否有人喜欢电脑游戏进行分类:
image.png

我们把一个家庭的成员分成不同的叶子,并把他们分配到相应的叶子节点上。 CART 与 decision trees(决策树)有些许的不同,就是叶子只包含决策值。在 CART 中,每个叶子都有一个 real score(真实的分数).

多颗树:

使用多棵树预测,能显著提高我们的准确率,前面已经提到过。
image.png
树的集成归根到底是Boosting模型,Boosting的实质是个加性模型

y ^ i ( 0 ) = 0 y ^ i ( 1 ) = f 1 ( x i ) = y ^ i ( 0 ) + f 1 ( x i ) y ^ i ( 2 ) = f 1 ( x i ) + f 2 ( x i ) = y ^ i ( 1 ) + f 2 ( x i ) ⋯ y ^ i ( t ) = ∑ k = 1 t f k ( x i ) = y ^ i ( t − 1 ) + f t ( x i ) \begin{aligned} \hat{y}_{i}^{(0)} &=0 \\ \hat{y}_{i}^{(1)} &=f_{1}\left(x_{i}\right)=\hat{y}_{i}^{(0)}+f_{1}\left(x_{i}\right) \\ \hat{y}_{i}^{(2)} &=f_{1}\left(x_{i}\right)+f_{2}\left(x_{i}\right)=\hat{y}_{i}^{(1)}+f_{2}\left(x_{i}\right) \\ & \cdots \\ \hat{y}_{i}^{(t)} &=\sum_{k=1}^{t} f_{k}\left(x_{i}\right)=\hat{y}_{i}^{(t-1)}+f_{t}\left(x_{i}\right) \end{aligned} y^i(0)y^i(1)y^i(2)y^i(t)=0=f1(xi)=y^i(0)+f1(xi)=f1(xi)+f2(xi)=y^i(1)+f2(xi)=k=1tfk(xi)=y^i(t1)+ft(xi)
其实就是,第t颗树的第i个样本的推导公式,不断从前面建立递推公式。

所以可以将模型的预测结果表示为:
y ^ i = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y}_{i}=\sum_{k=1}^{K} f_{k}\left(x_{i}\right), f_{k} \in \mathcal{F} y^i=k=1Kfk(xi),fkF

f i ( x ) f_i(x) fi(x)是单颗树的预测结果。

2.2 数学推导:

1. 建立该模型的目标函数:

O b j ( Θ ) = ∑ i n l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) {Obj}(\Theta)=\sum_{i}^{n} l\left(y_{i}, \hat{y}_{i}\right)+\sum_{k=1}^{K} \Omega\left(f_{k}\right) Obj(Θ)=inl(yi,y^i)+k=1KΩ(fk)

2.修改目标函数:根据上式对目标函数进行具体化

O b j ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) + Ω ( f t ) ) O b j^{(t)}=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}^{(t)}\right)+\sum_{i=1}^{t} \Omega\left(f_{i}\right)=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}^{(t-1)}+f_{t}\left(x_{i}\right)+\Omega\left(f_{t}\right)\right) Obj(t)=i=1nl(yi,y^i(t))+i=1tΩ(fi)=i=1nl(yi,y^i(t1)+ft(xi)+Ω(ft))

使用MSE(均方误差)作为误差函数: O b j ( t ) = ∑ i = 1 n ( y i − ( y ^ i ( t − 1 ) + f t ( x i ) ) ) 2 + Ω ( f t ) + c o n s t = ∑ i = 1 n [ ( 2 ( y ^ i ( t − 1 ) − y i ) f t ( x i ) + f t ( x i ) 2 ] ) + Ω ( f t ) + const  \begin{aligned} O b j^{(t)} &=\sum_{i=1}^{n}\left(y_{i}-\left(\hat{y}_{i}^{(t-1)}+f_{t}\left(x_{i}\right)\right)\right)^{2}+\Omega\left(f_{t}\right)+ const \\ &=\sum_{i=1}^{n}\left[\left(2\left(\hat{y}_{i}^{(t-1)}-y_{i}\right) f_{t}\left(x_{i}\right)+f_{t}\left(x_{i}\right)^{2}\right]\right)+\Omega\left(f_{t}\right)+\text {const } \end{aligned} Obj(t)=i=1n(yi(y^i(t1)+ft(xi)))2+Ω(ft)+const=i=1n[(2(y^i(t1)yi)ft(xi)+ft(xi)2])+Ω(ft)+const 

3.对目标函数进行二阶泰勒公式展开:

O b j ( t ) = ∑ i = 1 n [ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) + c o n s t = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) Obj^{(t)}=\sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)+g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right)+ const \\ =\sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right) Obj(t)=i=1n[l(yi,y^i(t1))+gift(xi)+21hift2(xi)]+Ω(ft)+const=i=1n[gift(xi)+21hift2(xi)]+Ω(ft)

g i = ∂ y ^ i ( t − 1 ) l ( y i , y ^ i ( t − 1 ) ) h i = ∂ y ^ i ( t − 1 ) 2 l ( y i , y ^ i ( t − 1 ) ) \begin{aligned} g_{i} &=\partial_{\hat{y}_{i}^{(t-1)}} l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right) \\ h_{i} &=\partial_{\hat{y}_{i}^{(t-1)}}^{2} l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right) \end{aligned} gihi=y^i(t1)l(yi,y^i(t1))=y^i(t1)2l(yi,y^i(t1))
为什么使用二阶泰勒展开:

  • 精准性:相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更为精准的逼近真实的损失函数

  • 可扩展性:损失函数支持自定义,只需要新的损失函数二阶可导

4.定义一棵树和正则项:

f t ( x ) = w q ( x ) , w ∈ R T , q : R d → { 1 , 2 , ⋯   , T } f_{t}(x)=w_{q(x)}, w \in R^{T}, q : R^{d} \rightarrow\{1,2, \cdots, T\} ft(x)=wq(x),wRT,q:Rd{1,2,,T}

Ω ( f ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f)=\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Ω(f)=γT+21λj=1Twj2

w w w: 叶结点预测值,也就是我们开始人物头像下面的那个分数;
q q q: 是将每个数据点分配给叶子的函数;
T T T: 叶子的数量

5.修改目标函数的树定义和复杂度:将(1)和(2)带入我们前面得到的公式

O b j ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T \begin{aligned} Obj^{(t)} & \approx \sum_{i=1}^{n}\left[g_{i} w_{q\left(x_{i}\right)}+\frac{1}{2} h_{i} w_{q\left(x_{i}\right)}^{2}\right]+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} \\ &=\sum_{j=1}^{T}\left[\left(\sum_{i \in I_{j}} g_{i}\right) w_{j}+\frac{1}{2}\left(\sum_{i \in I_{j}} h_{i}+\lambda\right) w_{j}^{2}\right]+\gamma T \end{aligned} Obj(t)i=1n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2=j=1TiIjgiwj+21iIjhi+λwj2+γT

= ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T =\sum_{j=1}^{T}\left[G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2}\right]+\gamma T =j=1T[Gjwj+21(Hj+λ)wj2]+γT

6.模型最优解:

看到曙光,上式是关于 W j W_j Wj的二次函数,利用求根公式即可: w j ∗ = − G j H j + λ w_{j}^{*}=-\frac{G_{j}}{H_{j}+\lambda} wj=Hj+λGj 时取得最优解。

最优解是: O b j ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T O b j^{*}=-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T Obj=21j=1THj+λGj2+γT

鉴于公式复杂,给出一副简单图,说明每个变量到底是任何计算的。
image.png
而这一节第一幅图中的样本的分数,从上图就可以明白了。

7. 学习树的结构:

我们尝试将一片叶子分成两片,那如何判断是否要进行划分,我们使用下面的公式:
Gain ⁡ = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ \operatorname{Gain}=\frac{1}{2}\left[\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{\left(G_{L}+G_{R}\right)^{2}}{H_{L}+H_{R}+\lambda}\right]-\gamma Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ
公式分解:

  1. 新左叶上的得分;
  2. 新右叶上的得分;
  3. 原始叶子上的得分;
  4. additional leaf(附加叶子)上的正则化。

判断标准: 如果增益小于正则化(gama),我们最好不要添加那个分支。

3.XGBoost VS GBDT:

GBDTXGBoost
定义是ML的某种算法是GBDT算法的工程实现
正则项显式的加入,控制过拟合
泰勒展开损失函数的一阶信息损失函数的二阶信息
基础分类器CART多种分类器
数据使用使用全部数据支持采样col_sample和subsample
缺失值未进行处理自动学习
并行化不支持并行特征维度并行,并行查找每个特征的最佳分割点
控制过拟合支持列抽样,样本采样,正则项

4. XGBoost常见问题:

xgboost是如何处理缺失值的:

  • 寻找最佳分裂节点时, 只对该列特征值为 non-missing 的样本上对应的特征值进行遍历;
  • 缺失值数据会被分到左子树和右子树分别计层损失,选择较优的那一个
  • 如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树

xgboost是如何实现并行化的:

boosting技术中下一棵树依赖上述树的训练和预测,所以树与树之间应该是只能串行。在选择特征最佳分裂点,进行枚举的时候并行!(据说恰好这个也是树形成最耗时的阶段)。
同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。

xgboost特征重要性是如何得到的:

xgboost特征重要性从3个指标进行计算,可以用通过修改importance_type参数来选择不同的指标。

  1. ’weight‘:代表着某个特征被选作分裂结点的次数
  2. ’gain‘:使用该特征作为分类结点的信息增益
  3. ’cover‘:某特征作为划分结点,覆盖样本总数的平均值

学习率是怎么回事:

实际并不是梯度下降等算法中常见的学习率(步长),而是一个衰减因子,代表当前树继续训练过程中衰减的参数。第一棵树的对数据的拟合效果并不好,为了适当的减小前面的树的影响。引入了衰减因子,GBDT中已经引用,用于控制过拟合
Why does XGBoost have a learning rate?

参考资料:

1. 机器学习算法中 GBDT 和 XGBOOST 的区别有哪些
2. GBDT算法原理深入解析
3. 通俗的将Xgboost的原理讲明白
4. xgboost原理及并行实现
5. XGboost: A Scalable Tree Boosting System论文及源码导读
6. 学习笔记 | XGBoost
7. 决策树、RF、xgboost如何处理缺失值?判断特征重要性?缺失值不敏感?-CSDN
8. 怎么理解决策树、xgboost能处理缺失值?而有的模型(svm)对缺失值比较敏感呢?
9. xgboost原理
10. Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
11. xgboost入门与实战(原理篇)
12. 通俗、有逻辑的写一篇说下Xgboost的原理,供讨论参考
13. XGBoost 中文文档
14. 用xgboost模型对特征重要性进行排序
15. 通俗理解kaggle比赛大杀器xgboost
16. XGBoost详解
17. XGBoost原理和底层实现剖析
18. xgboost原理分析以及实践
19. 珍藏版 | 20道XGBoost面试题
20. Xgboost参数调优的完整指南及实战
21.『我爱机器学习』集成学习(三)XGBoost
22.对xgboost的理解

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linxid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值