1.思想
首先,要说明XGBoost是一种提升方法,基本的分类模型就是决策树;决策树最重要的问题就是怎么分裂?分裂的标准是什么?如何找到分裂的点?
2.数据集和模型
训练数据集D={(x1,y1),⋯,(xn,yn)}其中xi∈Rm,y∈R
整个XGBoost最终的模型为
y^i=ϕ(xi)=k=1∑Kfk(xi),fk∈F
其中F={f(x)=wq(x)},是决策树的空间;
q(x):Rm→T,将x映射到一个树叶上;
w∈RT:每个树叶的标签
注意:这里的q只是一个决策树的结构,具体树叶上的标签是由w确定的,所以实际上可以把w看成一个向量w=(w1,⋯,wT),每一个维度的值就是一个树叶的标签
为了说明这里用一下原论文的图片:

可以看到小女孩被tree1(q函数)映射到最左边的树叶上,该树叶的标签为+2,小女孩被tree2(q函数)映射到最左边的树叶上,该树叶的标签为+0.9;因此整个模型得到小女孩的值为2.9;同理老爷爷得到的值为1.9
3.学习函数
L(ϕ)=i∑l(y^i,yi)+k∑Ω(fk)Ω(fk)=γT+21λ∣∣w∣∣2
学习的最终目的就是最小化L(ϕ)
其中l(y^i,yi)是损失函数;
其中Ω(fk)是正则化项,防止过拟合,其中的γ,λ就是调参的对象
4.化简
由于上面的函数不能直接求最优解,因此要迭代优化出每一次生成的决策树。其中第t次生成决策树的学习函数如下
L(t)=i=1∑nl(yi,y^(t−1)+ft(xi))+Ω(ft)
将这个式子泰勒展开
L(t)≈i=1∑n[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)gi=∂y^(t−1)∂l(yi,y^(t−1))hi=∂y^(t−1)2∂2l(yi,y^(t−1))
由于l(yi,y^i(t−1))是常数,因此可以忽略,继续化简得到下式
L(t)=i=1∑n[gift(xt)+21+hift2(xi)]+Ω(ft)
将Ω(ft)带入函数得到
L(t)==i=1∑n[gift(xi)+21hift2(xi)]+γT+21λj=1∑Twj2j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
其中i∈Ij={i∣q(xi)=j}表示被映射到第j片树叶的向量xi
5.优化
现在已经确定了最终的学习函数,那么开始暴力遍历所有的维度,找到分裂后拟合最好的情况。
选定一种分裂,那么树的结构q就固定,只需要考虑最优化w,直接求导可以得到最优化的
wj∗=−∑i∈Ijhi+λ∑i∈Ijgi
那么这种分裂的学习函数的值为
L(t)(q)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
只要在一次分裂的过程中,找到最小的L(t)(q)就行了。到这里已经讲完XGBoost的学习过程,为了方便计算下面给出一次分裂的ΔL,即L(t)(q)的减少值。记分裂一次形成的左树叶为IL,右树叶为IR,原本的树叶为I
ΔL=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2+∑i∈Ihi+λ(∑i∈Igi)2]−γ
这个减少值ΔL最大即为分裂点
6.XGBoost算法

补充:
- 强烈推荐看原文,写的很清楚易懂
-
原文链接,应该是要翻墙?找不到可以私我
- 这里的暴力搜索只是一种找最分裂点的办法,比较慢,但是方便、准确;原文讨论了另外两种找最优解的办法,牺牲了一定的准确率但是更快,另外两种算法如下
