xgboost原理分析以及实践

摘要

本文在写完GBDT的三篇文章后本来就想写的,但一直没有时间,终于刚好碰上需要,有空来写这篇关于xgboost原理以及一些实践的东西(这里实践不是指给出代码然后跑结果,而是我们来手动算一算整个xgboost流程)

由于网上已经许多优秀的文章对xgboost原理进行了详细的介绍,特别是xgboost作者陈天奇的论文以及slide已经非常完整阐述了整个xgboost的来龙去脉,现有的文章基本也是参考了这两个资料。
但是却少涉及把原理对应到实际实现过程的文章,许多人看完原理之后可能对整个过程还是抱有好奇心,所以本文从另一个角度,原理到实际运行的角度来分析xgboost,相当于结合原理,仔细看看xgboost每一步到底计算了什么。

原理

当然,我们还是需要简要的回顾一下xgboost的整个推导过程,以及做一些铺垫,方便后面叙述。

我们知道,任何机器学习的问题都可以从目标函数(objective function)出发,目标函数的主要由两部分组成 损失函数+正则项。

Obj(Θ)=L(Θ)+Ω(Θ) O b j ( Θ ) = L ( Θ ) + Ω ( Θ )

损失函数用于描述模型拟合数据的程度。
正则项用于控制模型的复杂度。

对于正则项,我们常用的L2正则和L1正则。

L1正则: Ω(w)=λ||w||1 Ω ( w ) = λ | | w | | 1
L2正则: Ω(w)=λ||w||2 Ω ( w ) = λ | | w | | 2

在这里,当我选择树模型为基学习器时,我们需要正则的对象,或者说需要控制复杂度的对象就是这 K K 颗树,通常树的参数有树的深度,叶子节点的个数,叶子节点值的取值(xgboost里称为权重weight)。

所以,我们的目标函数形式如下:

L ( y i , y ^ i ) + k = 1 K Ω ( f k ( x i ) )

对一个目标函数,我们最理想的方法就选择一个优化方法算法去一步步的迭代的学习出参数。但是这里的参数是一颗颗的树,没有办法通过这种方式来学习。

既然如此,我们可以利用Boosting的思想来解决这个问题,我们把学习的过程分解成先学第一颗树,然后基于第一棵树学习第二颗树。也就是说:

ŷ 0i= y ^ i 0 = 常 数

ŷ 1i=ŷ 0i+f1(xi) y ^ i 1 = y ^ i 0 + f 1 ( x i )

ŷ 2i=ŷ 1i+f2(xi) y ^ i 2 = y ^ i 1 + f 2 ( x i )

ŷ Ki=ŷ K1i+fK(xi)(0) (0) y ^ i K = y ^ i K − 1 + f K ( x i )

所以,对于第K次的目标函数为:

ObjK=iL(yi,ŷ Ki)+Ω(fK)+constant O b j K = ∑ i L ( y i , y ^ i K ) + Ω ( f K ) + c o n s t a n t

==> ObjK=iL(yi,ŷ K1i+fK(xi))+Ω(fK)+constant O b j K = ∑ i L ( y i , y ^ i K − 1 + f K ( x i ) ) + Ω ( f K ) + c o n s t a n t

上面的式子意义很明显,只需要寻找一颗合适的树 fK f K 使得目标函数最小。然后不断的迭代K次就可以完成K个学习器的训练。

那么我们这颗树到底怎么找呢?
在GBDT里面(当然GBDT没有正则),我们的树是通过拟合上一颗树的负梯度值,建树的时候采用的启发式准则。具体参考文章

然而,在xgboost里面,它是通过对损失函数进行泰勒展开。
(其思想主要来自于文章:Additive logistic regression a statistical view of boosting也是Friedman大牛的作品)

二阶泰勒展开:
f(x+Δx)=f(x)+f(x)Δx+12f(x)Δx2 f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x + 1 2 f ″ ( x ) Δ x 2

对损失函数二阶泰勒展开:
iL(yi,ŷ K1i+fK(xi))=i[L(yi,ŷ K1i)+L(yi,ŷ K1i)fK(xi)+12L(yi,ŷ K1i)f2K(xi)] ∑ i L ( y i , y ^ i K − 1 + f K ( x i ) ) = ∑ i [ L ( y i , y ^ i K − 1 ) + L ′ ( y i , y ^ i K − 1 ) f K ( x i ) + 1 2 L ″ ( y i , y ^ i K − 1 ) f K 2 ( x i ) ]

注意的是,这里的 yi y i 是标签值是个常数,而 ŷ K1i y ^ i K − 1 是前一次学习到的结果,也是个常数。所以只要把变化量 Δx Δ x 看成我们需要学习的模型 fK(x) f K ( x ) 就可以展成上面的这个样子了。

这里,我们用 gi g i 记为第i个样本损失函数的一阶导, hi h i 记为第i个样本损失函数的二阶导。
gi=L(yi,ŷ K1i)(1) (1) g i = L ′ ( y i , y ^ i K − 1 )
hi=L(yi,ŷ K1i)(2) (2) h i = L ″ ( y i , y ^ i K − 1 )

(1)式和(2)非常的重要,贯穿了整个树的构建(分裂,叶子节点值的计算)。以及(2)式是我们利用xgboost做特征选择时的其中一个评价指标。

所以我们可以得到我们进化后的目标函数:
i[L(yi,ŷ K1i)+gifK(xi)+12hif2K(xi)]+Ω(fK)+constant ∑ i [ L ( y i , y ^ i K − 1 ) + g i f K ( x i ) + 1 2 h i f K 2 ( x i ) ] + Ω ( f K ) + c o n s t a n t

这里,我们先回忆一下,一颗树用数学模型来描述是什么样,很简单其实就是一个分段函数。比如有下面一颗树。
这里写图片描述

f(x)={ 0.4444440.4x1<10x1>=10 f ( x ) = { 0.444444 x 1 < 10 − 0.4 x 1 >= 10

也就是说,一棵树其实可以由一片区域以及若干个叶子节点来表达。
而同时,构建一颗树也是为了找到每个节点的区域以及叶子节点的值。

也就说可以有如下映射的关系 fK(x)=wq(x) f K ( x ) = w q ( x ) 。其中

  • 99
    点赞
  • 252
    收藏
    觉得还不错? 一键收藏
  • 55
    评论
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值