机器学习-树模型(Boosting)相关问题:极限梯度提升树XGBoost

XGBoost

一、梯度提升树

XGBoost的基础是梯度提升算法,因此我们必须先从了解梯度提升算法开始。梯度提升(Gradient boosting)是构建预测模型的最强大技术之一,它是集成算法中提升法(Boosting)的代表算法。集成算法通过在数据上构建多个弱评估器,汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现。弱评估器被定义为是表现至少比随机猜测更好的模型,即预测准确率不低于50%的任意模型,XGBoost背后也是CART树,这意味着XGBoost中所有的树都是二叉的。

Adaboost与梯度提升树都可以用以下的模型进行表示:
y ^ i ( k ) = ∑ k = 1 K γ k h k ( x i ) \hat{y}_{i}^{(k)}=\sum_{k=1}^{K} \gamma_{k} h_{k}\left(x_{i}\right) y^i(k)=k=1Kγkhk(xi)
只不过adaboost是训练完一棵树后,会重新赋值样本的权重,分类错误的样本的权重会增大而分类正确的样本的权重则会减小。

值得注意的是,XGB作为GBDT的改进,在y上却有所不同。对于XGB来说,每个叶子节点上会有一个预测分数(prediction score),也被称为叶子权重。这个叶子权重就是所有在这个叶子节点上的样本在这一棵树上的回归取值,用 f k ( x i ) f_k(x_i) fk(xi)表示。

GBDT中的 h k ( x i ) h_k(x_i) hk(xi)是由每个叶子上的均值求得的结果,而XGBoost中的 f k ( x i ) f_k(x_i) fk(xi)是预测分数,是由一个很复杂的公式算出来的,这也是XGB与GBDT的一个核心区别!

1.1 基评估器的个数(超参数)

无论是在随机森林还是XGBoost中,树的个数是这个模型中相当重要的一个超参数,树越多,模型的学习能力就会越强大,也会越容易发生过拟合。

1.2 自助抽样:有放回的随机抽样(subsample)

要保证模型整体的效果变强,随着迭代的进行,模型整体的效果必须要逐渐提升,最后实现集成模型的效果最优。我们首先从训练数据下手
我们训练模型之前,必然会有一个巨大的数据集。我们都知道树模型是天生过拟合的模型,并且如果数据量太过巨大,树模型的计算会非常缓慢,因此,我们要对我们的原始数据集进行有放回抽样(bootstrap)。有放回的抽样每次只能抽取一个样本,若我们需要总共N个样本,就需要抽取N次。每次抽取一个样本的过程是独立的,这一次被抽到的样本会被放回数据集中,下一次还可能被抽到,因此抽出的数据集中,可能有一些重复的数据。
在无论是装袋还是提升的集成算法中,有放回抽样都是我们防止过拟合,让单一弱分类器变得更轻量的必要操作、在梯度提升树中,我们每一次迭代都要建立一棵新的树,因此我们每次迭代中,都要有放回抽取一个新的训练样本。不过,这并不能保证每次建新树后,集成的效果都比之前要好。因此我们规定,在提升树中,每构建一个评估器,都让模型更加集中于数据集中容易被判错的那些样本

  • boosting初次抽样真的是随机抽取,第二次开始就不是了,更加偏向于抽取那些被判错的样本
    首先我们有一个巨大的数据集,在建第一棵树时,我们对数据进行初次又放回抽样,然后建模。建模完毕后,我们对模型进行一个评估,然后将模型预测错误的样本反馈给我们的数据集,一次迭代就算完成。紧接着,我们要建立第二棵决策树,于是开始进行第二次又放回抽样。但这次有放回抽样,和初次的随机有放回抽样就不同了,在这次的抽样中,我们加大了被第一棵树判断错误的样本的权重。也就是说,被第一棵树判断错误的样本,更有可能被我们抽中。基于这个有权重的训练集来建模,我们新建的决策树就会更加倾向于这些权重更大的,很容易被判错的样本。建模完毕之后,我们又将判错的样本反馈给原始数据集。下一次迭代的时候,被判错的样本的权重会更大,新的模型会更加倾向于很难被判断的这些样本。如此反复迭代,越后面建的树,越是之前的树们判错样本上的专家,越专注于攻克那些之前的树们不擅长的数据。对于一个样本而言,它被预测错误的次数越多,被加大权重的次数也就越多。我们相信,只要弱分类器足够强大,随着模型整体不断在被判错的样本上发力,这些样本会渐渐被判断正确。如此就一定程度上实现了我们每新建一棵树模型的效果都会提升的目标。

1.3 迭代决策树(学习率)

从数据的角度而言,我们让模型更加倾向于努力攻克那些难以判断的样本。但是,并不是说只要我新建了一棵倾向于困难样本的决策树,它就能够帮我把困难样本判断正确了。**困难样本被加重权重是因为前面的树没能把它判断正确,所以对于下一棵树来说,它要判断的测试集的难度,是比之前的树所遇到的数据的难度都要高的,**那要把这些样本都判断正确,会越来越难。如果新建的树在判断困难样本这件事上还没有前面的树做得好呢?如果我新建的树刚好是一棵特别糟糕的树呢?所以,除了保证模型逐渐倾向于困难样本的方向,我们还必须控制新弱分类器的生成,我们必须保证,每次新添加的树一定得是对这个新数据集预测效果最优的那一棵树。
在XGB中,我们完整的迭代决策树的公式应该写作: y ^ i ( k + 1 ) = y ^ i ( k ) + η f k + 1 ( x i ) \hat{y}_{i}^{(k+1)}=\hat{y}_{i}^{(k)}+\eta f_{k+1}\left(x_{i}\right) y^i(k+1)=y^i(k)+ηfk+1(xi)

和逻辑回归中的步长类似,学习率越大,迭代的速度越快,算法的极限很快被达到,有可能无法收敛到真正的最佳。 学习率越小,越有可能找到更精确的最佳值,更多的空间被留给了后面建立的树,但迭代速度会比较缓慢。

二、XGBoost

上面所介绍的是XGB与gbdt相关的内容,并没有介绍到梯度提升树复杂的原理部分,线面将会介绍到XGB 独特的部分,为什么XGB的效果会更加好!

2.1 弱评估器

梯度提升算法中不只有梯度提升树,XGB作为梯度提升算法的进化,自然也不只有树模型一种弱评估器。**在XGB中,除了树模型,我们还可以选用线性模型,比如线性回归,来进行集成。**虽然主流的XGB依然是树模型,但我们也可以使用其他的模型。

2.2 XGB的目标函数:传统损失函数+模型复杂度

梯度提升算法中都存在着损失函数。比如梯度提升树种的损失函数是利用损失函数的负梯度来表示的。不同于逻辑回归和SVM等算法中固定的损失函数写法,集成算法中的损失函数是可选的,要选用什么损失函数取决于我们希望解决什么问题,以及希望使用怎样的模型。比如说,如果我们的目标是进行回归预测,那我们可以选择调节后的均方误差RMSE作为我们的损失函数。如果我们是进行分类预测,那我们可以选择错误率error或者对数损失log_loss。只要我们选出的函数是一个可微的,能够代表某种损失的函数,它就可以是我们XGB中的损失函数。
O b j = ∑ i = 1 m l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) O b j=\sum_{i=1}^{m} l\left(y_{i}, \hat{y}_{i}\right)+\sum_{k=1}^{K} \Omega\left(f_{k}\right) Obj=i=1ml(yi,y^i)+k=1KΩ(fk)
y ^ i ( t ) = ∑ k t f k ( x i ) = ∑ k t − 1 f k ( x i ) + f t ( x i ) \hat{y}_{i}^{(t)}=\sum_{k}^{t} f_{k}\left(x_{i}\right)=\sum_{k}^{t-1} f_{k}\left(x_{i}\right)+f_{t}\left(x_{i}\right) y^i(t)=ktfk(xi)=kt1fk(xi)+ft(xi)
XGB的目标函数被写作:传统损失函数 + 模型复杂度

我们还可以从另一个角度去理解我们的目标函数。在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做**泛化误差(**Genelization error)。一个集成模型(f)在未知数据集(D)上的泛化误差 ,由方差(var),偏差(bais)和噪声(ε)共同决定,而泛化误差越小,模型就越理想。方差和偏差是此消彼长的,并且模型的复杂度越高,方差越大,偏差越小。

在XGB中的目标函数中,第一项是衡量我们的偏差,模型越不准确,第一项就会越大。第二项是衡量我们的方差,模型越复杂,模型的学习就会越具体,到不同数据集上的表现就会差异巨大,方差就会越大。所以我们求解 的最小值,其实是在求解方差与偏差的平衡点,以求模型的泛化误差最小,运行速度最快。我们知道树模型和树的集成模型都是学习天才,是天生过拟合的模型,因此大多数树模型最初都会出现在图像的右上方,我们必须通过剪枝来控制模型不要过拟合。现在XGBoost的损失函数中自带限制方差变大的部分,也就是说XGBoost会比其他的树模型更加聪明,不会轻易落到图像的右上方。

2.3 如何求解XGB的目标函数

时刻记得我们求解目标函数的目的:为了求得在第t次迭代中得到最优的树。在逻辑回归和支持向量机中,我们通常先将目标函数转化成一种容易求解的方式(比如对偶),然后使用梯度下降或者SMO之类的数学方法来执行我们的最优化过程。

很遗憾,在XGB中我们无法使用梯度下降,原因是XGB的损失函数没有需要求解的参数。我们在传统梯度下降中迭代的是参数,而我们在XGB中迭代的是树,树不是数字组成的向量,并且其结构不受到特征矩阵 取值大小的直接影响,尽管这个迭代过程可以被类比到梯度下降上,但真实的求解过程却是完全不同

在求解XGB的目标函数的过程中,我们考虑的是如何能够将目标函数转化成更简单的,与树的结构直接相关的写法,以此来建立树的结构与模型的效果(包括泛化能力与运行速度)之间的直接联系。也因为这种联系的存在,XGB的目标函数又被称为“结构数”。
O b j = ∑ i = 1 m l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) O b j=\sum_{i=1}^{m} l\left(y_{i}, \hat{y}_{i}\right)+\sum_{k=1}^{K} \Omega\left(f_{k}\right) Obj=i=1ml(yi,y^i)+k=1KΩ(fk)
这里暂时不详细写具体的求解过程,但大致的步骤是将第一项的原始y带入进去,在没有选择具体的损失函数时,利用泰勒公式展开到二阶项;对于第二项,将前几次的迭代的常数项删除,只保留第t次迭代的复杂度,最终化简的目标函数为:
O b j = ∑ i = 1 m [ f t ( x i ) g i + 1 2 ( f t ( x i ) ) 2 h i ) ] + Ω ( f t ) \left.O b j=\sum_{i=1}^{m}\left[f_{t}\left(x_{i}\right) g_{i}+\frac{1}{2}\left(f_{t}\left(x_{i}\right)\right)^{2} h_{i}\right)\right]+\Omega\left(f_{t}\right) Obj=i=1m[ft(xi)gi+21(ft(xi))2hi)]+Ω(ft)
其中 g i g_i gi h i h_i hi分别是损失函数 l ( y i t , y ^ i t − 1 ) l(y_i^t,\widehat y_i^{t - 1}) l(yit,y it1) y ^ i t − 1 \widehat y_i^{t - 1} y it1的一阶导数和二阶导数,他们被统称为每个样本的梯度统计量(gradient statisticts)这下你知道梯度提升树中的梯度咋来的吧!

GBDT与XGB的核心区别二:GBDT求一阶导数,XGB求二阶导数,这两个过程根本是不可类比的。XGB在求解极值为目标的求导中也是求解一阶导数

2.4 复杂度计算与正则化

在第一节中提到,GBDT与XGB的第一个核心区别是叶子节点上y不同,GBDT中的 h k ( x i ) h_k(x_i) hk(xi)是由每个叶子上的均值求得的结果,而XGBoost中的 f k ( x i ) f_k(x_i) fk(xi)是预测分数,是由一个很复杂的公式算出来的!

对于回归树,通常来说每个叶子节点上的预测值是这个叶子节点上所有样本的标签的均
值。但值得注意的是,XGB作为普通回归树的改进算法,在y上却有所不同。对于XGB来说,每个叶子节点上会有一个预测分数(prediction score),也被称为叶子权重。这个叶子权重就是所有在这个叶子节点上的样本在这一棵树上的回归取值,用 f k ( x i ) f_k(x_i) fk(xi)或者 w w w来表示:
在这里插入图片描述
在这里插入图片描述
我们来考虑每一棵树。对每一棵树,它都有自己独特的结构,这个结构即是指叶子节点的数量,树的深度,叶子的位置等等所形成的一个可以定义唯一模型的树结构。在这个结构中,我们使用表示样本 q ( x i ) q(x_i) q(xi)所在的叶子节点,并且使用 w q ( x i ) w_{q(x_i)} wq(xi)来表示这个样本落到第t棵树上的第 q ( x i ) q(x_i) q(xi)个叶子节点中所获得的分数,于是有:
f t ( x i ) = w q ( x i ) f_t(x_i)=w_{q(x_i)} ft(xi)=wq(xi)

这是对于每一个样本而言的叶子权重,然而在一个叶子节点上的所有样本所对应的叶子权重是相同的

现在我们来定义一棵树的复杂度,设一棵树上总共包含了T个叶子节点,其中每个叶子节点的索引为j,则这个叶子节点上的样本权重是 w j w_j wj。依据这个,我们定义模型的复杂度为 Ω ( f ) \Omega(f) Ω(f)(注意这不是唯一可能的定义,我们当然还可以使用其他的定义,只要满足叶子越多/深度越大,复杂度越大的理论,我们可以自己决定我们的 要是一个怎样的式子):
Ω ( f ) = γ T + 正 则 项 \Omega(f)=\gamma{T}+正则项 Ω(f)=γT+

= γ T + 1 2 α ∑ j = 1 T ∣ w j ∣ + 1 2 λ ∑ j = 1 T w j 2 =\gamma T+\frac{1}{2} \alpha \sum_{j=1}^{T}\left|w_{j}\right|+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} =γT+21αj=1Twj+21λj=1Twj2

XGB与GBDT的核心区别三:在普通的梯度提升树GBDT中,我们是不在目标函数中使用正则项的。但XGB借用正则项来修正树模型天生容易过拟合这个缺陷,在剪枝之前让模型能够尽量不过拟合

2.5 目标函数(结构分数):求解w与T,寻找最佳树结构

现在,树的目标函数为: ∑ i = 1 m [ w q ( x i ) g i + 1 2 w q ( x i ) 2 h i ] + γ T + 1 2 λ ∑ i = 1 T w j 2 \sum_{i=1}^{m}\left[w_{q\left(x_{i}\right)} g_{i}+\frac{1}{2} w_{q\left(x_{i}\right)}^{2} h_{i}\right]+\gamma T+\frac{1}{2} \lambda \sum_{i=1}^{T} w_{j}^{2} i=1m[wq(xi)gi+21wq(xi)2hi]+γT+21λi=1Twj2
其中,每片叶子上的w是一样的,因此:
∑ j = 1 T ( w j ∗ ∑ i ∈ I j g i ) + 1 2 ∑ j = 1 T ( w j 2 ∗ ∑ i ∈ I j h i ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ w j ∑ i ∈ I j g i + 1 2 w j 2 ( ∑ i ∈ I j h i + λ ) ] + γ T \begin{aligned} & \sum_{j=1}^{T}\left(w_{j} * \sum_{i \in I_{j}} g_{i}\right)+\frac{1}{2} \sum_{j=1}^{T}\left(w_{j}^{2} * \sum_{i \in I_{j}} h_{i}\right)+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} \\ =& \sum_{j=1}^{T}\left[w_{j} \sum_{i \in I_{j}} g_{i}+\frac{1}{2} w_{j}^{2}\left(\sum_{i \in I_{j}} h_{i}+\lambda\right)\right]+\gamma T \end{aligned} =j=1TwjiIjgi+21j=1Twj2iIjhi+γT+21λj=1Twj2j=1TwjiIjgi+21wj2iIjhi+λ+γT
其中,j是每片叶子上的索引, ∑ i = 1 m w q ( x i ) ∗ g i = w q ( x 1 ) ∗ g 1 + w q ( x 2 ) ∗ g 2 + w q ( x 3 ) ∗ g 3 = w 1 ( g 1 + g 2 ) + w 2 ∗ g 3 = ∑ j = 1 T ( w j ∑ i ∈ I j g i ) \begin{aligned} \sum_{i=1}^{m} w_{q\left(x_{i}\right)} * g_{i} &=w_{q\left(x_{1}\right)} * g_{1}+w_{q\left(x_{2}\right)} * g_{2}+w_{q\left(x_{3}\right)} * g_{3} \\ &=w_{1}\left(g_{1}+g_{2}\right)+w_{2} * g_{3} \\ &=\sum_{j=1}^{T}\left(w_{j} \sum_{i \in I_{j}} g_{i}\right) \end{aligned} i=1mwq(xi)gi=wq(x1)g1+wq(x2)g2+wq(x3)g3=w1(g1+g2)+w2g3=j=1TwjiIjgi注意1,2是在1片叶子上的。
于是有:
O b j ( t ) = ∑ j = 1 T [ w j G j + 1 2 w j 2 ( H j + λ ) ] + γ T F ∗ ( w j ) = w j G j + 1 2 w j 2 ( H j + λ ) \begin{array}{c} O b j^{(t)}=\sum_{j=1}^{T}\left[w_{j} G_{j}+\frac{1}{2} w_{j}^{2}\left(H_{j}+\lambda\right)\right]+\gamma T \\ F^{*}\left(w_{j}\right)=w_{j} G_{j}+\frac{1}{2} w_{j}^{2}\left(H_{j}+\lambda\right) \end{array} Obj(t)=j=1T[wjGj+21wj2(Hj+λ)]+γTF(wj)=wjGj+21wj2(Hj+λ)
我们的目标是上面的函数最小,于是对F求导, ∂ F ∗ ( w j ) ∂ w j = G j + w j ( H j + λ ) 0 = G j + w j ( H j + λ ) w j = − G j H j + λ \begin{aligned} \frac{\partial F^{*}\left(w_{j}\right)}{\partial w_{j}} &=G_{j}+w_{j}\left(H_{j}+\lambda\right) \\ 0 &=G_{j}+w_{j}\left(H_{j}+\lambda\right) \\ w_{j} &=-\frac{G_{j}}{H_{j}+\lambda} \end{aligned} wjF(wj)0wj=Gj+wj(Hj+λ)=Gj+wj(Hj+λ)=Hj+λGj,带入原公式:
Obj ⁡ ( t ) = ∑ j = 1 T [ − G j H j + λ ∗ G j + 1 2 ( − G j H j + λ ) 2 ( H j + λ ) ] + γ T = ∑ j = 1 T [ − G j 2 H j + λ + 1 2 ∗ G j 2 H j + λ ] + γ T = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \begin{aligned} \operatorname{Obj}^{(t)} &=\sum_{j=1}^{T}\left[-\frac{G_{j}}{H_{j}+\lambda} * G_{j}+\frac{1}{2}\left(-\frac{G_{j}}{H_{j}+\lambda}\right)^{2}\left(H_{j}+\lambda\right)\right]+\gamma T \\ &=\sum_{j=1}^{T}\left[-\frac{G_{j}^{2}}{H_{j}+\lambda}+\frac{1}{2} * \frac{G_{j}^{2}}{H_{j}+\lambda}\right]+\gamma T \\ &=-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T \end{aligned} Obj(t)=j=1T[Hj+λGjGj+21(Hj+λGj)2(Hj+λ)]+γT=j=1T[Hj+λGj2+21Hj+λGj2]+γT=21j=1THj+λGj2+γT

三、GBDT与XGB的比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值