Datawhale-集成学习-学习笔记Day5-前向分步算法
1. 加法模型与前向分步算法
我们可以先了解一下什么是加法模型。加法模型的通式为:
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right)
f(x)=m=1∑Mβmb(x;γm)
其中,
b
(
x
;
γ
m
)
b\left(x ; \gamma_{m}\right)
b(x;γm)为即基本分类器,
γ
m
\gamma_{m}
γm为基本分类器的参数,
β
m
\beta_m
βm为基本分类器的系数。很显然,我们前面介绍的Adaboost就是一个加法模型。
在Adaboost中系数为基模型的权重,也可以说是基模型的准确率。参数就是各个样本的的权重,最终的结果是各个基模型叠加的结果。
之所以提出加法模型,是因为,这一类的模型学习都有一个通式:
min
β
m
,
γ
m
∑
i
=
1
N
L
(
y
i
,
∑
m
=
1
M
β
m
b
(
x
i
;
γ
m
)
)
\min _{\beta_{m}, \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right)
βm,γmmini=1∑NL(yi,m=1∑Mβmb(xi;γm))
其中L为损失函数,我们的目标是通过调整系数和模型参数,将所有基模型的损失和降到最低。
我们可以这样介绍前向分布算法:
输入: T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),⋯,(xN,yN)}, x i ∈ X ⊆ R n x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n} xi∈X⊆Rn, y i ∈ Y = { + 1 , − 1 } y_{i} \in \mathcal{Y}=\{+1,-1\} yi∈Y={+1,−1}。损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x)),基函数集合 { b ( x ; γ ) } \{b(x ; \gamma)\} {b(x;γ)}。
输出:加法模型f(x).
-
初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
-
对 m = 1 , 2 , ⋯ , M m=1,2, \cdots ,M m=1,2,⋯,M
-
极小化损失函数
( β m , γ m ) = arg min β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) \left(\beta_{m}, \gamma_{m}\right)=\arg \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\beta b\left(x_{i} ; \gamma\right)\right) (βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
得到参数 β m , γ m \beta_{m}, \gamma_{m} βm,γm -
更新
f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_{m}(x)=f_{m-1}(x)+\beta_{m} b\left(x ; \gamma_{m}\right) fm(x)=fm−1(x)+βmb(x;γm)
-
-
得到加法模型f(x)
看到这里,可能会有一些疑惑,为什么我们是一步一步的优化,而不是一次性优化所有的参数呢?因为,一次性优化所有的参数是一个非常复杂的优化问题。前向分步算法就是将这一个优化问题简化的算法思想:
- 我们学习的是加法模型,如果我们可以从前向后,每一步只学习一个基函数及其系数,逐步的逼近优化目标的函数式,就可以简化优化的复杂度。
- 个人理解:每一步我们只训练当前的最优模型,如果模型的准确率高,我们就加大其系数,即在最终结果中所占的权重,否则就降低系数。
- 这与Adaboost的思想是一致的。
2. 提升树
想要明白什么是提升树之前,我们需要知道什么是提升方法。提升方法就是:采用加法模型和前向分步算法的获取最优模型的算法。知道了提升方法后,提升树就很好理解了。提升树就是基模型为决策树的提升方法。
对于分类问题来说,决策树是二叉分类树,对于回归问题来说,决策树是二叉回归树。
而提升树模型可以表示为:
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right)
fM(x)=m=1∑MT(x;Θm)
我们从前面的叙述中已经知道提升树的学习方法是前向分步算法,但是提升树集体的训练步骤还是需要详细的说一说的。
对于二分类问题来说,我们只需要将Adaboost算法中的基模型设置为决策树即可,这时只是Adaboost算法的一种特殊形式。
除此之外,我们可以对于不同的问题进行讨论。其中,最主要的区别就是使用的损失函数的不同。包括了使用平方误差损失函数的回归问题,使用指数损失函数的分类问题,以及使用一般损失函数的一般决策问题。
我们可以看一下回归问题的提升树,相较于前面提过的分类问题的决策树来说,信息熵和信息增益则变得不那么适用。所以我们可以使用L2损失作为模型的目标函数。
其中:
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y, f(x))=(y-f(x))^2
L(y,f(x))=(y−f(x))2
将
f
m
(
x
)
f_m(x)
fm(x)带入后可知:
L
(
y
,
f
(
x
)
)
=
L
(
y
,
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
)
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
Θ
m
)
]
2
=
[
r
−
T
(
x
;
Θ
m
)
]
2
L(y, f(x))=L(y, f_{m-1}(x)+T(x;\Theta_m))\\ =[y-f_{m-1}(x)-T(x;\Theta_m)]^2\\ =[r-T(x;\Theta_m)]^2
L(y,f(x))=L(y,fm−1(x)+T(x;Θm))=[y−fm−1(x)−T(x;Θm)]2=[r−T(x;Θm)]2
其中:
r
=
y
−
f
m
−
1
(
x
)
r=y-f_{m-1}(x)
r=y−fm−1(x)
我们可以知道,r应该是当前已经训练好的模型的残差。我们只需要将当前的基模型去拟合r即可得到最优的当前基模型。
所以,训练步骤为:
输入数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R} T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R,输出最终的提升树 f M ( x ) f_{M}(x) fM(x)
- 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
- 对m = 1,2,…,M:
- 计算每个样本的残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , ⋯ , N r_{m i}=y_{i}-f_{m-1}\left(x_{i}\right), \quad i=1,2, \cdots, N rmi=yi−fm−1(xi),i=1,2,⋯,N
- 拟合残差 r m i r_{mi} rmi学习一棵回归树,得到 T ( x ; Θ m ) T\left(x ; \Theta_{m}\right) T(x;Θm)
- 更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_{m}(x)=f_{m-1}(x)+T\left(x ; \Theta_{m}\right) fm(x)=fm−1(x)+T(x;Θm)
- 得到最终的回归问题的提升树: f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right) fM(x)=∑m=1MT(x;Θm)
3. 梯度提升树
当损失函数是平方损失和指数损失的时候,每一步的优化是十分简单的。但是对于一般损失函数来说,每一步的优化就会没有那么容易。我们可以在一般函数的优化中,使用梯度学习算法来进行优化。
可以使用损失函数的负梯度,来进行模型的优化。