1. 目标函数:
假设有XGBoost模型中由
k
k
k棵树组成,则可以预测值可以由K棵树的预测结果相加得出,第
k
k
k棵树模型表示为
f
k
(
x
)
f_k(x)
fk(x):
1.1 树的复杂度
树模型的复杂度主要有以下三种:
- 叶子结点个数
- 树的深度
- 叶节点的值(假设预测值为1000,每棵树的值预测值在100到200之间,此时只需要10棵树左右,如果降低叶子结点的值,则需要更多的树拟合目标值。因此树的复杂度略有降低。)
2 目标函数的表示
叠加式训练,在构建第
k
k
k课树的时候,前
k
−
1
k-1
k−1棵树是已知的。假设目前我们要构建第
k
k
k棵树,第
j
j
j棵树对样本
x
i
x_i
xi的预测值记为
f
j
(
x
i
)
f_j(x_i)
fj(xi),前
k
−
1
k-1
k−1棵树对样本
x
i
x_i
xi预测值为
y
^
(
i
)
k
−
1
\hat{y}_{(i)}^{k-1}
y^(i)k−1
现在要求最小的loss值
因为前
k
−
1
k-1
k−1棵树的结果和复杂度已知,故当训练第
k
k
k棵树的样本时,我们最小化的目标为:
总结一下:我们的目标函数为:
2.1 泰勒函数近似目标函数
代入泰勒函数:
其中,红框中的部分均为已知部分,故而不参与后期的优化过程,
因此,最后的目标函数变为:
3. 如何参数化当前树的函数?
也就是,如何表示第
i
i
i个样本的表达式
f
k
(
x
i
)
f_k(x_i)
fk(xi)?在此,需要定义几个变量:
- 叶节点的权重。
- 样本的位置
q
(
x
i
)
q(x_i)
q(xi)
如果样本落在第二个节点上,那么该值可以表达为 w 2 w_2 w2,假设1,3 值落在节点1上;2,5 值落在节点3上;4落在2节点上,则可以表示为:
所以, f k ( x i ) = w q ( x i ) f_k(x_i)=w_{q(x_i)} fk(xi)=wq(xi) - 为了去掉
w
q
(
x
i
)
w_{q(x_i)}
wq(xi)中下标的函数,需要定义变量
I
j
I_j
Ij,表示第
j
j
j个节点中有哪些样本?
- 定义树的复杂度
树的复杂度 = 叶节点的个数 + leaf value,即:
λ \lambda λ和 γ \gamma γ代表不同复杂度项的惩罚力度。
w q ( x ) w_{q(x)} wq(x)的表示方法:
- 按照样本顺序:
- 按照叶节点的顺序:
所以,目标函数可以表示为:
其实就是一个一元二次函数的最值问题了,(T是叶节点的个数):
接下来的问题就是,从所有可能的树结构中寻找一棵树,这棵树的obj*值最小。
4. 寻找树
在决策树中,我们的目标函数其实是entropy,但是在XGBoost中,目标函数其实就变成了Obj*。
假设目前树的形状为:
设下一步可能的划分为,以特征1构造下一个分支节点:
接下来遍历该子树下的所有特征,选出一个能够让
o
b
j
n
e
w
∗
−
o
b
j
o
l
d
∗
obj_{new}^*-obj_{old}^*
objnew∗−objold∗最大的就行。