Boosting
Boosting 是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
提升方法是一种常用的统计学习方法,应用十分广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。提升算法基于这样一种思路:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。
Boosting族算法最著名的代表是AdaBoost [Freund and Schapire, 1997]
对于提升算法boosting来说,有两个问题需要求解:
一是在每一轮如何改变训练数据的权重分布;
二是如何将弱分类器组合成为一个强分类器。
AdaBoost
AdaBoost,是英文”Adaptive Boosting”(自适应增强)的缩写
对于上述两问题,AdaBoost算法的做法是:
1、提高那些被前一轮弱分类器错误分类样本的权重,而降低那些被正确分类样本的权值。
2、采用加权多数表决的方法。具体的,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差大的弱分类器的权值,使其在表决中起较小的作用。
另外,同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
具体来说,整个算法就三步:
初始化训练数据的权值分布:如果有N个样本,则每一个训练样本最开始时都被赋予相同的权重:1/N。
训练弱分类器:具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权重就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。然后,权重更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
将各个训练得到的弱分类器组合成强分类器:各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
Adaboost的算法流程
输入:训练数据集
T=(x1,y1),(x2,y2),...(xN,yN)
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
N
,
y
N
)
,
其中
xi∈χ,χ⊆Rn,yi∈Y,Y=
x
i
∈
χ
,
χ
⊆
R
n
,
y
i
∈
Y
,
Y
=
{−1,+1};
步骤1——首先,初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权重:1/N。
步骤2——进行多轮迭代,用m = 1,2, …, M表示迭代的第多少轮
(a) 使用具有权值分布
Dm
D
m
的训练数据集学习,得到基本分类器
(b) 计算
Gm(x)
G
m
(
x
)
在训练集上的分类误差率:
注:这里的 I(Gm(xi)≠yi)) I ( G m ( x i ) ≠ y i ) ) 中,不等,函数值 I I 为1,相等则函数值为0.
(c) 计算的系数,
αm
α
m
表示
Gm(x)
G
m
(
x
)
在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重):
由上述式子可知, em<=1/2 e m <= 1 / 2 时, αm>=0 α m >= 0 ,且 αm α m 随着 em e m 的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。
(d) 更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代
使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“聚焦于”那些较难分的样本上。
其中,
Zm
Z
m
是规范化因子,使得
Dm+1
D
m
+
1
成为一个概率分布:
步骤3——组合各个弱分类器
从而得到最终分类器,如下:
举例说明
我们拿《统计学习方法》中的一个例子来实际看看原理吧:
给定训练数据如下图所示,假设弱分类器由
x<v
x
<
v
或
x>v
x
>
v
产生,其阈值v使该分类器在训练数据上分类误差率最低。试用AdaBoost算法学习一个强分类器。
解:
1、初始化数据权重分布:
Dm=(wm1,wm2,...,wm10),即:D1=(w11,w12,...,w110) D m = ( w m 1 , w m 2 , . . . , w m 10 ) , 即 : D 1 = ( w 11 , w 12 , . . . , w 110 )
- a,用下面的方式从v=1.5遍历到v=9.5
for( v=1.5;v<=9.5; v++)
{
if(x < v)
G1(x)=1;
else if (x > v)
G1(x) = -1;
}
- 统计v取各个值使得误差率(误差率的计算方法是:所有误分类点的权值之和)。
然后发现,当v取2.5时,误分类点为x=6, 7, 8,其权值和为0.3,误差率最低,此时,当前弱分类器为:
- b,
G1(x)
G
1
(
x
)
在训练数据集上的误差率
e1=P(G1(xi)!=yi)=0.3 e 1 = P ( G 1 ( x i ) ! = y i ) = 0.3
- c,由公式计算出
α1=12log1−e1e1=0.4236 α 1 = 1 2 l o g 1 − e 1 e 1 = 0.4236
- d,更新训练数据的权值分布:
D2=(w21,w22,...,w210) D 2 = ( w 21 , w 22 , . . . , w 210 )w2i=w1iZ1exp(−α1yiG1(xi)),i=1,2,...,10 w 2 i = w 1 i Z 1 e x p ( − α 1 y i G 1 ( x i ) ) , i = 1 , 2 , . . . , 10D2=(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 )f1(x)=0.4236G1(x) f 1 ( x ) = 0.4236 G 1 ( x )
2、m=2,
- a,做和上一步同上的操作。发现在权值分布为D2的训练数据上,v = 8.5时误差率最低,此时:当前弱分类器为:
- b,误差率是
e2=0.2143 e 2 = 0.2143
- c,计算
α2=0.6496 α 2 = 0.6496
- d,更新训练数据权值分布:
D3=(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 )f2(x)=0.4236G1(x)+0.6496G2(x) f 2 ( x ) = 0.4236 G 1 ( x ) + 0.6496 G 2 ( x )分类器 sign[f2(x)] s i g n [ f 2 ( x ) ] 在训练数据集上有3个误分类点。
3、m=3,
a、在权值分布为 D3 D 3 的训练数据上,v =5.5时分类误差率最低,此时的弱分类器为:
-b, G3(x) G 3 ( x ) 在训练样本上的误差率为
e3=0.1820 e 3 = 0.1820
-c, α3=0.7514 α 3 = 0.7514
-d,更新权值分布:D4=(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 )f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x) f 3 ( x ) = 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) + 0.7514 G 3 ( x )
分类器 sign[f3(x)] s i g n [ f 3 ( x ) ] 在训练数据集上的误分类点个数为0.
于是最终分类器为:
查看总分类器误分类点个数的方法:
【参考自博客 https://blog.csdn.net/xueyingxue001/article/details/51304430】
假设有一个分类器,其有5个元素,其正确的分类结果是:
然后:
- 权值初始为:
D:[[0.20.20.20.20.2]] D : [ [ 0.2 0.2 0.2 0.2 0.2 ] ]
- 经过一次计算:
alpha:0.69314718056 a l p h a : 0.69314718056分类结果:classEst:[[−1.1.−1.−1.1.]] 分 类 结 果 : c l a s s E s t : [ [ − 1. 1. − 1. − 1. 1. ] ]
- 这时就算一下:
aggClassEst+=alpha∗classEst a g g C l a s s E s t + = a l p h a ∗ c l a s s E s taggClassEst:[[−0.693147180.69314718−0.69314718−0.693147180.69314718]] a g g C l a s s E s t : [ [ − 0.69314718 0.69314718 − 0.69314718 − 0.69314718 0.69314718 ] ]
- 对比 aggClassEst a g g C l a s s E s t 和正确分类的正负号相同位置元素的正负号是否一致,如:这里 addClassEst a d d C l a s s E s t 的正负号从前向后依次是: −,+,−,−,+ − , + , − , − , + ,而正确分类的正负号依次是: +,+,−,−,+ + , + , − , − , + ,所以当前有1个被错误分类。
- 重复上面4步,直到第4步的对比完全一致或者达到循环次数上限。