以下是用回归树模拟实现GBDT
这是gbdt的第一棵树
对比两张图可以看出分割节点一样,但是叶子节点的value不同
下面是更新GBDT的树的value过程
如上图函数说明,叶子节点的value不是回归树的叶节点残差的平均值。
观察上面注释,
s
u
m
(
w
∗
(
y
−
p
r
o
b
)
)
/
s
u
m
(
w
∗
p
r
o
b
∗
(
1
−
p
r
o
b
)
)
sum(w * (y-prob)) / sum(w* prob*(1-prob))
sum(w∗(y−prob))/sum(w∗prob∗(1−prob))在不考虑样本权重情况下,对于损失函数
L
=
c
r
o
s
s
E
n
t
r
o
p
y
=
−
∑
y
l
o
g
(
p
)
+
(
1
−
y
)
l
o
g
(
1
−
p
)
L= crossEntropy = - \sum y log(p) +(1-y)log(1-p)
L=crossEntropy=−∑ylog(p)+(1−y)log(1−p),其中
p
=
1
1
+
e
−
x
p=\frac{1}{1+e^{-x}}
p=1+e−x1。
∂
L
∂
x
=
∂
L
∂
p
∂
p
∂
x
=
−
∑
(
y
−
p
)
\frac{\partial L}{\partial {x}}=\frac{\partial L}{\partial {p}}\frac{\partial p}{\partial {x}}=-\sum(y-p)
∂x∂L=∂p∂L∂x∂p=−∑(y−p) ;
∂
2
L
∂
x
=
∑
p
(
1
−
p
)
\frac{\partial^2 L}{\partial {x}}=\sum p(1-p)
∂x∂2L=∑p(1−p) ,即y-prob是梯度,prob*(1-prob)是其二阶导hessian。更新的叶节点
w
j
∗
=
−
G
j
H
j
w_j^* =-\frac{G_j}{H_j}
wj∗=−HjGj。那这里不就是和xgboost的树
w
j
∗
=
−
G
j
H
j
+
λ
w_j^* =-\frac{G_j}{H_j+\lambda}
wj∗=−Hj+λGj差不多吗,就是少了正则化系数
λ
\lambda
λ 而已。还有,上面也可以看做对叶节点取一个权重------二阶导的倒数 。
在不考虑样本权重的情况下第一棵树更新后的值=∑(residual)/∑(logit(y_pred)*(1-logit(y_pred)))
注意:y_pred=log(pos/neg),prob=logit(y_pred)=pos/(pos+neg)=prior
第二棵树:
gbdt 生成:
下面是模拟生成:
第二棵树需要拟合的残差:上面更新后的树value*学习率+初始值log(pos/neg),然后取logit,最后用y减去logit后的值。其实梯度提升树拟合残差,就是拟合梯度(y-prob),使得每个叶子节点值变化都是在梯度方向上
第二棵树的y_pred2=第一棵树的y_pred1+value(from gbdt)*learning_rate,第二棵树的residual就是y_test - 1/(1+exp(-y_pred2))
另外,逻辑回归损失函数表示为
c
r
o
s
s
E
n
t
r
o
p
y
crossEntropy
crossEntropy,也可以用对数损失函数表示为
L
(
y
,
f
(
x
)
)
=
l
o
g
(
1
+
e
x
p
(
−
y
f
(
x
)
)
)
L(y,f(x))=log(1+exp(−yf(x)))
L(y,f(x))=log(1+exp(−yf(x))),不过不同的是这里的
f
(
x
)
f(x)
f(x)未经过
l
o
g
i
t
logit
logit转换,举例
y
=
1
y=1
y=1时交叉熵损失函数
−
l
o
g
p
,
其
中
p
=
1
1
+
e
x
p
(
−
f
(
x
)
)
-log p, 其中p=\frac{1}{1+exp(-f(x))}
−logp,其中p=1+exp(−f(x))1,交叉熵转换为
l
o
g
(
1
+
e
x
p
(
−
f
(
x
)
)
)
log(1+exp(−f(x)))
log(1+exp(−f(x))),和对数损失函数相等。
可参考:刘建平老师的博客xgboost和gbdt