文章目录
- GDT
- Xgboost
- Lightgbm
三种算法都是boosting的一种:每个模型间相互依赖,下一个模型修改上一个模型的错误
1 提升树(boosting tree)
采用加法模型和前向分步算法实现学习的优化过程。
- 对分类问题,基本学习器是二叉决策树;
- 对回归问题,基本学习器是二叉回归树。
f ( x ) = f m ( x ) = ∑ m = 1 M h m ( x ∣ Θ m ) f(x) = f_m(x) = \sum_{m=1}^M h_m(x|\Theta_m) f(x)=fm(x)=m=1∑Mhm(x∣Θm) - M是决策树的数量
1.1前向学习
- 确定初始提升树 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
- 每一轮训练增加一个学习器,在第m轮学习中
f m ( x ) = f m − 1 ( x ) + h m ( x ∣ Θ m ) f_m(x) = f_{m-1}(x) + h_m(x|\Theta_m) fm(x)=fm−1(x)+hm(x∣Θm)
通过损失函数极小化确定下一棵树的参数 Θ m \Theta_m Θm(这里并没有正则化)
Θ ^ m = arg min Θ m ∑ i = 1 n L ( y i , f m − 1 ( x ) + h m ( x ∣ Θ m ) ) \hat \Theta_m = \arg \min_{\Theta_m} \sum_{i=1}^n L(y_i, f_{m-1}(x) + h_m(x|\Theta_m)) Θ^m=argΘmmini=1∑nL(yi,fm−1(x)+hm(x∣Θm)) - 输出最终学习器: f ( x ) = f m ( x ) = ∑ m = 1 M h m ( x ∣ Θ m ) f(x) = f_m(x) = \sum_{m=1}^M h_m(x|\Theta_m) f(x)=fm(x)=∑m=1Mhm(x∣Θm)
1.2对于回归提升树
- 最终输出模型
h ( x , Θ ) = ∑ j = 1 J c j I ( x ∈ R j ) h(x,\Theta) = \sum_{j=1}^J c_j I(x\in R_j) h(x,Θ)=j=1∑JcjI(x∈Rj)
其中J是最终叶节点数目, c j c_j cj是叶节点的最终取值, R j R_j Rj是叶节点的样本集划分) - 损失函数是square loss:
l ( y i , y ^ i ) = ( y i − y ^ i ) 2 l(y_i,\hat y_i) = (y_i-\hat y_i)^2 l(yi,y^i)=(yi−y^i)2 - 每轮循环最小化损失函数得到最佳参数
Θ
m
\Theta_m
Θm
L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + h m ( x ∣ Θ m ) ) = ( y − f m ( x ) ) 2 = [ y − f m − 1 ( x ) − h m ( x ∣ Θ m ) ] 2 = [ r − h m ( x ∣ Θ m ) ] 2 \begin{aligned} L(y,f_m(x)) &= L(y,f_{m-1}(x) + h_m(x|\Theta_m))\\ &=(y-f_m(x))^2 \\ &= [y-f_{m-1}(x) - h_m(x|\Theta_m)]^2 \\ &=[r-h_m(x|\Theta_m)]^2 \end{aligned} L(y,fm(x))=L(y,fm−1(x)+hm(x∣Θm))=(y−fm(x))2=[y−fm−1(x)−hm(x∣Θm)]2=[r−hm(x∣Θm)]2
其中 r = y − f m − 1 ( x ) r = y-f_{m-1}(x) r=y−fm−1(x),是当前模型拟合数据的残差。
每轮用当前的残差学习新的回归树。
损失函数不是平方损失时
- 回归问题中,损失函数是平方损失和指数损失时,优化简单(因为求导简单)。但对于一般的损失函数而言,优化并不简单。
- 但不仅是提升树,其他的boosting回归算法,也是拟合当前模型的残差。只是拟合残差的方法不同
2. GBT,Gradient Boosting Tree,梯度提升树
提升树中,损失函数是平方损失时,用残差
r
=
y
−
f
m
−
1
(
x
)
r=y-f_{m-1}(x)
r=y−fm−1(x)拟合m轮的树。
当损失函数是一般函数时,Freidman提出,梯度提升算法。
2.1 梯度提升算法
用损失函数的负梯度来拟合本轮残差的近似值,从而拟合新的回归树。
对损失函数一阶泰勒展开:
L
(
y
,
f
m
(
x
)
)
=
L
(
y
,
f
m
−
1
(
x
)
+
T
(
x
∣
Θ
m
)
)
=
L
(
y
,
f
m
−
1
(
x
)
)
+
∂
L
(
y
,
f
m
−
1
(
x
)
)
∂
f
m
−
1
(
x
)
h
m
(
x
∣
Θ
m
)
\begin{aligned} L(y,f_m(x)) &= L(y,f_{m-1}(x) + T(x|\Theta_m))\\ &= L(y,f_{m-1}(x)) + \frac{\partial L(y,f_{m-1}(x)) }{ \partial f_{m-1}(x)} h_m(x|\Theta_m) \end{aligned}
L(y,fm(x))=L(y,fm−1(x)+T(x∣Θm))=L(y,fm−1(x))+∂fm−1(x)∂L(y,fm−1(x))hm(x∣Θm)
得到
Δ
L
=
L
(
y
,
f
m
(
x
)
)
−
L
(
y
,
f
m
−
1
(
x
)
=
∂
L
(
y
,
f
m
−
1
(
x
)
)
∂
f
m
−
1
(
x
)
h
m
(
x
∣
Θ
m
)
\Delta L = L(y,f_m(x)) - L(y,f_{m-1}(x) = \frac{\partial L(y,f_{m-1}(x)) }{ \partial f_{m-1}(x)} h_m(x|\Theta_m)
ΔL=L(y,fm(x))−L(y,fm−1(x)=∂fm−1(x)∂L(y,fm−1(x))hm(x∣Θm)
每轮拟合回归树使,我们希望损失函数极小化,降低损失函数,
Δ
L
<
0
\Delta L <0
ΔL<0,那么
h
m
(
x
∣
Θ
m
)
=
−
∂
L
(
y
,
f
m
−
1
(
x
)
)
∂
f
m
−
1
(
x
)
h_m(x|\Theta_m) = - \frac{\partial L(y,f_{m-1}(x)) }{ \partial f_{m-1}(x)}
hm(x∣Θm)=−∂fm−1(x)∂L(y,fm−1(x))就是一个可选项。
- 对于平方损失函数,它就是残差 y − f m − 1 ( x ) y-f_{m-1}(x) y−fm−1(x)
- 对于一般的损失函数,它就是残差的近似
2.2 GBRT,梯度提升回归树
- (1)初始化:一个只有根节点的树,使损失函数极小化的常数值
f 0 ( x ) = a r g min c ∑ i = 1 N L ( y i , c ) f_0(x) = arg\min_c \sum_{i=1}^NL(y_i,c) f0(x)=argcmini=1∑NL(yi,c) - (2)对m=1,2,…,M(迭代次数)
- (a)对i=1,2,…,N计算(每个样本)
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi} = -\Bigg[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\Bigg] _{f(x) = f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
对于平方损失函数,此值即为残差;对于一般的损失函数,即为残差的近似值 - (b)对
r
m
i
r_{mi}
rmi拟合一个回归树,得到第m棵树的叶节点区域
R
m
j
,
j
=
1
,
2
,
⋯
 
,
J
R_{mj},j=1,2,\cdots,J
Rmj,j=1,2,⋯,J,得到的仅仅是节点区域而非参数值。
假设 L = [ y i − f ( x i ) ] 2 L=[y_i - f(x_i)]^2 L=[yi−f(xi)]2 ; 残差为 − 2 ( y i − f ( x 1 ) ) -2(y_i-f(x_1)) −2(yi−f(x1)),公式前有系数,近似代表残差,不等同于残差,因此需要根据(c )步计算 c m c_m cm - (c )对
j
=
1
,
2
,
⋯
 
,
J
j=1,2,\cdots,J
j=1,2,⋯,J,计算每个区域
R
m
,
j
R_{m,j}
Rm,j的输出值
c m j = a r g min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj} = arg\min_c \sum_{x_i \in R_{mj}}L(y_i,f_{m-1}(x_i) + c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
利用线性搜索估计叶节点区域的值,使损失函数极小化 - (d)更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x) = f_{m-1}(x) + \sum_{j=1}^Jc_{mj}I(x\in R_{mj}) fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
- (a)对i=1,2,…,N计算(每个样本)
- 得到回归树
f ( x ) ^ = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat{f(x)} = f_M(x) = \sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x\in R_{mj}) f(x)^=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
对于对于每个样本值,在每棵树上只有1个区域内事情函数不为0,此函数最终只有M项
2.3 GBDT,梯度提升决策树
算法和GBRT类似,主要是损失函数不同。
2.4 工程应用
- 会设置一个学习率(shrink)来更新模型
f m ( x ) = f m − 1 ( x ) + λ h m ( x , Θ m ) , 0 < λ < 1 f_m(x)= f_{m-1}(x) + \lambda h_m(x,\Theta_m),0< \lambda<1 fm(x)=fm−1(x)+λhm(x,Θm),0<λ<1
它可以降低模型的更新速度。和基本学习器的数量会有一个trade-off - 可以用随机梯度提升
在每轮迭代时,新的决策树拟合的是原始训练集的子集的残差,这个子集是对源数据无放回采样得到。这个采样比率在[0.5,0.8]之间结果较好,可以防止过拟合。 - 可以限制回归树中每次分裂时考虑的特征最大数目
- 可以限制每棵树叶节点包含的最少样本数、每棵树的最大深度等
具体调节可以参考sklearn.ensemble.GradientBoostingClassifer
参考:大神的 《AI算法工程师手册》,李航老师的《统计学习方法》