XGBoost推导
目标
目标:我们希望学习一个既准确又简单的模型来实现预测
因此目标函数可以定为:
i=1∑nl(yi,y^i)+k∑Ω(fk),fk∈F
由于我们使用的是树模型,而不是权重向量,因此无法使用SGD算法来找到函数 f。但是可以使用Additive Training(Boosting)加性训练的方式来找到函数 f.
Additive Training(Boosting)
从一个常数预测开始,每一轮训练增加一个新的函数
y^i(0)=0y^i(1)=f1(xi)=y^i(0)+f1(xi)y^i(2)=f1(xi)+f2(xi)=y^i(1)+f2(xi)y^i(t)=∑k=1tfk(xi)=y^i(t−1)+ft(xi)
如何决定新加入的函数
由目标函数决定!
在第 t轮训练中, y^i(t)=y^i(t−1)+ft(xi)
因此目标函数可写成:
Obj(t)=i=1∑nl(yi,y^i(t))+i=1∑tΩ(fi)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)+ constant
由于前 t−1轮的模型已确定,因此其复杂度是确定,所以 ∑t=1t−1Ω(ft)=constant
将目标函数泰勒展开
泰勒展开式
一维:
f(x+Δx)≃f(x)+f′(x)Δx+21f′′(x)Δx2
二维:
f(x,y+Δy)≃f(x,y)+∂y∂f(x,y)Δy+21∂y2∂2f(x,y)Δy2
记 gi=∂y^(t−1)l(yi,y^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1)),目标函数为:
Obj(t)≃i=1∑n[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)+constant
移除常数项后,目标函数为:
i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)
定义树的复杂度
将样本到叶子节点分数的映射关系表示成:
ft(x)=wq(x)q(x)∈1,2,...,T
w是叶子节点的权重, T为叶子节点总个数
定义树的复杂度为:
Ω(ft)=γT+21λj=1∑Twj2
目标函数求解
现按照样本所属的叶子节点划分样本子集, Ij={i∣q(xi)=j},属于同一个叶子节点的归为一类,共有 T类。
Obj(t)≃i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)=i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+λ21j=1∑Twj2=j=1∑T⎣⎡⎝⎛i∈Ij∑gi⎠⎞wj+21⎝⎛i∈Ij∑hi+λ⎠⎞wj2⎦⎤+γT
记 Gj=∑i∈Ijgi,Hj=∑i∈Ijhi
则目标函数简化成
Obj(t)=j=1∑T⎣⎡⎝⎛i∈Ij∑gi⎠⎞wj+21⎝⎛i∈Ij∑hi+λ⎠⎞wj2⎦⎤+γT=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT
对 wj来说是一个一元二次函数,当
wj∗=−2×21(Hj+λ)Gj=Hj+λGj
目标函数取得最小值:
Obj(t)=j=1∑T[−4⋅21(Hj+λ)Gj2]+γT=−21j=1∑THj+λGj2+γT
树的生成
- 从根结点(所有数据在同一个结点中),深度为0开始
- 对每一个叶子结点,尝试将其分裂成两个叶子结点,分裂后目标函数值的变化如下:
Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ - 一直分裂直至不满足分裂条件为止
如何找到最优分裂特征
- 对每一个特征,将其特征值排序
- 尝试使用每一个特征值进行划分
- 选出所有特征所有特征值中增益最大的作为分类依据
剪枝和正则
- 增益不能为负。训练损失和树的复杂度得到平衡
Gain=HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2−γ - 提前停止。当最优分裂的增益值为负时,停止生长。(但可能这一次分裂有利于后续分裂)
- 设定最大深度,修剪所有增益为负的叶子结点
XGBoost算法步骤
- 在每一轮中,新建一棵空树 ft(x)
- 计算每个叶子节点中每个样本的一阶梯度和二阶梯度值
gi=∂y^(t−1)l(yi,y^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1)) - 计算不同特征不同特征值作为分裂依据时的增益
Gain=HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2−γ - 不断地生长树,直至不满足分裂条件
- 将这一轮的树 ft(x)添加到模型中
y(t)=y(t−1)+ϵft(xi)
ϵ称为步长,即在每一轮中,并不是做完了所有的优化,而是留一部分给后续的优化轮次,这样可以防止过拟合
参考资料