一、提升方法AdaBoost算法
1、提升方法的基本思路
-
提升方法基本思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好.
-
对于分类问题而言,给定一个训练样本集,求弱分类器要比求强分类器容易得多.提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基本分类器),然后组合这些弱分类器,构成一个强分类器.
-
大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器.
-
这样,对提升方法来说,有两个问题需要回答:
- 一是在每一轮如何改变训练数据的权值或概率分布;
- 二是如何将弱分类器组合成一个强分类器.
-
第1个问题,AdaBoost的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值.这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注.于是,分类问题被一系列的弱分类器“分而治之”.
-
第2个问题,即弱分类器的组合,AdaBoost采取加权多数表决的方法.具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用.
2、AdaBoost算法
- 假设给定一个二类分类的训练数据集: T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) T={(x_1,y_1 ),(x_2,y_2 ),…,(x_N,y_N )} T=(x1,y1),(x2,y2),…,(xN,yN)其中: x ∈ X ∈ R n , y ∈ − 1 , + 1 x∈X∈R^n, y∈{-1,+1} x∈X∈Rn,y∈−1,+1.
- AdaBoost利用以下算法,从训练数据中学习一系列弱分类器或基本分类器,并将这些弱分类器线性组合成为一个强分类器.
- 算法步骤:
- 第一步:初始化训练数据的权值分布: D 1 = ( w 1 1 , w 1 2 , … , w 1 N ) D_1=(w_11,w_12,…,w_1N ) D1=(w11,w12,…,w1N) w 1 i = 1 N w_{1i}=\frac{1}{N} w1i=N1
- 第二步:循环训练基本分类器:
m
=
1
,
2
,
…
,
M
m=1,2,…,M
m=1,2,…,M
- 使用具有权值分布 D m D_m Dm的训练数据集学习得到基本分类器: G m ( x ) : X → { − 1 , 1 } G_m (x):X→\{-1,1\} Gm(x):X→{−1,1}
- 计算
G
m
(
x
)
G_m (x)
Gm(x)在训练数据集上的分类误差率:
e m = ∑ i = 1 N w m i I ( G m ( x i ) ! = y i ) = ∑ G m ( x i ) ! = y i w m i e_m=∑_{i=1}^Nw_{mi} I(G_m (x_i )!=y_i)=∑_{G_m (x_i )!=y_i}w_{mi} em=i=1∑NwmiI(Gm(xi)!=yi)=Gm(xi)!=yi∑wmi误差为分类错误样本的权重之和。并且有: 0 ≤ e m ≤ 1 0≤e_m≤1 0≤em≤1 - 计算 G m ( x ) G_m (x) Gm(x)的系数: α m = 1 2 l n 1 − e m e m α_m=\frac{1}{2} ln \frac{1-e_m}{e_m} αm=21lnem1−em 该函数是 e m e_m em的单调减函数值域为 ( − ∞ , + ∞ ) (-∞,+∞) (−∞,+∞),函数零点为: e m = 1 / 2 e_m=1/2 em=1/2,注意: G m ( x ) G_m (x) Gm(x)是一个弱分类器但是它的准确率必须大于0.5,否则就比随机猜测准确度还低是不允许的,那么我们可以得到 α m α_m αm的实质取值范围: ( 0 , + ∞ ) (0,+∞) (0,+∞)
- 更新训练数据集的权重分布:
D
m
+
1
=
(
w
m
+
1
,
1
,
w
m
+
1
,
2
,
…
,
w
m
+
1
,
N
)
D_{m+1}=(w_{m+1,1},w_{m+1,2},…,w_{m+1,N} )
Dm+1=(wm+1,1,wm+1,2,…,wm+1,N)
w
m
+
1
,
i
=
w
m
i
Z
m
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
w_{m+1,i}=\frac{w_{mi}}{Z_m} exp(-α_m y_i G_m (x_i ))
wm+1,i=Zmwmiexp(−αmyiGm(xi)) 这里
Z
m
Z_m
Zm为归一化因子,使得
D
(
m
+
1
)
D_(m+1)
D(m+1)成为一个概率分布
Z
m
=
∑
i
=
1
N
w
m
i
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
Z_m=∑_{i=1}^Nw_{mi} exp(-α_m y_i G_m (x_i ))
Zm=i=1∑Nwmiexp(−αmyiGm(xi))由于标签为+1或者-1,所有得到
w m + 1 , i = { w m i Z m e ( − α m ) , G m ( x i ) = y i w m i Z m e ( α m ) , G m ( x i ) ! = y i w_{m+1,i}=\begin{cases} \frac{w_{mi}}{Z_m} e^(-α_m ), & G_m (x_i )=y_i \\ \frac{w_{mi}}{Z_m} e^(α_m ), & G_m (x_i )!=y_i \end{cases} wm+1,i={Zmwmie(−αm),Zmwmie(αm),Gm(xi)=yiGm(xi)!=yi
- 第三步:构建基本分类器的线性组合: f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=∑_{m=1}^M α_m G_m (x) f(x)=m=1∑MαmGm(x)最终得到分类器: G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) ) G(x)=sign(f(x))=sign(∑_{m=1}^Mα_m G_m (x) ) G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
- 步骤一训练数据集具有均匀的权值分布
- 步骤二中学习基本分类器的方法是一个抽象的方法,可以根据具体应用场景选择具体算法。比如下面章节用的就是决策树算法。
- 不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这是AdaBoost的一个特点.
二、加法模型与前向分步算法:
1、前向分步算法
- 加法模型(additive model)基本形式如下: f ( x ) = ∑ m = 1 M β m b ( x , r m ) f(x)=∑_{m=1}^Mβ_m b(x,r_m) f(x)=m=1∑Mβmb(x,rm)其中, b ( x , r m ) b(x,r_m) b(x,rm)为基函数, r m r_m rm为基函数的参数, β m β_m βm为基函数的系数.
- 在给定训练数据及损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))的条件下,学习加法模型 f ( x ) f(x) f(x)成为经验风险极小化即损失函数极小化问题: min β m , r m ∑ i = 1 N L ( y i , f ( x i ) ) = min β m , r m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x , r m ) ) \min_{β_m,r_m }∑_{i=1}^NL(y_i,f(x_i )) =\min_{β_m,r_m }∑_{i=1}^NL(y_i,∑_{m=1}^Mβ_m b(x,r_m)) βm,rmmini=1∑NL(yi,f(xi))=βm,rmmini=1∑NL(yi,m=1∑Mβmb(x,rm))
- 通常直接优化这个损失函数很复杂.前向分步算法求解这一优化问题的想法是:
- 我们的目标是最小化: min β m , r m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x , r m ) ) \min_{β_m,r_m }∑_{i=1}^NL(y_i,∑_{m=1}^Mβ_m b(x,r_m)) βm,rmmini=1∑NL(yi,m=1∑Mβmb(x,rm))
- 求解这个式子是一下解出所有的 β m , r m β_m,r_m βm,rm,这样比较难,于是我们选择逐步求出 β m , r m β_m,r_m βm,rm的方法,假设前面 1 到 m − 1 1到m-1 1到m−1个基函数和它的系数都已经确定了,并保持不变了,这样我们到了局部加法模型 f m − 1 ( x ) f_{m-1} (x) fm−1(x): f m − 1 ) ( x ) = ∑ i = 1 m − 1 β i b ( x , r i ) f_{m-1)}(x)=∑_{i=1}^{m-1}β_i b(x,r_i) fm−1)(x)=i=1∑m−1βib(x,ri)
- 现在为了进一步减少损失函数,我们通过再引入参数 r m , β m r_m,β_m rm,βm,构造新的加法模型: f m ( x ) = f m − 1 ( x i ) + β m b ( x , r m ) f_m (x)=f_{m-1} (x_i )+β_m b(x,r_m) fm(x)=fm−1(xi)+βmb(x,rm)
- 通过最小化下面函数来进一步减少损失函数: ( β m , r m ) = min β , r ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x , r ) ) (β_m,r_m )=\min_{β,r}∑_{i=1}^NL(y_i,f_{m-1} (x_i )+βb(x,r)) (βm,rm)=β,rmini=1∑NL(yi,fm−1(xi)+βb(x,r))得到第m个基函数和它对应参数
- 直迭代直到第M步。得到最终的加法模型。
- 这样,前向分步算法将同时求解从
m
=
1
m=1
m=1到
M
M
M所有参数
r
m
,
β
m
r_m,β_m
rm,βm的优化问题简化为逐次求解各个
r
m
,
β
m
r_m,β_m
rm,βm的优化问题.
- 前向分步算法:
- 输入:训练数据集;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x));基函数集 { b ( x , r ) } \{b(x,r)\} {b(x,r)}(是基函数的基本形式)
- 输出:加法模型 f ( x ) f(x) f(x).
- 算法步骤:
- 初始化 f 0 ( x ) = 0 f_0 (x)=0 f0(x)=0
- 循环训练模型,
m
=
1
,
2
,
…
,
M
m=1,2,…,M
m=1,2,…,M
- 极小化损失函数: ( β m , r m ) = min β , r ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x , r ) ) (β_m,r_m )=\min_{β,r}∑_{i=1}^NL(y_i,f_{m-1} (x_i )+βb(x,r)) (βm,rm)=β,rmini=1∑NL(yi,fm−1(xi)+βb(x,r))
- 更新: f m ( x ) = f m − 1 ( x ) + β m b m ( x , r ) f_m (x)=f_{m-1} (x)+ β_m b_m (x,r) fm(x)=fm−1(x)+βmbm(x,r)
- 得到加法模型: f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x , r m ) f(x)=f_M (x)=∑_{m=1}^Mβ_m b(x,r_m) f(x)=fM(x)=m=1∑Mβmb(x,rm)
2、前向分步算法与AdaBoost关系:
- 前向分步算法学习的是加法模型,当基函数为基本分类器,损失函数为如下指数损失函数时,该加法模型等价于AdaBoost: L ( y , f ( x ) ) = e x p ( − y f ( x ) ) L(y,f(x))=exp(-yf(x)) L(y,f(x))=exp(−yf(x))
- 第m轮迭代: f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m (x)=f_{m-1} (x)+α_m G_m (x) fm(x)=fm−1(x)+αmGm(x)
- 目标是使在训练数据集 T T T上的指数损失最小,即: ( α m , G m ( x ) ) = a r g min α , G ∑ i = 1 N e x p ( − y i ( f m − 1 ( x i ) + α m G m ( x i ) ) ) (α_m,G_m (x))=arg\min_{α,G}∑_{i=1}^Nexp(-y_i (f_{m-1} (x_i )+α_m G_m (x_i))) (αm,Gm(x))=argα,Gmini=1∑Nexp(−yi(fm−1(xi)+αmGm(xi))) ( α m , G m ( x ) ) = a r g min α , G ∑ i = 1 N w ^ m i e x p ( − y i α G ( x ) ) (α_m,G_m (x))=arg\min_{α,G}∑_{i=1}^N \hat{w}_{mi} exp(-y_i αG(x)) (αm,Gm(x))=argα,Gmini=1∑Nw^miexp(−yiαG(x)) 其中, w ^ m i = e x p ( − y i f m − 1 ( x ) ) \hat{w}_{mi} =exp(-y_i f_{m-1} (x)) w^mi=exp(−yifm−1(x))为常数
- 现需要证明,上式的解:
(
α
m
∗
,
G
m
∗
(
x
)
)
(α_m^*,G_m^* (x))
(αm∗,Gm∗(x)),就是AdaBoost算法的
(
α
m
,
G
m
(
x
)
)
(α_m,G_m (x))
(αm,Gm(x)).求解式上式可分两步:
- 首先求
G
m
∗
(
x
)
G_m^* (x)
Gm∗(x):
- 如果我们将
w
^
m
i
\hat{w}_{mi}
w^mi看作是每个样本的权值,将α看作一个常数,由于
α
>
0
α>0
α>0,所有上式可以看作是基本模型
G
(
x
)
G(x)
G(x)的加权损失函数,最小化加权损失函数得到当前的基本模型
G
m
∗
(
x
)
G_m^* (x)
Gm∗(x)。这和AdaBoost算法中通过某种学习算法学习得到的基本分类器是一致的,即
G
m
∗
(
x
)
=
G
m
(
x
)
G_m^* (x)=G_m (x)
Gm∗(x)=Gm(x),因为它都是使第m轮加权训练数据分类误差率最小的基本分类器.
- 如果我们将
w
^
m
i
\hat{w}_{mi}
w^mi看作是每个样本的权值,将α看作一个常数,由于
α
>
0
α>0
α>0,所有上式可以看作是基本模型
G
(
x
)
G(x)
G(x)的加权损失函数,最小化加权损失函数得到当前的基本模型
G
m
∗
(
x
)
G_m^* (x)
Gm∗(x)。这和AdaBoost算法中通过某种学习算法学习得到的基本分类器是一致的,即
G
m
∗
(
x
)
=
G
m
(
x
)
G_m^* (x)=G_m (x)
Gm∗(x)=Gm(x),因为它都是使第m轮加权训练数据分类误差率最小的基本分类器.
- 再求
α
m
∗
α_m^*
αm∗:
- 在确定 G m ∗ ( x ) G_m^* (x) Gm∗(x)后得: ∑ i = 1 N w ^ m i e x p ( − y i α G m ∗ ( x i ) ) = ∑ G m ∗ ( x i ) = y i w ^ m i e − α + ∑ G m ∗ ( x i ) ! = y i w ^ m i e α ∑_{i=1}^N\hat{w}_{mi} exp(-y_i αG_m^* (x_i )) =∑_{G_m^* (x_i )=y_i}\hat{w}_{mi} e^{-α} +∑_{G_m^* (x_i )!=y_i}\hat{w}_{mi} e^α i=1∑Nw^miexp(−yiαGm∗(xi))=Gm∗(xi)=yi∑w^mie−α+Gm∗(xi)!=yi∑w^mieα = ( e − α + e α ) ∑ i = 1 N w ^ m i I ( y i ! = G m ∗ ( x i ) ) + e − α ∑ i = 1 N w ^ m i =(e^{-α}+e^α ) ∑_{i=1}^N\hat{w}_{mi} I(y_i !=G_m^* (x_i )) +e^{-α} ∑_{i=1}^N\hat{w}_{mi} =(e−α+eα)i=1∑Nw^miI(yi!=Gm∗(xi))+e−αi=1∑Nw^mi
- 所以有: α m ∗ = a r g min α [ ( e − α + e α ) ∑ i = 1 N w ^ m i I ( y i ! = G m ∗ ( x i ) ) + e − α ∑ i = 1 N w ^ m i ] α_m^*=arg\min_{α}[(e^{-α}+e^α ) ∑_{i=1}^N\hat{w}_{mi} I(y_i !=G_m^* (x_i )) +e^{-α} ∑_{i=1}^N\hat{w}_{mi} ] αm∗=argαmin[(e−α+eα)i=1∑Nw^miI(yi!=Gm∗(xi))+e−αi=1∑Nw^mi]
- 对 α α α求导并令其为0: − ∑ G m ∗ ( x i ) = y i w ^ m i e − α + ∑ G m ∗ ( x i ) ! = y i w ^ m i e α = 0 -∑_{G_m^* (x_i )=y_i}\hat{w}_{mi} e^{-α} +∑_{G_m^* (x_i )!=y_i}\hat{w}_{mi} e^α =0 −Gm∗(xi)=yi∑w^mie−α+Gm∗(xi)!=yi∑w^mieα=0 ∑ G m ∗ ( x i ) = y i w ^ m i e − α = ∑ G m ∗ ( x i ) ! = y i w ^ m i e α ∑_{G_m^* (x_i )=y_i}\hat{w}_{mi} e^{-α} =∑_{G_m^* (x_i )!=y_i}\hat{w}_{mi} e^α Gm∗(xi)=yi∑w^mie−α=Gm∗(xi)!=yi∑w^mieα即: α m ∗ = 1 2 l n ( ∑ ( G m ∗ ( x i ) = y i ) w ^ m i ∑ ( G m ∗ ( x i ) ! = y i ) w ^ m i ) α_m^*=\frac{1}{2} ln(\frac{∑_(G_m^* (x_i )=y_i)\hat{w}_{mi} }{∑_(G_m^* (x_i )!=y_i)\hat{w}_{mi} }) αm∗=21ln(∑(Gm∗(xi)!=yi)w^mi∑(Gm∗(xi)=yi)w^mi)
- 记误差率为: e m = ∑ i = 1 N w ^ m i I ( y i ! = G m ∗ ( x i ) ) ∑ ( i = 1 ) N w ^ m i = ∑ i = 1 N w m i I ( y i ! = G m ∗ ( x i ) ) e_m=\frac{∑_{i=1}^N\hat{w}_{mi} I(y_i !=G_m^* (x_i )) }{∑_(i=1)^N\hat{w}_{mi} }=∑_{i=1}^Nw_{mi} I(y_i !=G_m^* (x_i )) em=∑(i=1)Nw^mi∑i=1Nw^miI(yi!=Gm∗(xi))=i=1∑NwmiI(yi!=Gm∗(xi))可以理解成将 w ^ m i \hat{w}_{mi} w^mi归一化变成 w m i w_{mi} wmi。
- 所以: α m ∗ = 1 2 l n ( 1 − e m e m ) α_m^*=\frac{1}{2} ln(\frac{1-e_m}{e_m }) αm∗=21ln(em1−em)
- 与AdaBoost算法完全一致.
- 再更新样本权值:
- 经过上面的推导最后得到,当前步骤的基本分类器和它的系数,更新模型: f m ( x ) = f m − 1 ( x ) + α m G m ( x ) f_m (x)=f_{m-1} (x)+α_m G_m (x) fm(x)=fm−1(x)+αmGm(x)
- 那么 w ^ m i \hat{w}_{mi} w^mi为: w ^ m + 1 i = e x p ( − y i f m ( x ) ) = w ^ m i e x p ( − y i α m G m ( x i ) ) \hat{w}_{m+1i}=exp(-y_i f_m (x))=\hat{w}_{mi} exp(-y_i α_m G_m (x_i )) w^m+1i=exp(−yifm(x))=w^miexp(−yiαmGm(xi))
- 如果提前进行归一化: w m + 1 i = w ^ m i e x p ( − y i α m G m ( x i ) ) ∑ i = 1 N w ^ m i e x p ( − y i α m G m ( x i ) ) = w ^ m i Z m e x p ( − y i α m G m ( x i ) ) w_{m+1i}=\frac{\hat{w}_{mi} exp(-y_i α_m G_m (x_i ))}{∑_{i=1}^N\hat{w}_{mi} exp(-y_i α_m G_m (x_i )) }=\frac{\hat{w}_{mi}}{Z_m} exp(-y_i α_m G_m (x_i )) wm+1i=∑i=1Nw^miexp(−yiαmGm(xi))w^miexp(−yiαmGm(xi))=Zmw^miexp(−yiαmGm(xi))
- 与AdaBoost算法完全一致.
- 首先求
G
m
∗
(
x
)
G_m^* (x)
Gm∗(x):
三、提升树:
- 提升树:是以分类树或回归树为基本分类器的提升方法.即使用分类树或回归树来得到 G m G_m Gm的adaboost算法。
1、提升树模型
- 以决策树为基函数的提升方法称为提升树(boosting tree).对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树.即使用的CART决策树。
- 提升树模型可以表示为决策树的加法模型: f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f_M (x)=∑_{m=1}^MT(x;θ_m) fM(x)=m=1∑MT(x;θm)其中, T ( x ; θ m ) T(x;θ_m) T(x;θm)表示决策树; θ m θ_m θm为决策树的参数; M M M为树的个数.
2、提升树算法
- 首先确定初始提升树 f 0 ( x ) = 0 f_0 (x)=0 f0(x)=0,第 m m m步的模型是: f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m (x)=f_{m-1} (x)+T(x;θ_m) fm(x)=fm−1(x)+T(x;θm)
- 通过经验风险极小化确定当前这一棵决策树的参数 θ m θ_m θm: θ ^ m = a r g min θ m ∑ i = 1 N L ( y i , f m − 1 ( x ) + T ( x ; θ m ) ) \hat{θ}_m=arg\min_{θ_m}∑_{i=1}^NL(y_i,f_{m-1} (x)+T(x;θ_m)) θ^m=argθmmini=1∑NL(yi,fm−1(x)+T(x;θm))
- 下面讨论针对不同损失函数的提升树学习算法,包括:
- 用平方误差损失函数的回归问题,
- 用指数损失函数的分类问题
- 用一般损失函数的一般决策问题.
- 二类分类问题提升树:
- 该提升树算法只需将AdaBoost算法中的第二部中的第1小步中的基本分类器 G m ( x ) G_m (x) Gm(x)限制为CART二分类树就ok,可以说这时的提升树算法是AdaBoost算法的特殊情况
- 回归问题的提升树:
- 已知一个训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) T={(x_1,y_1 ),(x_2,y_2 ),…,(x_N,y_N )} T=(x1,y1),(x2,y2),…,(xN,yN)其中: x ∈ X ∈ R n , y ∈ Y ∈ R x∈X∈R^n, y∈Y∈R x∈X∈Rn,y∈Y∈R.
- 回归树可以参考CART树
- 回归问题提升树的递推公式: f 0 ( x ) = 0 f_0 (x)=0 f0(x)=0 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) , m = 1 , 2 , … , M f_m (x)=f_{m-1} (x)+T(x;θ_m ) ,m=1,2,…,M fm(x)=fm−1(x)+T(x;θm),m=1,2,…,M f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f_M (x)=∑_{m=1}^MT(x;θ_m ) fM(x)=m=1∑MT(x;θm)
- 第m步:给定当前模型 f m − 1 ( x ) f_{m-1} (x) fm−1(x),需求解: θ ^ m = a r g min θ m ∑ i = 1 N L ( y i , f ( m − 1 ) ( x ) + T ( x ; θ m ) ) \hat{θ}_m=arg\min_{θ_m }∑_{i=1}^NL(y_i,f_(m-1) (x)+T(x;θ_m)) θ^m=argθmmini=1∑NL(yi,f(m−1)(x)+T(x;θm))得到 θ ^ m \hat{θ}_m θ^m,即第 m m m棵树的参数.
- 当采用平方误差损失函数时: L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=(y-f(x))^2 L(y,f(x))=(y−f(x))2
- 其损失变为: L ( y i , f m − 1 ( x ) + T ( x ; θ m ) ) = [ y − f m − 1 ( x ) − T ( x ; θ m ) ] 2 = [ r − T ( x ; θ m ) ] 2 L(y_i,f_{m-1}(x)+T(x;θ_m ))=[y-f_{m-1}(x)-T(x;θ_m )]^2=[r-T(x;θ_m )]^2 L(yi,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)是当前模型拟合数据的残差
- 所以,对回归提升树算法来说,只需简单地拟合当前模型的残差,即每次迭代后将每个样本的label改为样本的残差,再训练当前的回归树,并且回归提升树的每个基本模型的系数都是1.
- 回归提升树算法步骤:
- 第一步:初始化:f_0 (x)=0
- 第二步:循环迭代:m=1,2,…,M
- 计算每个样本的残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , … , N r_{mi}=y_i-f_{m-1} (x_i ) ,i=1,2,…,N rmi=yi−fm−1(xi),i=1,2,…,N
- 将每个样本的标签更新为残差: y i = r m i y_i=r_{mi} yi=rmi
- 用更新后的数据训练生成回归树,得到 T ( x ; θ m ) T(x;θ_m) T(x;θm)
- 更新: f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m (x)=f_{m-1} (x)+T(x;θ_m ) fm(x)=fm−1(x)+T(x;θm)
- 第三步:得到回归提升树: f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f_M (x)=∑_{m=1}^MT(x;θ_m) fM(x)=m=1∑MT(x;θm)
3、梯度提升
- 提升树利用加法模型与前向分步算法实现学习的优化过程.当损失函数是平方损失和指数损失函数时,每一步优化是很简单的.但对一般损失函数而言,往往每一步优化并不那么容易.针对这一问题,Freidman提出了梯度提升(gradientboosting)算法.
- 下面讨论使用梯度提升(gradientboosting)算法学习任意损失函数的回归树
- 每一步都使用当前模型的梯度值: − [ ∂ L ( y , f ( x i ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -[\frac{∂L(y,f(x_i )}{∂f(x_i ) }]_{f(x)=f_{m-1} (x)} −[∂f(xi)∂L(y,f(xi)]f(x)=fm−1(x)
- 并且将每个样本的梯度作为当前样本残差的近似值,再训练当前的回归树.
- 梯度提升算法步骤:
- 输入:已知一个训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) T={(x_1,y_1 ),(x_2,y_2 ),…,(x_N,y_N )} T=(x1,y1),(x2,y2),…,(xN,yN)其中: x ∈ X ∈ R n , y ∈ Y ∈ R x∈X∈R^n, y∈Y∈R x∈X∈Rn,y∈Y∈R.损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))
- 输出:回归树 f ^ ( x ) \hat{f}(x) f^(x)
- 第一步:初始化: f 0 ( x ) = a r g min c ∑ i = 1 N L ( y i , c ) f_0 (x)=arg\min_{c}∑_{i=1}^N L(y_i,c) f0(x)=argcmini=1∑NL(yi,c)
- 第二步:循环迭代:
m
=
1
,
2
,
…
,
M
m=1,2,…,M
m=1,2,…,M
- 计算每个样本的梯度,即近似残差,作为数据的label: y i = r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) y_i=r_{mi}=-[\frac{∂L(y,f(x_i ))}{∂f(x_i )}]_{f(x)=f_{m-1}(x)} yi=rmi=−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
- 用新数据训练当前的回归树,得到第m棵树的叶结点区域 R m j , j = 1 , 2 … J R_mj,j=1,2…J Rmj,j=1,2…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}∑_{x_i∈R_{mj}}L(y_i,f_{m-1} (x_i )+c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
- 更新: 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) +∑_{j=1}^Jc_{mj} I(x∈R_{mj}) fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj)
- 第三步:得到回归树: 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) +∑_{m=1}^M∑_{j=1}^Jc_{mj} I(x∈R_{mj}) f^(x)=fM(x)+m=1∑Mj=1∑JcmjI(x∈Rmj)
- 算法第一步初始化,估计使损失函数极小化的常数值,即它是只有一个根结点的树
- 第二步的第一小步计算损失函数的负梯度在当前模型的值,将它作为残差的估计.对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值.