手撕系列-AdaBoost
简介:
上次我们介绍过Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
本次将通过一个简单示例,手撕拆解Adaboost的计算过程。本次是手撕模型系列第一篇,各位看官若有想了解的算法模型,欢迎留言,后续会根据个人能力安排!
一. 初始化阶段
给定下列的训练样本,使用AdaBoost算法学习得到一个强分类器。
|
序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
初始化训练数据的权值分布,令每个权值W1i = 1/N = 0.1,其中,N = 10,i = 1,2, ..., 10,然后分别对于m = 1,2,3, ...等值进行迭代。
随机设定这10个数据的训练样本后,根据X和Y的对应关系,要把这10个数据分为两类,一类是“Y=1”,一类是“Y=-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-3之间(2.5)、5-6之间(5.5)、8-9(8.5)之间将那几类数据分成两类。下面实际计算下这个过程。
二. 迭代计算
第一次迭代m=1,在权值分布为D1(10个数据,每个数据的权值皆初始化为0.1)的训练数据上。
|
序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
|
D1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
经过计算上面样本可得:
a.阈值v取2.5时误差率为0.3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.3);
b.阈值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);
c.阈值v取8.5时误差率为0.3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.3)。
所以无论阈值v取2.5,还是8.5,总得分错3个样本,故可任取其中任意一个如2.5,设定成第一个基本分类器为:

上面说阈值v取2.5时则6 7 8分错,所以误差率为0.3,更加详细的解释是:因为样本集中X={0,1,2}对应的类Y=1,因它们本身都小于2.5,所以被G1(x)分在了相应的类“1”中,分对了。X={3,4,5}本身对应的类Y=-1,因它们本身都大于2.5,所以被G1(x)分在了相应的类“-1”中,分对了。但X={6,7,8}本身对应类Y=1,却因它们本身大于2.5而被G1(x)分在了类"-1"中,所以这3个样本被分错了。X=9本身对应的类Y=-1因它本身大于2.5,所以被G1(x)分在了相应的类“-1”中,分对了。
然后根据误差率e1计算G1的系数:

根据误差e1=0.3计算系数α1=0.4236。这个α1代表G1(x)在最终的分类函数中所占的权重为0.4236。
接着更新训练数据的权值分布,用于下一轮迭代:

由权值更新的公式可知,每个样本的新权值是变大还是变小,取决于它是被分错还是被分正确。即如果某个样本被分错了,则yi * Gm(xi)为负,负负等正,结果使得整个式子变大(样本权值变大),否则变小。
|
序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
|
D1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
|
D2 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.1666 |
0.1666 |
0.1666 |
0.0715 |
分类函数f1(x)= α1*G1(x) = 0.4236G1(x)。此时,得到的第一个基本分类器sign(f1(x))在训练数据集上有3个误分类点(即6 7 8)。从上述第一轮的整个迭代过程可以看出:被误分类样本的权值之和影响误差率,误差率影响基本分类器在最终分类器中所占的权重。
第二次迭代m=2,权值分布为D2
经过计算上面样本可得:
a.阈值v取2.5时误差率为0.1666*3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.1666*3);
b.阈值v取5.5时误差率最低为0.0715*4(x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.0715*3 + 0.0715);
c.阈值v取8.5时误差率为0.0715*3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.0715*3)。
所以,阈值v取8.5时误差率最低,故第二个基本分类器为:

很明显,G2(x)把样本“3 4 5”分错了,根据D2可知它们的权值为0.0715,所以G2(x)在训练数据集上的误差率e2=P(G2(xi)≠yi)=0.0715*3=0.2143。
根据误差e2=0.2143计算系数α2=0.6496。这个α2代表G2(x)在最终的分类函数中所占的权重为0.6496。
更新训练数据的权值分布:
|
序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
|
D1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
|
D2 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.1666 |
0.1666 |
0.1666 |
0.0715 |
|
D3 |
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)
此时,得到的第二个基本分类器sign(f2(x))在训练数据集上有3个误分类点(即3 4 5)。
第三次迭代m=3,权值分布为D3
经过计算上面样本可得:
a.阈值v取2.5时误差率为0.1060*3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.1060*3);
b.阈值v取5.5时误差率最低为0.0455*4(x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.0455*3 + 0.0715);
c.阈值v取8.5时误差率为0.1667*3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.1667*3)。
所以,阈值v取5.5时误差率最低,故第三个基本分类器为:

此时,G3误分类的样本是:0 1 2 9,这4个样本所对应的权值皆为0.0455,所以G3(x)在训练数据集上的误差率e3= P(G3(xi)≠yi) = 0.0455*4 = 0.1820。
根据误差e2=0.1820计算系数α2=0.7514。这个α3代表G2(x)在最终的分类函数中所占的权重为0.7514。
|
序号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
|
D1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
|
D2 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.0715 |
0.1666 |
0.1666 |
0.1666 |
0.0715 |
|
D3 |
0.0455 |
0.0455 |
0.0455 |
0.1667 |
0.1667 |
0.1667 |
0.1060 |
0.1060 |
0.1060 |
0.0455 |
|
D2 |
0.1250 |
0.1250 |
0.1250 |
0.1020 |
0.1020 |
0.1020 |
0.0650 |
0.0650 |
0.0650 |
0.1250 |
f3(x)=0.4236G1(x) + 0.6496G2(x)+0.7514G3(x)
此时,得到的第三个基本分类器sign(f3(x))在训练数据集上有0个误分类点。至此,整个训练过程结束。
G(x)=sign[f3(x)]=sign[α1*G1(x)+α2*G2(x)+α3*G3(x)],将上面计算得到的α1、α2、α3各值代入G(x)中,得到最终的分类器为:G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]。
总结:
以上就是一个简单的计算示例,Aadboost算法具有较高的检测效率,且不容易出现过拟合现象。但是该算法在实现过程中为取得更高的检测精度则需要较大的训练样本集,在每次迭代过程中,训练一个弱分类器则对应该样本集中的每一个样本,每个样本具有很多特征,因此从庞大的特征中训练得到最优弱分类器的计算量增大。
浙公网安备 33010602011771号