最近听了李沐的课,总结下~ 梯度提升(Gradient Boosting)是Boosting方法中的一类方法,Boosting是一类旨在combine weak learners into one to reduce bias的方法。 常见的 AdaBoost与GBDT 是 Gradient Boosting 方法中的两类方法,区别在于使用的损失函数不同。
梯度提升算法步骤:
- 初始化:
r
e
s
i
d
u
a
l
=
y
,
t
=
1
residual=y,t=1
residual=y,t=1,学习率
η
\eta
η, 基学习器(base learner)及其个数
T
T
T
- 用基学习器拟合数据
(
x
,
r
e
s
i
d
u
a
l
)
(x,residual)
(x,residual)得到模型
h
t
(
x
)
h_t(x)
ht?(x)
- 更新数据
r
e
s
i
d
u
a
l
=
r
e
s
i
d
u
a
l
?
η
h
t
(
x
)
residual=residual-\eta h_t(x)
residual=residual?ηht?(x)
- 令
t
=
t
+
1
t=t+1
t=t+1,转至第2步,直至
t
=
T
t=T
t=T
- 最终的模型:
H
T
(
x
)
=
η
∑
t
=
1
T
h
t
(
x
)
H_T(x)=\eta\sum_{t=1}^T h_t(x)
HT?(x)=η∑t=1T?ht?(x)
注:
- 上述算法是一个使用MSE作为损失函数时的GB算法,大概流程就是不断用弱学习器去拟合残差项;
- 由于更新残差的过程与梯度下降(提升)非常类似,因此称作梯度提升法。
- 学习率
η
\eta
η的作用是正则化(shrinkage),避免过拟合;
- 基学习器一定要是weak learner,才能提升模型效果且避免过拟合。
搬运代码(MSE损失函数):
class GradientBoosting:
def __init__(self,base_learner,n_learners,learning_rate):
self.learners = [clone(base_learner) for _ in range(n_learners)]
self.lr = learning_rate
def fit(self,X,y):
residual = y.copy()
for learner in self.learners:
learner.fit(X,residual)
residual -= self.lr*learner.predict(X)
def predict(self,X):
preds = [learner.predict(x) for learner in self.learners]
return np.array(preds).sum(axis=0)*self.lr
|