集成学习
集成学习的概念
123
1. AdaBoost简介
Boosting, 也称为增强学习或提升法,是一种重要的集成学习技术, 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况下,为学习算法的设计提供了一种有效的新思路和新方法。从某种程度上来说,Boosting并不是某一种学习算法,而是一种框架。
AdaBoost是英文"Adaptive Boosting"(自适应增强)的缩写,它的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。
AdaBoost 算法的基本步骤:
- 首先,是初始化训练数据的权值分布 D 1 D_{1} D1。假设有 N N N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值: w 1 = 1 N w_{1}=\frac{1}{N} w1=N1。
- 然后,训练弱分类器 h i h_{i} hi。具体训练过程中是:如果某个训练样本点,被弱分类器 h i h_{i} hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
- 最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
2. 针对二分类问题的AdaBoost算法实现过程
相关符号定义:
- D t ( i ) D_{t}(i) Dt(i):训练样本集的权值分布;
- w i w_{i} wi:每个训练样本的权值大小;
- h h h:弱分类器;
- H H H:基本分类器;
- H f H_{f} Hf:最终的分类器;
- e e e:误差率;
- α t \alpha_{t} αt:弱分类器的权重
给定训练数据集: ( x 1 , y 1 ) , ⋯   , ( x N , y N ) (x_{1},y_{1}),\cdots,(x_{N},y_{N}) (x1,y1),⋯,(xN,yN),其中 y i ∈ { 1 , − 1 } y_{i}\in \{1,-1\} yi∈{1,−1}。用于表示训练样本的类别标签。Adaboost 的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。
2.1 算法流程
- 首先,初始化训练数据的权重分布。每一个训练样本最开始时都被赋予相同的权值:
w
i
=
1
N
w_{i}=\frac{1}{N}
wi=N1,这样训练样本集的初始权重分布
D
1
(
i
)
D_{1}(i)
D1(i):
D 1 ( i ) = ( w 1 , w 2 , ⋯   , w N ) = ( 1 N , ⋯   , 1 N ) D_{1}(i)=(w_{1},w_{2},\cdots,w_{N})=(\frac{1}{N},\cdots,\frac{1}{N}) D1(i)=(w1,w2,⋯,wN)=(N1,⋯,N1) - 迭代
T
T
T次以获得样本权值:
- 选取一个当前误差率最低的弱分类器
h
h
h作为第
t
t
t个基本分类器
H
t
H_{t}
Ht,并计算弱分类器
h
t
:
X
→
{
−
1
,
1
}
h_{t}:X\rightarrow \{-1,1\}
ht:X→{−1,1},该弱分类器在分布
D
t
D_{t}
Dt上的误差为:
e t = P ( H t ( x i ) ≠ y i ) = ∑ i = 1 N w t i I ( H t ( x i ) ≠ y i ) e_{t}=P(H_{t}(x_{i}) \neq y_{i})=\sum\limits_{i=1}^{N}w_{ti}I(H_{t}(x_{i})\neq y_{i}) et=P(Ht(xi)̸=yi)=i=1∑NwtiI(Ht(xi)̸=yi)
(可知 H t ( x ) H_{t}(x) Ht(x)在 训练数据集上的误差率 e t e_{t} et就是被 H t ( x ) H_{t}(x) Ht(x)误分类样本的权值之和) - 计算该弱分类器在最终分类器中所占的权重(弱分类器权重用
α
\alpha
α表示):
α t = 1 2 l n ( 1 − e t e t ) \alpha_{t}=\frac{1}{2}ln(\frac{1-e_{t}}{e_{t}}) αt=21ln(et1−et) - 更新训练样本的权值分布
D
t
−
1
D_{t-1}
Dt−1:
D t + 1 = D t ( i ) e x p ( − α t y i H t ( x i ) ) Z t D_{t+1}=\frac{D_{t}(i)exp(-\alpha_{t}y_{i}H_{t}(x_{i}))}{Z_{t}} Dt+1=ZtDt(i)exp(−αtyiHt(xi))
其中 Z t Z_{t} Zt为归一化常数 Z t = 2 e t ( 1 − e t ) Z_{t}=2\sqrt{e_{t}(1-e_{t})} Zt=2et(1−et)
- 选取一个当前误差率最低的弱分类器
h
h
h作为第
t
t
t个基本分类器
H
t
H_{t}
Ht,并计算弱分类器
h
t
:
X
→
{
−
1
,
1
}
h_{t}:X\rightarrow \{-1,1\}
ht:X→{−1,1},该弱分类器在分布
D
t
D_{t}
Dt上的误差为:
- 最后,按弱分类器权重
α
t
\alpha_{t}
αt组合各个弱分类器,即:
f ( x ) = ∑ t = 1 T α t H t ( x ) f(x)=\sum\limits_{t=1}^{T}\alpha_{t}H_{t}(x) f(x)=t=1∑TαtHt(x)
通过符号函数 s i g n sign sign的作用,得到一个强分类器为:
H f = s i g n ( f ( x ) ) = s i g n ( ∑ t = 1 T α t H t ( x ) ) H_{f}=sign(f(x))=sign(\sum\limits_{t=1}^{T}\alpha_{t}H_{t}(x)) Hf=sign(f(x))=sign(t=1∑TαtHt(x))
注:
因为权重更新依赖于 α \alpha α,而 α \alpha α又依赖于误差率 e e e,所以我们可以直接将权值更新公式用 e e e表示。样本权值更新公式: D t + 1 = D t ( i ) e x p ( − α t y i H t ( x i ) ) Z t D_{t+1}=\frac{D_{t}(i)exp(-\alpha_{t}y_{i}H_{t}(x_{i}))}{Z_{t}} Dt+1=ZtDt(i)exp(−αtyiHt(xi)),其中 Z t = 2 e t ( 1 − e t ) Z_{t}=2\sqrt{e_{t}(1-e_{t})} Zt=2et(1−et) - 当样本分错时,
y
i
H
t
(
x
i
)
=
−
1
y_{i}H_{t}(x_{i})=-1
yiHt(xi)=−1
D t + 1 ( i ) = D t ( i ) Z t e x p ( α 1 ) = D t ( i ) Z t e x p ( 1 2 l n ( 1 − e t e t ) ) = D t ( i ) Z t 1 − e t e t = D t ( i ) 2 e t ( 1 − e t ) 1 − e t e t = D t ( i ) 2 e t D_{t+1}(i)=\frac{D_{t}(i)}{Z_{t}}exp(\alpha_{1})=\frac{D_{t}(i)}{Z_{t}}exp(\frac{1}{2}ln(\frac{1-e_{t}}{e_{t}}))=\frac{D_{t}(i)}{Z_{t}}\sqrt{\frac{1-e_{t}}{e_{t}}}\\=\frac{D_{t}(i)}{2\sqrt{e_{t}(1-e_{t})}}\sqrt{\frac{1-e_{t}}{e_{t}}}=\frac{D_{t}(i)}{2e_{t}} Dt+1(i)=ZtDt(i)exp(α1)=ZtDt(i)exp(21ln(et1−et))=ZtDt(i)et1−et=2et(1−et)Dt(i)et1−et=2etDt(i) - 当样本分对时,
y
i
H
t
(
x
i
)
=
1
y_{i}H_{t}(x_{i})=1
yiHt(xi)=1
D t + 1 ( i ) = D t ( i ) Z t e x p ( − α 1 ) = D t ( i ) Z t e x p ( − 1 2 l n ( 1 − e t e t ) ) = D t ( i ) Z t e t 1 − e t = D t ( i ) 2 e t ( 1 − e t ) e t 1 − e t = D t ( i ) 2 ( 1 − e t ) D_{t+1}(i)=\frac{D_{t}(i)}{Z_{t}}exp(-\alpha_{1})=\frac{D_{t}(i)}{Z_{t}}exp(-\frac{1}{2}ln(\frac{1-e_{t}}{e_{t}}))=\frac{D_{t}(i)}{Z_{t}}\sqrt{\frac{e_{t}}{1-e_{t}}}\\=\frac{D_{t}(i)}{2\sqrt{e_{t}(1-e_{t})}}\sqrt{\frac{e_{t}}{1-e_{t}}}=\frac{D_{t}(i)}{2(1-e_{t})} Dt+1(i)=ZtDt(i)exp(−α1)=ZtDt(i)exp(−21ln(et1−et))=ZtDt(i)1−etet=2et(1−et)Dt(i)1−etet=2(1−et)Dt(i)
Z t = ∑ i D t ( i ) e x p ( − α t y i h t ( x i ) ) = ∑ y i ≠ h t ( x i ) D t ( i ) e x p ( α t ) + ∑ y i = h t ( x i ) D t ( i ) e x p ( − α t ) = e t e α t + ( 1 − e t ) e − α t = 2 e t ( 1 − e t ) Z_{t}=\sum\limits_{i}D_{t}(i)exp(-\alpha_{t}y_{i}h_{t}(x_{i})) =\sum\limits_{y_{i}\neq h_{t}(x_{i})}D_{t}(i)exp(\alpha_{t})+\sum\limits_{y_{i}= h_{t}(x_{i})}D_{t}(i)exp(-\alpha_{t})\\=e_{t}e^{\alpha_{t}}+(1-e_{t})e^{-\alpha_{t}}=2\sqrt{e_{t}(1-e_{t})} Zt=i∑Dt(i)exp(−αtyiht(xi))=yi̸=ht(xi)∑Dt(i)exp(αt)+yi=ht(xi)∑Dt(i)exp(−αt)=eteαt+(1−et)e−αt=2et(1−et)
3. 对 AdaBoost 提升方法来说,在每一轮如何改变训练数据的权值或概率分布?
提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。采取这种操作可以使那些没有得到准确分类的数据由于其权值的加大而受到后一轮的弱分类器的更多关注。
4. AdaBoost 如何将弱分类器组合成一个强分类器?
采取加权多数表决的方法。加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
5. Boosting 和 Bagging (Bootstrap aggregating) 的区别?
1)样本选择上
Bagging \textbf{Bagging} Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting \textbf{Boosting} Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重
Bagging \textbf{Bagging} Bagging:使用均匀取样,每个样例的权重相等
Boosting \textbf{Boosting} Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数
Bagging \textbf{Bagging} Bagging:所有预测函数的权重相等。
Boosting \textbf{Boosting} Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
3)并行计算
Bagging \textbf{Bagging} Bagging:各个预测函数可以并行生成
Boosting \textbf{Boosting} Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
这两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果,将不同的分类算法套入到此类算法框架中一定程度上会提高了原单一分类器的分类效果,但是也增大了计算量。下面是将决策树与这些算法框架进行结合所得到的新的算法:
- Bagging + 决策树 = 随机森林
- AdaBoost + 决策树 = 提升树
- Gradient Boosting + 决策树 = GBDT
6. 实例求解
给定如表所示的训练样本,弱分类器采用平行于坐标轴的直线,用AdaBoost算法实现强分类过程:
样本序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
样本点 X X X | (1,5) | (2,2) | (3,1) | (4,6) | (6,6) | (6,8) | (7,9) | (8,8) | (9,9) | (10,2) |
类别 Y Y Y | 1 | 1 | -1 | -1 | 1 | -1 | 1 | 1 | -1 | -1 |
6.1 MATLAB程序
function kind = wcH1(X,entroy)
%h1弱分类器
X1=X(1);
X2=X(2);
if X1<entroy
kind=1;
else
kind=-1;
end
end
function kind = wcH2(X,entroy)
%h2弱分类器
X1=X(1);
X2=X(2);
if X1<entroy
kind=1;
else
kind=-1;
end
end
function kind = wcH3(X,entroy)
%h3弱分类器
X1=X(1);
X2=X(2);
if X2<entroy
kind=-1;
else
kind=1;
end
end
clc,clear all;
%% 训练样本数据
xData=[1 5;2 2;3 1;4 6;6 6;6 8;7 9;8 8;9 9;10 2] %样本数据点,对应编号为1,2,...10
Y=[1 1 -1 -1 1 -1 1 1 -1 -1]'; %对应的样本类别,用1和-1表示
xNum=1:10; %编号
format rat
%% 绘制样本分布图
L1=find(Y==1);
x=xData(L1,1);y=xData(L1,2);
plot(x,y,'b+','LineWidth',3,'MarkerSize',12);
hold on;
L2=find(Y==-1);
x=xData(L2,1);y=xData(L2,2);
plot(x,y,'ro','LineWidth',3,'MarkerSize',12);
xlabel('X1');ylabel('X2');axis([0 10 0 10])
%% ***********************************初试过程************************************
H1=zeros(10,1);H2=H1;H3=H1
for i=1:10
X=xData(i,:);
H1(i) = wcH1( X,2.5 );%弱分类器h1
H2(i) = wcH2( X,8.5 );%弱分类器h2
H3(i) = wcH3( X,6.5 );%弱分类器h3
end
errDataH1=find(H1~=Y);%找到被h1错分的样本点的序号
errDataH2=find(H2~=Y);%找到被h2错分的样本点的序号
errDataH3=find(H3~=Y);%找到被h3错分的样本点的序号
accDataH1=find(H1==Y);%找到被h1正确分的样本点的序号
accDataH2=find(H2==Y);%找到被h2正确分的样本点的序号
accDataH3=find(H3==Y);%找到被h3正确分的样本点的序号
errDataAll=[errDataH1,errDataH2,errDataH3];
accDataAll=[accDataH1,accDataH2,accDataH3];
N=10;
D1=zeros(10,1)+1/N % 初始化权值分布
%% ***********************************第一次迭代***********************************
err1=sum(D1(errDataH1,:));%所有被错分类的样本点的权值之和即为误差率
err2=sum(D1(errDataH2,:));%所有被错分类的样本点的权值之和即为误差率
err3=sum(D1(errDataH3,:));%所有被错分类的样本点的权值之和即为误差率
errAll=[err1,err2,err3];
[minErr,minIndex]=min(errAll);
%根据误差率e1计算H1的系数:
a1=0.5*log((1-minErr)/minErr)
minErrData=errDataAll(:,minIndex);
minAccData=accDataAll(:,minIndex);
D2=D1;
for i=minAccData'
D2(i)=D2(i)/(2*(1-minErr));
end
for i=minErrData'
D2(i)=D2(i)/(2*minErr);
end
D2
%分类函数
f1=a1.*H1;
kindFinal=sign(f1)%此时强分类器的分类结果
%% ***********************************第二次迭代***********************************
err1=sum(D2(errDataH1,:));%所有被错分类的样本点的权值之和即为误差率
err2=sum(D2(errDataH2,:));%所有被错分类的样本点的权值之和即为误差率
err3=sum(D2(errDataH3,:));%所有被错分类的样本点的权值之和即为误差率
errAll=[err1,err2,err3];
[minErr,minIndex]=min(errAll);
% 根据误差率e2计算H2的系数:
a2=0.5*log((1-minErr)/minErr)
minErrData=errDataAll(:,minIndex);
minAccData=accDataAll(:,minIndex);
D3=D2;
for i=minAccData'
D3(i)=D3(i)/(2*(1-minErr));
end
for i=minErrData'
D3(i)=D3(i)/(2*minErr);
end
D3
% 分类函数
f2=a1.*H1+a2*H2;
kindFinal=sign(f2)%此时强分类器的分类结果
%% ***********************************第三次迭代***********************************
err1=sum(D3(errDataH1,:));%所有被错分类的样本点的权值之和即为误差率
err2=sum(D3(errDataH2,:));%所有被错分类的样本点的权值之和即为误差率
err3=sum(D3(errDataH3,:));%所有被错分类的样本点的权值之和即为误差率
errAll=[err1,err2,err3];
[minErr,minIndex]=min(errAll);
% 根据误差率e3计算G3的系数:
a3=0.5*log((1-minErr)/minErr)
minErrData=errDataAll(:,minIndex);
minAccData=accDataAll(:,minIndex);
D4=D3;
for i=minAccData'
D4(i)=D4(i)/(2*(1-minErr));
end
for i=minErrData'
D4(i)=D4(i)/(2*minErr);
end
D4
% 分类函数
f3=a1.*H1+a2*H2+a3*H3;
kindFinal=sign(f3)%此时强分类器的分类结果
7. AdaBoost优缺点
7.1 优点
-
Adaboost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选。
-
Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,Adaboost都能显著的提高学习精度。
-
Adaboost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。
-
Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。
7.2 缺点
- 在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰。此外,Adaboost依赖于弱分类器,而弱分类器的训练时间往往很长。