集成学习(5)— XGBoost

1. AdaBoost回顾

AdaBoost,是英文"Adaptive Boosting"(自适应增强),它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。白话的讲,就是它在训练弱分类器之前,会给每个样本一个权重,训练完了一个分类器,就会调整样本的权重,前一个分类器分错的样本权重会加大,这样后面再训练分类器的时候,就会更加注重前面分错的样本, 然后一步一步的训练出很多个弱分类器,最后,根据弱分类器的表现给它们加上权重,组合成一个强大的分类器,就足可以应付整个数据集了。

2. GBDT回顾

AdaBoost训练弱分类器关注的是那些被分错的样本,AdaBoost每一次训练都是为了减少错误分类的样本。而GBDT训练弱分类器关注的是残差,也就是上一个弱分类器的表现与完美答案之间的差距,GBDT每一次训练分类器,都是为了减少这个差距,GBDT每一次的计算是都为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新的模型。这是什么意思呢? 我可以举个例子,假设我们去银行借钱,我们想让一个决策树系统来预测可以借给我们多少钱, 如果标准答案是1000的话,假设第一棵决策树预测,可以借给我们950块钱, 那么离标准答案的1000还差50, 效果不算好,能不能提高一些呢?我们就再加一棵决策树,这课决策树过来之后,看到前面的那个已经预测到950了,只是差50, 那么我可以聚焦在这个50上,把这个残差变得再小一些,所以第二个决策树预测结果是30, 那么前两棵决策树预测结果结合起来是980, 离标准答案差20, 所以加了一棵树之后,效果好了。那么还能不能提升呢?我再来一棵树,发现残差只有20了,那我把残差变得再小, 结果第三个决策树预测20, 那么这三棵树就可以正确的预测最终的1000了。
GBDT训练过程如下:

  • 有一个样本[数据->标签]是:[(feature1,feature2,feature3)-> 1000块]
  • 第一棵决策树用这个样本训练的预测为950
  • 那么第二棵决策树训练时的输入,这个样本就变成了:[(feature1,feature2,feature3)->50]
  • 第二棵决策树用这个样本训练的预测为30
  • 那么第三棵决策树训练时的输入,这个样本就变成了:[(feature1,feature2,feature3)->20]
  • 第三棵决策树用这个样本训练的预测为20

也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关。GBDT是旨在不断减少残差(回归),通过不断加入新的树旨在在残差减少(负梯度)的方向上建立一个新的模型。——即损失函数是旨在最快速度降低残差。

3. XGBoost基本概述

以一个实例看xgboost
假设我想预测,这一家子人中每个人想玩游戏的意愿值。我们用xgboost解决这个问题,就是我先训练出来第一棵决策树, 预测了一下小男孩想玩游戏的意愿是2, 然后发现离标准答案差一些,又训练出来了第二棵决策树, 预测了一下小男孩想玩游戏的意愿是0.9, 那么两个相加就是最终的答案2.9。这个其实就接近了标准答案。所以xgboost是训练出来的弱分类结果进行累加就是最终的结论
在这里插入图片描述

从上可以发现,如果不考虑工程实现、解决问题上的一些差异,xgboost与gbdt比较大的不同就是目标函数的定义,但这俩在策略上是类似的,都是聚焦残差(更准确的说, xgboost其实是gbdt算法在工程上的一种实现方式) GBDT旨在通过不断加入新的树最快速度降低残差,而XGBoost则可以人为定义损失函数(可以是最小平方差、logistic loss function、hinge loss function或者人为定义的loss function),只需要知道该loss function对参数的一阶、二阶导数便可以进行boosting,其进一步增大了模型的泛化能力,其贪婪法寻找添加树的结构以及loss function中的损失函数与正则项等一系列策略也使得XGBoost预测更准确。

Adaboost、GBDT、XGB的区别
AdaBoost叫做自适应提升,和GBDT,Xgboost提升时采用的策略不同,前者聚焦错误样本后者聚焦与标准答案的残差。而GBDT和Xgboost叫做boosting集成学习,提升时策略类似,都是聚焦残差,但是降低残差的方式又各有不同

4. XGB基本原理

XGBoost 是由 k 个基模型组成的一个加法运算式:
y ^ i = ∑ t = 1 k f t ( x i ) \hat{y}_{i}=\sum_{t=1}^{k} f_{t}\left(x_{i}\right) y^i=t=1kft(xi)

其中 f k f_k fk为第k个基模型, y ^ i \hat{y}_i y^i 为第i个样本的预测值。那么损失函数可由预测值 y ^ i \hat{y}_i y^i与真实值 y i y_i yi进行表示:
L = ∑ i = 1 n l ( y i , y ^ i ) L=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}\right) L=i=1nl(yi,y^i)

其中n为样本数量
在这里插入图片描述

4.1 一个实例理解建树过程

(1)首先,我们有三个学生, 属性和标签如下:
在这里插入图片描述
我们初始化三个样本的考试成绩预测值为0。
(2)定义目标函数
模型的预测精度由偏差和方差共同决定,损失函数代表了模型的偏差,想要方差小则需要更简单的模型, 所以目标函数最终由损失函数L与抑制模型复杂度的正则项Ω组成, 所以目标函数如下
O b j = ∑ i = 1 n l ( y ^ i , y i ) + ∑ t = 1 k Ω ( f t ) O b j=\sum_{i=1}^{n} l\left(\hat{y}_{i}, y_{i}\right)+\sum_{t=1}^{k} \Omega\left(f_{t}\right) Obj=i=1nl(y^i,yi)+t=1kΩ(ft)

其中 Ω ( f t ) \Omega(f_t) Ω(ft)是正则化项
Ω ( f t ) = γ T t + 1 2 λ ∑ j = 1 T w j 2 \Omega\left(f_{t}\right)=\gamma T_{t}+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Ω(ft)=γTt+21λj=1Twj2

T t T_t Tt为叶子节点数, w j w_j wj 表示j叶子上的节点权重, λ , γ \lambda,\gamma λ,γ是预先给定的超参数。引入了正则化之后,算法会选择简单而性能优良的模型, 正则化项只是用来在每次迭代中抑制弱分类器 f i ( x ) f_i(x) fi(x)过拟合,不参与最终模型的集成

boosting模型是前向加法, 以第t步模型为例, 模型对第i个样本 x i x_i xi的预测为:
y ^ i t = y ^ i t − 1 + f t ( x i ) \hat{y}_{i}^{t}=\hat{y}_{i}^{t-1}+f_{t}\left(x_{i}\right) y^it=y^it1+ft(xi)

其中, y ^ i t − 1 \hat{y}_{i}^{t-1} y^it1是第t-1步的模型给出的预测值, 是已知常数, f t ( x i ) f_{t}\left(x_{i}\right) ft(xi)是我们这次需要加入的新模型,所以把这个代入上面,就可以进一步化简:
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 ) ) + ∑ i = 1 t Ω ( f i ) \begin{aligned} 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)\right)+\sum_{i=1}^{t} \Omega\left(f_{i}\right) \end{aligned} Obj(t)=i=1nl(yi,y^it)+i=1tΩ(fi)=i=1nl(yi,y^it1+ft(xi))+i=1tΩ(fi)

这个就是xgboost的目标函数了,最优化这个目标函数,其实就是相当于求解当前的 f t ( x i ) f_{t}\left(x_{i}\right) ft(xi)。Xgboost系统的每次迭代都会构建一颗新的决策树,决策树通过与真实值之间残差来构建。

回到我们的例子,假设已经根据天赋这个属性建立了一棵决策树A
在这里插入图片描述
我们有了第一棵树, 通过这个树的预测结果:
在这里插入图片描述
那么我们建立第二棵树的时候,我们是考虑的残差,也就是样本其实变成了下面这样:
在这里插入图片描述
通过最小化残差学习到一个通过学习时间属性构建的决策树得到了90+5,60+5,90-5的预测值,再继续通过(100-95=5)(70-65)(86-85)的残差构建下一个决策树,以此类推,当迭代次数达到上限或是残差不再减小是停止,就得到一个拥有多个(迭代次数)决策树的强分类器。

(3)目标函数的Taylor化简
根据Taylor公式, 我们把函数 f ( x + Δ ( x ) ) f(x+\Delta(x)) f(x+Δ(x))在点处二阶展开,可得到:
f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x) \approx f(x)+f^{\prime}(x) \Delta x+\frac{1}{2} f^{\prime \prime}(x) \Delta x^{2} f(x+Δx)f(x)+f(x)Δx+21f(x)Δx2
l ( y i , y ^ i t − 1 + f t ( x i ) ) l\left(y_{i}, \hat{y}_{i}^{t-1}+f_{t}\left(x_{i}\right)\right) l(yi,y^it1+ft(xi)) y ^ i t − 1 \hat{y}_{i}^{t-1} y^it1视为 x x x f t ( x ) f_t(x) ft(x)视为 Δ ( x ) \Delta(x) Δ(x), 那么目标函数就可以写成:
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 ) ] + ∑ i = 1 t Ω ( f i ) O b j^{(t)} \approx \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]+\sum_{i=1}^{t} \Omega\left(f_{i}\right) Obj(t)i=1n[l(yi,y^it1)+gift(xi)+21hift2(xi)]+i=1tΩ(fi)

其中 g i g_i gi是损失函数 l l l的一阶导数, h i h_i hi是损失函数 l l l的二阶导, 注意这里的求导是对 y ^ i t − 1 \hat{y}_{i}^{t-1} y^it1求导。
g i = ∂ L ( y i , y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) , h i = ∂ 2 L ( y i , y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) g_{i}=\frac{\partial L\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)}{\partial \hat{y}_{i}^{(t-1)}}, h_{i}=\frac{\partial^{2} L\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)}{\partial \hat{y}_{i}^{(t-1)}} gi=y^i(t1)L(yi,y^i(t1)),hi=y^i(t1)2L(yi,y^i(t1))

后面见:深入理解XGboost

概括的说XGboost:

xgboost是好多弱分类器的集成,训练弱分类器的策略就是尽量的减小残差,使得答案越来越接近正确答案。xgboost的精髓部分是目标函数的Taylor化简,这样就引入了损失函数的一阶和二阶导数。然后又把样本的遍历转成了对叶子节点的遍历,得到了最终的目标函数。这个函数就是衡量一棵树好坏的标准。在建树过程中,xgboost采用了贪心策略,并且对寻找分割点也进行了优化。基于这个,才有了后面的最优点切分建立一棵树的过程。xgboost训练的时候,是通过加法进行训练,也就是每一次只训练一棵树出来, 最后的预测结果是所有树的加和表示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值