1、模型思想
XGBoost是GBDT改良版,都是通过多个弱学习器,不断地减少残差。GBDT主要是对残差求一阶导,向负梯度的方向拟合残差,而XGBoost运用了泰勒展开,考虑到了二阶导数。
2、公式推导
每次的迭代都是前面的弱学习器组合上新的学习器,表示为:
ŷ (t)i=ŷ (t−1)i+ft(xi)
y
^
i
(
t
)
=
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
目标函数可以表示为:
loss=∑i=1nl(yi,ŷ (t−1)i+ft(xi))+Ω
l
o
s
s
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
其中 Ω Ω 是正则项,为了防止过拟合,对树的数量和叶子结点的指加入了惩罚项:
Ω=γT+12λ∑j=1Tw2j
Ω
=
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
将 l(yi,ŷ (t−1)i) l ( y i , y ^ i ( t − 1 ) ) 看作是 x x ,看作是 Δx Δ x ,对损失函数进行泰勒展开:
loss≈∑i=1N[l(yi,ŷ (t−1)i)+gift(xi)+12hif2t(xi)]+Ω
l
o
s
s
≈
∑
i
=
1
N
[
l
(
y
i
,
y
^
i
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
其中 gi g i 和 hi h i 分别是一阶导和二阶导,这个导数取决于选择什么损失函数,例如MAE,MSE。
l(yi,ŷ (t−1)i) l ( y i , y ^ i ( t − 1 ) ) 这一项,是由前面的弱学习器组成,不会发生改变,可以看成常数项,然后损失函数可以变成:
loss≈∑i=1N(gift(xi)+12hif2t(xi))+γT+12λ∑j=1Tw2j
l
o
s
s
≈
∑
i
=
1
N
(
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
)
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
1到N是遍历样本,比较繁琐,把遍历样本转化为遍历叶子节点,损失函数变成:
loss≈∑i=1T[Giwi+12(Hi+λ)w2i]+γT
l
o
s
s
≈
∑
i
=
1
T
[
G
i
w
i
+
1
2
(
H
i
+
λ
)
w
i
2
]
+
γ
T
其中 Gi G i 和 Hi H i 分别是这个叶子节点上所有数据的loss的一阶导数和二阶导数的和。
然后目标函数对 wi w i 求偏导数,让偏导数为0可以解除每个树叶节点的值 wi w i :
∂loss∂wi=−12∑i=1TG2jHj+λ+γT=0
∂
l
o
s
s
∂
w
i
=
−
1
2
∑
i
=
1
T
G
j
2
H
j
+
λ
+
γ
T
=
0
解得:
wi=−GjHj+λ
w
i
=
−
G
j
H
j
+
λ
回带得到损失函数是:
loss=−12∑i=1TG2iH2i+λ+γT
l
o
s
s
=
−
1
2
∑
i
=
1
T
G
i
2
H
i
2
+
λ
+
γ
T
与AdaBoost不同的是,AdaBoost基分类器用的是CART决策树,分隔的标准是gini系数,XGBoost则是用这个推出来的损失函数进行分隔。
让这个损失函数下降越多越好,也就是 G2H+λ G 2 H + λ 越大越好,所以XGBoost的信息增益是:
Gain=12[G2LHL+λ+G2RHR+λ−(GL+GR)2HL+HR+λ]−γ
G
a
i
n
=
1
2
[
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
]
−
γ
因为每次分隔会多出一个树,所以要减去 γ γ 。