Boosting集成算法:Adaboost与Gradient Boosting
Boosting是一族可将弱学习器提升为强学习器的算法,这族算法的工作机制类似于:
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注;
然后基于调整后的样本分布来训练下一个基学习器;
如此重复进行,直至基学习器数目达到事先指定的值
T
T
T ,最终将这
T
T
T 个基学习器进行加权结合;
Boosting族算法最著名的代表是自适应增强算法(Adaptive Boosting,简称Adaboost)算法;
Boosting算法之Adaboost:自适应增强算法
自适应增强算法(Adaptive Boosting,简称Adaboost),由Yoav Freund和Robert Schapire在1995年提出;它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器;同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
具体展开说,整个Adaboost迭代算法实则只有3步:
初始化训练数据的权值分布:如果有
N
N
N 个样本,则每一个训练样本最开始时都被赋予相同的权值:
1
N
\displaystyle \frac {1}{N}
N 1 ;
训练弱分类器:
如果某个样本点已经被准确地分类,那么在构造下一个基学习器中,它的权值就被降低;
反之,如果某个样本点没有被准确地分类,那么它的权值就会得到提高;
随后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去;
将各个训练得到的弱分类器组合成强分类器:各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用;
换言之:
误差率低的弱分类器在最终分类器中占比的权重则较高;
误差率高的弱分类器在最终分类器中占比的权重则较低;
接下来给出详细的Adaboost算法流程推导;
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 = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } ,若推导Adaboost算法,其实方法有很多,比较容易理解的是基于“加性模型”(additive model)的推导:
第一步,先初始化训练数据的权值分布:
D
1
=
(
w
11
,
w
12
,
.
.
.
,
w
1
i
,
.
.
.
,
w
1
N
)
,
w
1
i
=
1
N
,
i
=
1
,
2
,
.
.
.
,
N
D_1 = (w_{11},w_{12},...,w_{1i},...,w_{1N}),w_{1i} = \frac {1}{N},i = 1,2,...,N
D 1 = ( w 1 1 , w 1 2 , . . . , w 1 i , . . . , w 1 N ) , w 1 i = N 1 , i = 1 , 2 , . . . , N
每一个训练样本最开始时都被赋予相同的权值:
1
N
\displaystyle \frac {1}{N}
N 1 ;
第二步,此时将开始多轮迭代步骤,此处用
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m = 1 , 2 , . . . , M 表示迭代到了第几轮;在每一轮的迭代步骤中,首先使用具有权值分布
D
m
D_m
D m (
m
m
m 表示第几轮迭代时所得的权值分布)的训练集训练弱分类器,得到基本分类器:
G
m
(
x
)
:
χ
→
{
−
1
,
+
1
}
G_m(x):\chi \to \{-1,+1\}
G m ( x ) : χ → { − 1 , + 1 }
这个过程中需要选取让误差率最低的阈值来设计基本分类器;其次,计算
G
m
(
x
)
G_m(x)
G m ( x ) 在训练集上的分类误差率:
e
m
=
P
(
G
m
(
x
i
)
≠
y
i
)
=
∑
i
=
1
N
w
m
i
I
(
G
m
(
x
i
)
≠
y
i
)
e_m = P(G_m(x_i)≠y_i) = \sum _{i=1}^Nw_{mi}I(G_m(x_i)≠y_i)
e m = P ( G m ( x i ) = y i ) = i = 1 ∑ N w m i I ( G m ( x i ) = y i )
其中:
P
(
G
m
(
x
i
)
≠
y
i
)
P(G_m(x_i)≠y_i)
P ( G m ( x i ) = y i ) 表示:事件“分类器
G
m
(
x
)
G_m(x)
G m ( x ) 分类结果不为
y
i
y_i
y i ”发生的概率,亦即表示分类误差率;
w
m
i
w_{mi}
w m i 表示权值分布中第
m
m
m 次迭代时第
i
i
i 个样本的权值;
I
(
G
m
(
x
i
)
≠
y
i
)
I(G_m(x_i)≠y_i)
I ( G m ( x i ) = y i ) 表示被分类器
G
m
(
x
)
G_m(x)
G m ( x ) 分类错误的样本的数量;
整体表达式含义为:
e
m
e_m
e m 表示被分类器
G
m
(
x
)
G_m(x)
G m ( x ) 错分样本的加权平均,表示误差率;
第三步,接下来计算
G
m
(
x
)
G_m(x)
G m ( x ) 的系数
α
m
\alpha_m
α m ,它表示
G
m
(
x
)
G_m(x)
G m ( x ) 在最终分类器(自适应增强后的集成的分类器)中的重要程度,也就是得到基本分类器在最终分类器中所占据的权重:
α
m
=
1
2
log
1
−
e
m
e
m
\alpha_m = \frac {1}{2}\log \frac {1-e_m}{e_m}
α m = 2 1 log e m 1 − e m
由上式可知:当
e
m
≤
1
2
\displaystyle e_m \leq \frac {1}{2}
e m ≤ 2 1 (为何?以2为底的对数,当
x
>
1
x>1
x > 1 时函数单调递增且函数值大于0)时,
α
m
>
0
\alpha_m>0
α m > 0 ,且伴随
e
m
e_m
e m 逐步减小,
α
m
\alpha_m
α m 逐步增大;这就意味着:
分类误差越小的基本分类器在最终分类器中的作用越大;
得出本轮迭代后基分类器
G
m
(
x
)
G_m(x)
G m ( x ) 在线性组合中的系数之后,接下来就需要更新训练集的权值分布,目的是要得到样本的新的权值分布,用于下一轮迭代做准备:
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})
D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , . . . , w m + 1 , N )
其中每个权值的重新计算公式为:
w
m
+
1
,
i
=
w
m
i
Z
m
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
.
.
.
,
N
w_{m+1,i} = \frac {w_{mi}}{Z_m}\exp(-\alpha_my_iG_m(x_i)),i = 1,2,...,N
w m + 1 , i = Z m w m i exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , . . . , N
w
m
i
w_{mi}
w m i 表示上一轮,即第
m
m
m 次迭代时第
i
i
i 个样本的权值,而
Z
m
Z_m
Z m 是一个规范化因子,它可以使得
D
m
+
1
D_{m+1}
D m + 1 继续成为一个概率分布:
Z
m
=
∑
i
=
1
N
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
Z_m = \sum_{i=1}^N w_{mi}\exp (-\alpha_my_iG_m(x_i))
Z m = i = 1 ∑ N w m i exp ( − α m y i G m ( x i ) )
注意:
Z
m
Z_m
Z m 即为Adaboost优化的损失函数;同时也可将其代入表示,即为:
w
m
+
1
,
i
=
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
∑
i
=
1
N
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
.
.
.
,
N
\displaystyle w_{m+1,i} = \frac {w_{mi} \exp(-\alpha_my_iG_m(x_i))}{\sum\limits_{i=1}^N w_{mi}\exp (-\alpha_my_iG_m(x_i))},i = 1,2,...,N
w m + 1 , i = i = 1 ∑ N w m i exp ( − α m y i G m ( x i ) ) w m i exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , . . . , N
那么:经过本次权值调整后,被基分类器
G
m
(
x
)
G_m(x)
G m ( x ) 误分类的样本的权值将增大,而正确分类的样本的权值则降低;基于这种方式,Adaboost算法就能“重点关注”或“聚焦于”那些较难分类的样本(亦即
m
m
m 次迭代中最少
j
j
j 次被误分类的样本);
继续进行下一次迭代,依据上一次迭代所调整的权值,并结合训练集数据后继续训练出一个新的弱分类器;
如此迭代下去,当经过
m
m
m 次迭代,得到
m
m
m 个弱分类器
G
m
(
x
)
G_m(x)
G m ( x ) 后,利用加性模型线性组合这些弱分类器:
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
f(x)=\sum_{m=1}^M\alpha_mG_m(x)
f ( x ) = m = 1 ∑ M α m G m ( 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(\sum_{m=1}^M\alpha_mG_m(x))
G ( x ) = s i g n ( f ( x ) ) = s i g n ( m = 1 ∑ M α m G m ( x ) )
s
i
g
n
sign
s i g n 是符号函数,亦即分段函数,在这里表示分类器
G
(
x
)
G(x)
G ( x ) 的完整分类过程;
下面给出一个简易的Adaboost算法案例,来辅助各位彻底理解算法原理;假设给定下列训练样本,使用Adaboost算法学习一个强分类器:
序号
1
2
3
4
5
6
7
8
9
10
X
0
1
2
3
4
5
6
7
8
9
Y
1
1
1
-1
-1
-1
1
1
1
-1
求解过程:
第一步,初始化训练数据的权值分布,令每个权值
w
1
i
=
1
N
=
1
10
=
0.1
\displaystyle w_{1i}=\frac {1}{N}=\frac {1}{10}=0.1
w 1 i = N 1 = 1 0 1 = 0 . 1 ,其中
N
=
10
,
i
=
1
,
2
,
.
.
.
,
10
N=10,i=1,2,...,10
N = 1 0 , i = 1 , 2 , . . . , 1 0 ;
拿到这10个数据的训练样本后,根据
X
X
X 和
Y
Y
Y 的对应关系,要把这10个数据分为两类,一类是“1”,一类是“-1”;根据数据的特点发现:
“0 1 2”这3个数据对应的类是“1”;
“3 4 5”这3个数据对应的类是“-1”;
“6 7 8”这3个数据对应的类是“1”;
9是比较孤独的,对应类“-1”;抛开孤独的9不讲,“0 1 2”、“3 4 5”、“6 7 8”这是3类不同的数据,分别对应的类是1、-1、1,直观上推测可知,可以找到对应的数据分界点,比如2.5、5.5、8.5 将数据分成两类;
当然,这只是主观臆测,下面展示实际计算过程,开始
m
m
m 次迭代(
m
=
1
,
2
,
.
.
.
m=1,2,...
m = 1 , 2 , . . . ),设定一个阈值
v
v
v :
m
=
1
m=1
m = 1 :第一次迭代,在权值分布为
D
1
D_1
D 1 (此时的10个样本点各自权值均为0.1)的训练数据上,经过计算得:
阈值
v
v
v 取2.5时误差率为0.3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.3);
阈值
v
v
v 取5.5时误差率最低为0.4(x < 5.5时取1,x > 5.5时取-1,则3 4 5 6 7 8皆分错,误差率0.6大于0.5,不可取。故令x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.4);
阈值
v
v
v 取8.5时误差率为0.3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.3);
可以看到:无论阈值
v
v
v 取2.5还是8.5,总是至少分错3个样本,故可任取其中任意一个阈值,如2.5,构成第一个基本分类器为:
G
1
(
x
)
=
{
1
,
x
<
2.5
−
1
,
x
>
2.5
G_1(x)=\begin{cases} 1,x<2.5 \\ -1,x>2.5 \end{cases}
G 1 ( x ) = { 1 , x < 2 . 5 − 1 , x > 2 . 5
从而得到
G
1
(
x
)
G_1(x)
G 1 ( x ) 在训练集上的误差率(被
G
1
(
x
)
G_1(x)
G 1 ( x ) 错误分类的样本6 7 8的权值之和)为:
e
1
=
P
(
G
1
(
x
1
)
≠
y
i
)
=
0.1
∗
3
=
0.3
e_1 = P(G_1(x_1)≠y_i) = 0.1 * 3 = 0.3 \\
e 1 = P ( G 1 ( x 1 ) = y i ) = 0 . 1 ∗ 3 = 0 . 3
随后根据该误差率
e
1
e_1
e 1 计算
G
1
G_1
G 1 的系数
α
1
\alpha_1
α 1 :
α
1
=
1
2
log
1
−
e
1
e
1
≈
0.4236
\alpha_1 = \frac {1}{2}\log \frac {1-e_1}{e_1} \approx 0.4236
α 1 = 2 1 log e 1 1 − e 1 ≈ 0 . 4 2 3 6
系数
α
1
\alpha_1
α 1 即代表
G
1
(
x
1
)
G_1(x_1)
G 1 ( x 1 ) 基分类器在最终集成的分类器上所占据的权重为0.4236;
继续,接下来更新训练集数据的权值分布,用于下一次迭代:
D
m
+
1
=
(
w
m
+
1
,
1
,
w
m
+
1
,
2
,
.
.
.
,
w
m
+
1
,
N
)
w
m
+
1
,
i
=
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
∑
i
=
1
N
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
.
.
.
,
N
D_{m+1} = (w_{m+1,1},w_{m+1,2},...,w_{m+1,N}) \\ \displaystyle w_{m+1,i} = \frac {w_{mi} \exp(-\alpha_my_iG_m(x_i))}{\sum\limits_{i=1}^N w_{mi}\exp (-\alpha_my_iG_m(x_i))},i = 1,2,...,N
D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , . . . , w m + 1 , N ) w m + 1 , i = i = 1 ∑ N w m i exp ( − α m y i G m ( x i ) ) w m i exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , . . . , N
由权值更新的公式可知:每个样本的新权值是变大还是变小,取决于它是分类出错还是分类正确:
若某个训练样本分类出错,则
y
i
G
m
(
x
1
)
y_iG_m(x_1)
y i G m ( x 1 ) 为负,
−
α
m
y
i
G
m
(
x
i
)
-\alpha_my_iG_m(x_i)
− α m y i G m ( x i ) 因负负而得正,使得整个
w
m
+
1
,
i
w_{m+1,i}
w m + 1 , i 表达式结果增大;
反之,则减小;
故而,第一轮迭代完毕后,更新各个样本点的新权值分布为:
D
2
=
(
0.0715
,
0.0715
,
0.0715
,
0.0715
,
0.0715
,
0.0715
,
0.1666
,
0.1666
,
0.1666
,
0.0715
)
D_2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715,0.1666, 0.1666, 0.1666, 0.0715)
D 2 = ( 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 1 6 6 6 , 0 . 1 6 6 6 , 0 . 1 6 6 6 , 0 . 0 7 1 5 ) (计算省略);由此观察,发现:
因为样本点6 7 8分错了,故而其权值由之前的0.1增大到0.1666;
反之,其余样本点都分对了,所以他们的权值由之前的0.1降低到0.0715;
最终,对应得到此时集成后的分类器仅包含第一个弱分类器:
G
(
x
)
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
s
i
g
n
(
f
1
(
x
)
)
=
s
i
g
n
(
α
1
G
1
(
x
)
)
=
s
i
g
n
(
0.4236
G
1
(
x
)
)
G(x)=sign(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x)) \\ sign(f_1(x)) = sign(\alpha_1G_1(x))=sign(0.4236G_1(x))
G ( x ) = s i g n ( f ( x ) ) = s i g n ( m = 1 ∑ M α m G m ( x ) ) s i g n ( f 1 ( x ) ) = s i g n ( α 1 G 1 ( x ) ) = s i g n ( 0 . 4 2 3 6 G 1 ( x ) )
此时也能看出:第一个弱分类器
s
i
g
n
(
0.4236
G
1
(
x
)
)
sign(0.4236G_1(x))
s i g n ( 0 . 4 2 3 6 G 1 ( x ) ) 中,错误分类样本的权值之和即影响了误差率,而误差率即影响该弱分类器在集成中所占据的权重;
m
=
2
m=2
m = 2 :第二次迭代,在权值分布为
D
2
=
(
0.0715
,
0.0715
,
0.0715
,
0.0715
,
0.0715
,
0.0715
,
0.1666
,
0.1666
,
0.1666
,
0.0715
)
D_2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715,0.1666, 0.1666, 0.1666, 0.0715)
D 2 = ( 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 0 7 1 5 , 0 . 1 6 6 6 , 0 . 1 6 6 6 , 0 . 1 6 6 6 , 0 . 0 7 1 5 ) (此时的10个样本点各自权值来自上一轮迭代结束前更新完毕的权值分布)的训练数据上,经过计算得:
阈值
v
v
v 取2.5时误差率为
0.1666
∗
3
0.1666*3
0 . 1 6 6 6 ∗ 3 (x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为
0.1666
∗
3
0.1666*3
0 . 1 6 6 6 ∗ 3 );
阈值
v
v
v 取5.5时误差率最低为
0.0715
∗
4
0.0715*4
0 . 0 7 1 5 ∗ 4 (x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为
0.0715
∗
3
+
0.0715
0.0715*3 + 0.0715
0 . 0 7 1 5 ∗ 3 + 0 . 0 7 1 5 );
阈值
v
v
v 取8.5时误差率为
0.0715
∗
3
0.0715*3
0 . 0 7 1 5 ∗ 3 (x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为
0.0715
∗
3
0.0715*3
0 . 0 7 1 5 ∗ 3 );
故而,阈值
v
v
v 取8.5时误差率最低,故第二个弱分类器为:
G
2
(
x
)
=
{
1
,
x
<
8.5
−
1
,
x
>
8.5
G_2(x)=\begin{cases} 1,x<8.5 \\ -1,x>8.5 \end{cases}
G 2 ( x ) = { 1 , x < 8 . 5 − 1 , x > 8 . 5
很明显,
G
2
(
x
)
G_2(x)
G 2 ( x ) 把样本3 4 5分错了,根据
D
2
D_2
D 2 可知它们的权值均为0.0715,所以
G
2
(
x
)
G_2(x)
G 2 ( x ) 在训练数据集上的误差率(被
G
2
(
x
)
G_2(x)
G 2 ( x ) 错误分类的样本3 4 5的权值之和)为:
e
2
=
P
(
G
2
(
x
2
)
≠
y
i
)
=
0.0715
∗
3
=
0.2413
e_2 = P(G_2(x_2)≠y_i) = 0.0715 * 3 = 0.2413 \\
e 2 = P ( G 2 ( x 2 ) = y i ) = 0 . 0 7 1 5 ∗ 3 = 0 . 2 4 1 3
随后根据该误差率
e
2
e_2
e 2 计算
G
2
G_2
G 2 的系数
α
2
\alpha_2
α 2 :
α
2
=
1
2
log
1
−
e
2
e
2
≈
0.6496
\alpha_2 = \frac {1}{2}\log \frac {1-e_2}{e_2} \approx 0.6496
α 2 = 2 1 log e 2 1 − e 2 ≈ 0 . 6 4 9 6
系数
α
2
\alpha_2
α 2 即代表
G
2
(
x
1
)
G_2(x_1)
G 2 ( x 1 ) 基分类器在最终集成的分类器上所占据的权重为0.6496;
继续,接下来更新训练集数据的权值分布,用于下一次迭代:
D
m
+
1
=
(
w
m
+
1
,
1
,
w
m
+
1
,
2
,
.
.
.
,
w
m
+
1
,
N
)
w
m
+
1
,
i
=
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
∑
i
=
1
N
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
.
.
.
,
N
D_{m+1} = (w_{m+1,1},w_{m+1,2},...,w_{m+1,N}) \\ \displaystyle w_{m+1,i} = \frac {w_{mi} \exp(-\alpha_my_iG_m(x_i))}{\sum\limits_{i=1}^N w_{mi}\exp (-\alpha_my_iG_m(x_i))},i = 1,2,...,N
D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , . . . , w m + 1 , N ) w m + 1 , i = i = 1 ∑ N w m i exp ( − α m y i G m ( x i ) ) w m i exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , . . . , N
故而,第二轮迭代完毕后,更新各个样本点的新权值分布为:
D
3
=
(
0.0455
,
0.0455
,
0.0455
,
0.1667
,
0.1667
,
0.1667
,
0.1060
,
0.1060
,
0.1060
,
0.0455
)
D_3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667, 0.1667 , 0.1060, 0.1060, 0.1060, 0.0455)
D 3 = ( 0 . 0 4 5 5 , 0 . 0 4 5 5 , 0 . 0 4 5 5 , 0 . 1 6 6 7 , 0 . 1 6 6 7 , 0 . 1 6 6 7 , 0 . 1 0 6 0 , 0 . 1 0 6 0 , 0 . 1 0 6 0 , 0 . 0 4 5 5 ) (计算省略);由此观察,发现:
因为样本点3 4 5分错了,故而其权值由之前的0.0715增大到0.1667;
反之,其余样本点都分对了,所以他们的权值相比之前均有所降低;
最终,对应得到此时集成后的,包含第一、第二弱分类器的集成为:
G
(
x
)
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
s
i
g
n
(
f
2
(
x
)
)
=
s
i
g
n
(
0.4236
G
1
(
x
)
+
0.6496
G
2
(
x
)
)
G(x)=sign(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x)) \\ sign(f_2(x)) =sign(0.4236G_1(x)+0.6496G_2(x))
G ( x ) = s i g n ( f ( x ) ) = s i g n ( m = 1 ∑ M α m G m ( x ) ) s i g n ( f 2 ( x ) ) = s i g n ( 0 . 4 2 3 6 G 1 ( x ) + 0 . 6 4 9 6 G 2 ( x ) )
m
=
3
m=3
m = 3 :第三次迭代,在权值分布为
D
3
=
(
0.0455
,
0.0455
,
0.0455
,
0.1667
,
0.1667
,
0.01667
,
0.1060
,
0.1060
,
0.1060
,
0.0455
)
D_3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667, 0.01667 , 0.1060, 0.1060, 0.1060, 0.0455)
D 3 = ( 0 . 0 4 5 5 , 0 . 0 4 5 5 , 0 . 0 4 5 5 , 0 . 1 6 6 7 , 0 . 1 6 6 7 , 0 . 0 1 6 6 7 , 0 . 1 0 6 0 , 0 . 1 0 6 0 , 0 . 1 0 6 0 , 0 . 0 4 5 5 ) (此时的10个样本点各自权值来自上一轮迭代结束前更新完毕的权值分布)的训练数据上,经过计算得阈值
v
v
v 应取5.5(计算过程不再重复),故而第三个弱分类器为:
G
3
(
x
)
=
{
1
,
x
>
5.5
−
1
,
x
<
5.5
G_3(x)=\begin{cases} 1,x>5.5 \\ -1,x<5.5 \end{cases}
G 3 ( x ) = { 1 , x > 5 . 5 − 1 , x < 5 . 5
此时分错的样本是0 1 2 9,且其目前对应权值均为0.0455,故而
G
3
(
x
)
G_3(x)
G 3 ( x ) 在训练集上的误差率
e
3
=
P
(
G
3
(
x
3
)
≠
y
i
)
=
0.0455
∗
4
=
0.1820
e_3 = P(G_3(x_3)≠y_i) = 0.0455 * 4 = 0.1820
e 3 = P ( G 3 ( x 3 ) = y i ) = 0 . 0 4 5 5 ∗ 4 = 0 . 1 8 2 0 ,此时
G
3
G_3
G 3 的系数
α
3
\alpha_3
α 3 为:
α
3
=
1
2
log
1
−
e
3
e
3
≈
0.7514
\alpha_3 = \frac {1}{2}\log \frac {1-e_3}{e_3} \approx 0.7514
α 3 = 2 1 log e 3 1 − e 3 ≈ 0 . 7 5 1 4
故而,第三轮迭代完毕后,更新各个样本点的新权值分布为:
D
4
=
(
0.125
,
0.125
,
0.125
,
0.102
,
0.102
,
0.102
,
0.065
,
0.065
,
0.065
,
0.125
)
D_4 = (0.125, 0.125, 0.125, 0.102, 0.102, 0.102, 0.065, 0.065, 0.065, 0.125)
D 4 = ( 0 . 1 2 5 , 0 . 1 2 5 , 0 . 1 2 5 , 0 . 1 0 2 , 0 . 1 0 2 , 0 . 1 0 2 , 0 . 0 6 5 , 0 . 0 6 5 , 0 . 0 6 5 , 0 . 1 2 5 ) (计算省略);
最终,对应得到此时集成后的,包含第一、第二、第三弱分类器的集成为:
G
(
x
)
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
s
i
g
n
(
f
3
(
x
)
)
=
s
i
g
n
(
0.4236
G
1
(
x
)
+
0.6496
G
2
(
x
)
+
0.7514
G
3
(
x
)
)
G(x)=sign(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x)) \\ sign(f_3(x)) =sign(0.4236G_1(x)+0.6496G_2(x)+0.7514G_3(x))
G ( x ) = s i g n ( f ( x ) ) = s i g n ( m = 1 ∑ M α m G m ( x ) ) s i g n ( f 3 ( x ) ) = s i g n ( 0 . 4 2 3 6 G 1 ( x ) + 0 . 6 4 9 6 G 2 ( x ) + 0 . 7 5 1 4 G 3 ( x ) )
综上三步迭代过程,我们可以总结:
如果某些样本被分错,它们在下一轮迭代中的权值将被增大;
反之,其它被分对的样本在下一轮迭代中的权值将被减小;
这样,分错样本权值不断增大,分对样本权值不断减小,在下一轮迭代中,总是选取让误差率最低的阈值来设计新的弱分类器,所以误差率
e
e
e (所有被
G
m
(
x
)
G_m(x)
G m ( x ) 错误分类样本的权值之和)就不断降低;
最终所得的分类器即为:
G
(
x
)
=
s
i
g
n
(
f
3
(
x
)
)
=
s
i
g
n
(
0.4236
G
1
(
x
)
+
0.6496
G
2
(
x
)
+
0.7514
G
3
(
x
)
)
G(x)=sign(f_3(x)) =sign(0.4236G_1(x)+0.6496G_2(x)+0.7514G_3(x))
G ( x ) = s i g n ( f 3 ( x ) ) = s i g n ( 0 . 4 2 3 6 G 1 ( x ) + 0 . 6 4 9 6 G 2 ( x ) + 0 . 7 5 1 4 G 3 ( x ) )
Adaboost的误差界
通过上面的例子可知:
Adaboost在学习的过程中不断减少训练误差
e
e
e ,直到各个弱分类器组合成最终分类器;
那这个最终分类器的误差界到底是多少呢?在这里先直接给出Adaboost集成的训练误差上界为:
1
N
∑
i
=
1
N
I
(
G
(
x
i
)
≠
y
i
)
≤
1
N
∑
i
exp
(
−
y
i
f
(
x
i
)
)
=
∏
m
Z
m
①
\frac {1}{N}\sum_{i=1}^NI(G(x_i)≠y_i) \leq \frac {1}{N}\sum_i \exp (-y_if(x_i))=\prod_{m}Z_m \qquad ①
N 1 i = 1 ∑ N I ( G ( x i ) = y i ) ≤ N 1 i ∑ exp ( − y i f ( x i ) ) = m ∏ Z m ①
接下来给出证明:
∵
w
m
+
1
,
i
=
w
m
i
Z
m
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
.
.
.
,
N
∴
Z
m
w
m
+
1
,
i
=
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
(
1
)
又
∵
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
∴
原式
=
1
N
∑
i
exp
(
−
y
i
f
(
x
i
)
)
=
1
N
∑
i
exp
(
−
∑
m
=
1
M
α
m
y
i
G
m
(
x
i
)
)
(
初始时
w
1
i
=
1
N
)
=
w
1
i
∑
i
exp
(
−
∑
m
=
1
M
α
m
y
i
G
m
(
x
i
)
)
(
利用对数运算法则
log
(
a
+
b
)
=
log
a
∗
log
b
)
=
w
1
i
∏
m
=
1
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
(
利用
(
1
)
式带入连乘计算
)
=
Z
1
∑
i
w
2
i
∏
m
=
2
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
Z
1
Z
2
∑
i
w
3
i
∏
m
=
3
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
(
不断的从连乘式中拆解出一个合适的
G
m
进行化简
)
=
Z
1
Z
2
.
.
.
Z
M
−
1
∑
i
w
M
i
exp
(
−
α
M
y
i
G
M
(
x
i
)
)
=
Z
1
Z
2
.
.
.
Z
M
−
1
Z
M
=
∏
m
Z
m
\because w_{m+1,i} = \frac {w_{mi}}{Z_m}\exp(-\alpha_my_iG_m(x_i)),i = 1,2,...,N \\ \therefore Z_m w_{m+1,i} = w_{mi}\exp(-\alpha_my_iG_m(x_i)) \qquad (1)\\ 又\because f(x)=\sum_{m=1}^M\alpha_mG_m(x) \\ \therefore 原式=\frac {1}{N}\sum_i \exp (-y_if(x_i)) \\ =\frac {1}{N}\sum_i \exp (-\sum_{m=1}^M\alpha_my_iG_m(x_i)) \qquad (初始时w_{1i}=\frac {1}{N})\\ =w_{1i}\sum_i \exp (-\sum_{m=1}^M\alpha_my_iG_m(x_i)) \qquad (利用对数运算法则\log^{(a+b)}=\log^a*\log^b)\\ =w_{1i}\prod_{m=1}^M\exp (-\alpha_my_iG_m(x_i)) \qquad (利用(1)式带入连乘计算)\\ =Z_1\sum_iw_{2i}\prod_{m=2}^M\exp (-\alpha_my_iG_m(x_i)) \\ =Z_1Z_2\sum_iw_{3i}\prod_{m=3}^M\exp (-\alpha_my_iG_m(x_i)) \qquad (不断的从连乘式中拆解出一个合适的G_m进行化简)\\ =Z_1Z_2...Z_{M-1}\sum_iw_{Mi}\exp (-\alpha_M y_i G_M(x_i)) \\ =Z_1Z_2...Z_{M-1}Z_M \\ =\prod_{m}Z_m
∵ w m + 1 , i = Z m w m i exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , . . . , N ∴ Z m w m + 1 , i = w m i exp ( − α m y i G m ( x i ) ) ( 1 ) 又 ∵ f ( x ) = m = 1 ∑ M α m G m ( x ) ∴ 原 式 = N 1 i ∑ exp ( − y i f ( x i ) ) = N 1 i ∑ exp ( − m = 1 ∑ M α m y i G m ( x i ) ) ( 初 始 时 w 1 i = N 1 ) = w 1 i i ∑ exp ( − m = 1 ∑ M α m y i G m ( x i ) ) ( 利 用 对 数 运 算 法 则 log ( a + b ) = log a ∗ log b ) = w 1 i m = 1 ∏ M exp ( − α m y i G m ( x i ) ) ( 利 用 ( 1 ) 式 带 入 连 乘 计 算 ) = Z 1 i ∑ w 2 i m = 2 ∏ M exp ( − α m y i G m ( x i ) ) = Z 1 Z 2 i ∑ w 3 i m = 3 ∏ M exp ( − α m y i G m ( x i ) ) ( 不 断 的 从 连 乘 式 中 拆 解 出 一 个 合 适 的 G m 进 行 化 简 ) = Z 1 Z 2 . . . Z M − 1 i ∑ w M i exp ( − α M y i G M ( x i ) ) = Z 1 Z 2 . . . Z M − 1 Z M = m ∏ Z m
这个结果说明,可以在每一轮选取适当的
G
m
G_m
G m 使得
Z
m
Z_m
Z m 最小,从而使训练误差下降最快;
但此时:
∏
m
Z
m
\displaystyle \prod_{m}Z_m
m ∏ Z m 并不是最终的上界表达式,要视问题情况具体进一步推导;比如这里给出的案例就是一个典型的二分类问题,那么二分类问题下Adaboost的误差上界为:
∏
m
Z
m
=
∏
m
M
(
2
e
m
(
1
−
e
m
)
)
=
∏
m
M
1
−
4
γ
m
2
≤
exp
(
−
2
∑
m
=
1
M
γ
m
2
)
,
其中
γ
m
=
1
2
−
e
m
\prod_{m}Z_m = \prod_{m}^M(2\sqrt {e_m(1-e_m)})=\prod_{m}^M\sqrt {1-4\gamma_m^2} \leq \exp (-2\sum_{m=1}^M\gamma_m^2),其中\gamma_m=\frac {1}{2}-e_m
m ∏ Z m = m ∏ M ( 2 e m ( 1 − e m )
) = m ∏ M 1 − 4 γ m 2
≤ exp ( − 2 m = 1 ∑ M γ m 2 ) , 其 中 γ m = 2 1 − e m
也可简单推导,由给出的
Z
m
Z_m
Z m 以及误差上界一般化表达式①式可得:
Z
m
=
∑
i
=
1
N
w
m
i
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
∑
y
i
=
G
M
(
x
i
)
w
m
i
e
−
α
m
+
∑
y
i
≠
G
M
(
x
i
)
w
m
i
e
α
m
(
其中
α
m
=
1
2
log
1
−
e
m
e
m
)
=
(
1
−
e
m
)
e
−
α
m
+
e
m
e
α
m
=
2
e
m
(
1
−
e
m
)
=
1
−
4
γ
m
2
(
其中
γ
m
=
1
2
−
e
m
)
(
后续连乘计算不再展示,连乘需要依据表达式在点
x
处的泰勒展开进行推导,故计算过程不重要,看结果即可
)
Z_m = \sum_{i=1}^N w_{mi}\exp (-\alpha_my_iG_m(x_i)) \\ =\sum_{y_i=G_M(x_i)}w_{mi}e^{-\alpha_m}+\sum_{y_i≠G_M(x_i)}w_{mi}e^{\alpha_m} \qquad (其中\alpha_m = \frac {1}{2}\log \frac {1-e_m}{e_m})\\ =(1-e_m)e^{-\alpha_m}+e_me^{\alpha_m} \\ =2\sqrt{e_m(1-e_m)} \\ =\sqrt{1-4\gamma_m^2} \qquad (其中\gamma_m=\frac {1}{2}-e_m)\\ (后续连乘计算不再展示,连乘需要依据表达式在点x处的泰勒展开进行推导,故计算过程不重要,看结果即可)
Z m = i = 1 ∑ N w m i exp ( − α m y i G m ( x i ) ) = y i = G M ( x i ) ∑ w m i e − α m + y i = G M ( x i ) ∑ w m i e α m ( 其 中 α m = 2 1 log e m 1 − e m ) = ( 1 − e m ) e − α m + e m e α m = 2 e m ( 1 − e m )
= 1 − 4 γ m 2
( 其 中 γ m = 2 1 − e m ) ( 后 续 连 乘 计 算 不 再 展 示 , 连 乘 需 要 依 据 表 达 式 在 点 x 处 的 泰 勒 展 开 进 行 推 导 , 故 计 算 过 程 不 重 要 , 看 结 果 即 可 )
此时若取
γ
1
,
γ
2
,
.
.
.
\gamma_1,\gamma_2,...
γ 1 , γ 2 , . . . 的最大值,记作
γ
\gamma
γ ,则:
1
N
∑
i
=
1
N
I
(
G
(
x
i
)
≠
y
i
)
≤
exp
(
−
2
M
γ
2
)
\frac {1}{N}\sum_{i=1}^NI(G(x_i)≠y_i) \leq \exp(-2M\gamma^2)
N 1 i = 1 ∑ N I ( G ( x i ) = y i ) ≤ exp ( − 2 M γ 2 )
这个结论很重要,它表明Adaboost的训练误差是以指数速率下降的;
综上完整的理论推导,关于Adaboost算法,我们可以给出另外一种解释:
Adaboost是一种遵循加性模型的、损失函数为指数函数的、学习算法为前向分步算法的二分类集成学习算法。
Adaboost分类器的SCIKIT-LEARN实现
前文讲解随机森林时已统一作了API的介绍,这里不再赘述,直接展示Adaboost分类器的文档解释:
AdaBoostClassifier(
base_estimator= None ,
* ,
n_estimators= 50 ,
learning_rate= 1.0 ,
algorithm= 'SAMME.R' ,
random_state= None ,
)
其中关键参数的含义为:
base_estimator
:指定基学习器;
n_estimators
:boosting(提升)过程被终止的最大的基学习器数量;
learning_rate
:boosting(提升)的学习率,表示梯度收敛速度,默认为1;
如果该值过大,容易错过最优值;
如果该值过小,则收敛速度会很慢;
该值需要和n_estimators
进行一个权衡:当分类器迭代次数较少时,学习率可以小一些,当迭代次数较多时,学习率可以适当放大;
algorithm
:指定boosting(提升)算法;
下述为Adaboost的sklearn基本实现流程:
第一步,先导入包和模块:
import numpy as np
import pandas as pd
from sklearn. datasets import load_iris
from sklearn. ensemble import AdaBoostClassifier
from sklearn. tree import DecisionTreeClassifier
from sklearn. model_selection import train_test_split
from sklearn. metrics import accuracy_score
import matplotlib. pyplot as plt
% matplotlib inline
第二步,加载数据集,并完成数据集划分:
iris = load_iris( )
Xtrain, Xtest, Ytrain, Ytest = train_test_split( iris. data, iris. target, test_size = 0.3 )
第三步,定义弱分类器,这里采用的是CART分类决策树对象,并且评估其分类预测的准确率:
weakClassifier = DecisionTreeClassifier( max_depth = 5 ) . fit( Xtrain, Ytrain)
dtc_y_pred = weakClassifier. predict( Xtest)
print ( 'CART分类树预测的准确率:{}' . format ( accuracy_score( Ytest, dtc_y_pred) ) )
CART分类决策树的准确率:0.9333333333333333
第四步,构建Adaboost分类模型并完成训练,获取预测结果:
clf = AdaBoostClassifier(
base_estimator = weakClassifier,
algorithm = 'SAMME.R' ,
n_estimators = 300 ,
learning_rate = 0.4
) . fit( Xtrain, Ytrain)
clf_y_pred = clf. predict( Xtest)
print ( 'Adaboost自适应增强分类模型预测的准确率:{}' . format ( accuracy_score( Ytest, clf_y_pred) ) )
clf. feature_importances_
clf. estimator_weights_
Adaboost的准确率:0.9555555555555556
接下来绘制n_estimators超参数学习曲线观察该值对Adaboost整体性能的影响:
x = list ( range ( 2 , 20 , 2 ) )
y = [ ]
for i in x:
model = AdaBoostClassifier(
base_estimator= weakClassifier,
n_estimators= i,
learning_rate= 0.5 ,
algorithm= 'SAMME.R' ,
random_state= 1
) . fit( Xtrain, Ytrain)
y. append( accuracy_score( Ytest, model. predict( Xtest) ) )
plt. style. use( 'ggplot' )
plt. title( "Effect of n_estimators" , pad= 20 )
plt. xlabel( "Number of base estimators" )
plt. ylabel( "Test accuracy of AdaBoost" )
plt. plot( x, y)
plt. show( )
接下来绘制learning_rate学习率超参数学习曲线观察该值对Adaboost整体性能的影响:
x = [ 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 ]
y = [ ]
for i in x:
model = AdaBoostClassifier(
base_estimator= weakClassifier,
n_estimators= 50 ,
learning_rate= i,
algorithm= 'SAMME.R' ,
random_state= 1
) . fit( Xtrain, Ytrain)
y. append( accuracy_score( Ytest, model. predict( Xtest) ) )
plt. title( "Effect of learning_rate" , pad= 20 )
plt. xlabel( "Learning rate" )
plt. ylabel( "Test accuracy of AdaBoost" )
plt. plot( x, y)
plt. show( )
重要属性、方法、接口、参数
feature_importances_
:查看样本每个特征的权重;
[ * zip ( pd. DataFrame( Xtrain) . columns, clf. feature_importances_) ]
[ ( 0 , 0.11172974014002672 ) ,
( 1 , 0.17037184013571008 ) ,
( 2 , 0.3692624049702443 ) ,
( 3 , 0.3486360147540191 ) ]
estimator_weights_
:查看所有基学习器的权重;
clf. estimator_weights_
array( [ 3.13757867 , 1.97283824 , 2.60686223 , 2.31186429 , 1.82837079 ,
1.65777319 , 2.22170483 , 2.22343172 , 1.6475453 , 1.39016209 ,
1.53223984 , 2.05014314 , 2.04086687 , 2.15492762 , 2.31784063 ,
. . .
Adaboost回归器的SCIKIT-LEARN实现
第一步,导包:
import numpy as np
import pandas as pd
from sklearn. datasets import load_boston
from sklearn. ensemble import AdaBoostRegressor
from sklearn. model_selection import train_test_split
from sklearn. metrics import mean_squared_error
from sklearn. tree import DecisionTreeRegressor
import matplotlib. pyplot as plt
% matplotlib inline
第二步,加载以及划分数据集:
boston = load_boston( )
Xtrain, Xtest, Ytrain, Ytest = train_test_split( boston. data, boston. target, test_size = 0.3 )
第三步,构建单棵CART回归树对象:
clf = DecisionTreeRegressor( max_depth = 5 )
clf. fit( Xtrain, Ytrain)
y_pred = clf. predict( Xtest)
print ( "单棵回归树结果如下:" )
print ( "训练集分数:" , clf. score( Xtrain, Ytrain) )
print ( "验证集分数:" , clf. score( Xtest, Ytest) )
print ( "均方误差:" , mean_squared_error( Ytest, y_pred) )
第四步,构建Adaboost回归器对象,使用多棵回归树作为基学习器:
clf = AdaBoostRegressor( DecisionTreeRegressor( max_depth = 5 ) , n_estimators = 40 )
clf. fit( Xtrain, Ytrain)
y_pred = clf. predict( Xtest)
print ( "Adaboost回归学习器(多棵回归树)结果如下:" )
print ( "训练集分数:" , clf. score( Xtrain, Ytrain) )
print ( "验证集分数:" , clf. score( Xtest, Ytest) )
print ( "均方误差:" , mean_squared_error( Ytest, y_pred) )
总结
还有一个遗漏的问题没有说到:关于Adaboost中弱学习器的类型问题;理论上来说,任何学习器都可以用于Adaboost,但一般而言,使用最广泛的Adaboost弱学习器仍然是决策树和神经网络;
评论(0)