(九)XGBoost的原理、具体实例、代码实现

(九)XGBoost

本系列重点在浅显易懂,快速上手。不进行过多的理论讲解:也就是不去深究what,而是关注how。全文围绕以下三个问题展开:

1)长什么样?

2)解决什么问题?

3)怎么实现?

​ 3.1)从数学讲,原理

​ 3.2)具体实例

​ 3.3)从代码上讲,如何掉包实现

1 定义

XGBoost,全称eXtreme Gradient Boosting ,简称XGB,是GBDT算法的一种变种,是一种监督算法;它是boost算法的一种,也属于集成算法,是一种伸缩性强、便捷的可并行构建模型的Gradient Boosting算法。其高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中。并取得了不错的成绩。它可用于分类,回归,排序问题。

XGBoost与GBDT比较大的不同就是目标函数的定义,基本思想是一致的,同样是利用加法模型与前向分步算法实现学习的优化过程。预测过程如下:
y ^ i = ∑ k = 1 K f k ( x i ) \hat{y}_{i}=\sum_{k=1}^{K}f_{k}({x}_{i}) y^i=k=1Kfk(xi)

其中, f k f_k fk表示回归X树,K为回归树的数量。

在这里插入图片描述

XGBoost是由GBDT发展而来,同样是利用加法模型与前向分步算法实现学习的优化过程,但与GBDT是有区别的。主要区别包括以下几点:

1、传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器(线性回归、逻辑回归),这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);

2、传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数

3、XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性;

4、shrinkage(缩减或者学习速率),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);

5、列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过拟合,还能减少计算;对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动学习出它的分裂方向;

6、XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

性质

有监督,分类,回归,排序

与GBDT区别

  • 目标函数:XGBoost的损失函数添加了正则化项,使用正则用以控制模型的复杂度,正则项里包含了树的叶子节点个数、每个叶子节点权重(叶结点的socre值)的平方和。
  • 优化方法:GBDT在优化时只使用了一阶导数信息,XGBoost在优化时使用了一、二阶导数信息。
  • 缺失值处理:XBGoost对缺失值进行了处理,通过学习模型自动选择最优的缺失值默认切分方向,分别对左右侧计算损失值,那个小就划分到那一侧,并记录下来额,预测试也按这个标准来,否则默认左侧。
  • 防止过拟合: XGBoost除了增加了正则项来防止过拟合,还支持行列采样的方式来防止过拟合。
  • 结果:它可以在最短时间内用更少的计算资源得到更好的结果。

2实现过程

回归

在这里插入图片描述

二分类

在这里插入图片描述

  1. 给定初始常数项 f 0 ( x ) f_0(x) f0(x)

    y ^ i 0 = f 0 ( x i ) = 常数 \hat{y}_i^0=f_0(x_i)=\text{常数} y^i0=f0(xi)=常数

  2. 划分第一课树,采用近似精确贪心算法划分,Gain值最大的特征值为划分点(这个公式下面详细解释,这里先有个印象)。
    G a i n = 1 2 [ G L 2 H L 2 + λ + G R 2 H R 2 + λ − ( G L + G R ) 2 ( H L + H R ) 2 + λ ] − γ Gain=\frac{1}{2}\left[\frac{G_L^2}{H_L^2+\lambda}+\frac{G_R^2}{H_R^2+\lambda}-\frac{(G_L+G_R)^2}{(H_L+H_R)^2+\lambda}\right]-\gamma Gain=21[HL2+λGL2+HR2+λGR2(HL+HR)2+λ(GL+GR)2]γ

  3. 求解所有叶子节点的值(lr是学习率),求解预测值

f 1 ( x ) = l r ∗ w 1 = − l r ∗ G j H j + λ f_1(x)=lr*w_1=-lr*\frac{G_j}{H_j+\lambda} f1(x)=lrw1=lrHj+λGj

y ^ i 1 = y ^ i 0 + f 1 ( x i ) = f 0 ( x i ) + f 1 ( x i ) \hat{y}_i^1=\hat{y}_i^0+f_1(x_i)=f_0(x_i)+f_1(x_i) y^i1=y^i0+f1(xi)=f0(xi)+f1(xi)

  1. 根据预测值,划分第二棵树
    y ^ i 2 = y ^ i 1 + f 2 ( x i ) = f 0 ( x i ) + f 1 ( x i ) + f 2 ( x i ) \hat{y}_i^2=\hat{y}_i^1+f_2(x_i)=f_0(x_i)+f_1(x_i)+f_2(x_i) y^i2=y^i1+f2(xi)=f0(xi)+f1(xi)+f2(xi)

  2. 重复2~4,得到最终的学习器

    y ^ i = ∑ k = 1 K f k ( x i ) \hat{y}_i=\sum_{k=1}^Kf_k({x}_i) y^i=k=1Kfk(xi)

3单棵树的构建

XGB算法中单颗树的构建,不再是GBDT中采用CART回归树的方法构建。单同样是基于优化目标函数(通俗的讲就是如何让loss更小)的思想构建的,只不过在优化目标函数时考虑了二阶导数和正则项,而GBDT仅考虑了一阶导数。下面先看XGB的目标函数:

目标函数

O b j = ∑ i l ( y ^ i , y i ) + ∑ k Ω ( f k ) w h e r e       Ω ( f ) = γ T + 1 2 λ ∥ w ∥ 2 \begin{gathered} Obj=\sum_{i}l(\hat{y}_{i},y_{i})+\sum_{k}\Omega(f_{k}) \\ \mathrm{where}\:\ \ \ \Omega(f)=\gamma T+\frac{1}{2}\lambda\|w\|^{2} \end{gathered} Obj=il(y^i,yi)+kΩ(fk)where   Ω(f)=γT+21λw2

公式(2)第一部分是损失函数,第二部分是对模型复杂度的惩罚项(正则项);上面列出的是树形结构的惩罚项。如果是线性回归结构就是L1 L2正则项。 Υ 和 λ Υ和λ Υλ是超参数,T表示给定一棵树的叶子节点的数量。 ∣ ∣ w ∣ ∣ 2 ||w||^2 ∣∣w2表示每棵树叶子节点上的输出分数的平方(相当于L2正则),

对于第t棵树
O b j ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) Obj^{(t)}=\sum_{i=1}^nl(y_i,\hat{y}_i^{(t-1)}+f_t(\mathbf{x}_i))+\Omega(f_t) Obj(t)=i=1nl(yi,y^i(t1)+ft(xi))+Ω(ft)
采用泰勒公式
f ( x + Δ x ) ≃ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x)\simeq f(x)+f'(x)\Delta x+\frac{1}{2}f''(x)\Delta x^{2} f(x+Δx)f(x)+f(x)Δx+21f′′(x)Δx2
展开:
f ( y ^ i ( t − 1 ) + f t ( X i ) ) = l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) f(\hat y_i^{(t-1)}+f_t(X_i))=l(y_i,\hat y_i^{(t-1)}+f_t(x_i))\\ f(y^i(t1)+ft(Xi))=l(yi,y^i(t1)+ft(xi))
映射倒泰勒公式中,这里:
x = y ^ i ( t − 1 ) ,   △ x = f t ( x i ) x=\hat y_i^{(t-1)}, \ \ △x=f_t(x_i)\\ x=y^i(t1),  x=ft(xi)
所以:
f ( x ) = f ( y ^ i ( t − 1 ) ) = l ( y i , y ^ i ( t − 1 ) ) f(x)=f(\hat y_i^{(t-1)})=l(y_i,\hat y_i^{(t-1)}) f(x)=

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值