1 引言
目前集成学习主要分为两类,一是基学习器之间存在强依赖关系、其必须串行生成的序列化方法,二是基学习器之间没有非常强的依赖关系、可同时生成的并行化方法。前者代表的算法为Boosting,后者则为Bagging和“随机森林”(Random Forest),本文着重讲解有关Boosting算法的具体内容及算例分析。
2 Boosting
Boosting是指将一系列弱学习器经过某种组合的方法提升为强学习器的算法,其基本思路如下:先在原始数据上训练出一个弱学习器(也称基学习器),再根据生成的基学习器改变原始数据的分布,使得后续的训练可以进一步关注到该基学习器出错的样本集。继续在经过上述改变的数据上训练下一个基学习器,如此重复进行数据的改变和基学习器的训练,直到所训练好的基学习器组合后的学习器可以达到分类要求。而其中最具代表性的便是AdaBoost算法[1],下面将着重介绍该算法的具体原理以及实际运用。
图1:Boosting具体流程示意图
3 AdaBoost算法
3.1 加性模型
AdaBoost算法所使用的基于加性模型(additive model)的强学习器生成方法,所谓加性模型即是各基学习器的线性组合
其中,xx为输入数据,为模型参数,bm(x;γm)bm(x;γm)为关于xx的二分类器。而其中的{βm,γm}{βm,γm}参数是由所定义的损失函数所确定,其计算表达式如下:
在给定训练数据以及所定义的损失函数后,求解强分类器的问题便变成了优化(2)式右边使得总体的损失误差达到最小。考虑到我们所使用的模型为加性模型,那么从前至后,我们每一步只需要学习一个基函数以及其相应的系数。那么在模型参数的确定过程中便可以使用前向分布算法(forward stagewise algorithm)思想,每一步只需优化使得单步的损失函数达到最小即可。
3.2 损失函数
在这里我们使用指数损失函数(exponential loss function)[2]来进行上述的优化操作,其定义如下
所求得的强分类器f(x)f(x)需使得指数损失函数达到最小,考虑到式(4)对f(x)f(x)对偏导
令(5)式为0可得
故有
从上式便可以看出,若指数损失函数达到最小则分类错误率也将到达最小值。因此,由于指数损失函数具有更好的数学性质(例如是连续可微函数),我们将使用该损失函数代替0/1损失函数作为优化对象。
3.3 分类器参数更新
根据分类器的加性特征我们有
其中,βmβm为第mm个基分类器的加性系数,为第mm个基分类器的二分类阈值。
我们将指数损失函数代入式(3)并结合(8)式可得
上式即我们最终需要优化的表达式,可以发现对于数据在每一步的分类器上训练的分布不一样的,其都需要乘上相应的系数,即训练数据各自的权重。
我们定义第mm个训练器的训练数据各自权重如下
找出第m+1m+1个基训练器和第mm个基训练器训练数据权重的关系便可以对训练数据对于每一个基训练器的分布进行确定,其推导如下:
这里,为了满足权重的分布特点,我们引进一个规范化因子ZmZm
因此,得到最终的训练数据分布权重更新公式
接下来我们再考虑对基分类器加性系数的求解,将训练数据可分解为两个子集为{y(xi)=G(xi)}{y(xi)=G(xi)}和{y(xi)≠G(xi)}{y(xi)≠G(xi)},则对指数损失函数进行整理有
L(y,f(x))L(y,f(x))对βmβm进行求解偏导,并使其为0,可解得
式(15)即为各基分类器的加性系数的求解等式,而基分类器的确定是由式(16)达到最小所确定,
那么,最终AdaBoost算法所确定的基于诸多弱分类器加性为的强分类器为
这便是AdaBoost算法的整体推导过程以及流程。
4 AdaBoost算例[3]
(1)首先,初始化训练数据集权重分布
(2)在权重分布为D1D1的训练数据上,借助公式(16)使得其errmerrm达到最小可以确定此时的γ1γ1为2.5,故第一个基分类器为
G1(x)G1(x)在训练数据集上的误差率err1=0.3err1=0.3(式16),计算G1(x)G1(x)的系数β1=0.4236β1=0.4236(式15),那么即有
而分类器sign[f1(x)]sign[f1(x)]在训练数据集上有3个误分类点。
(3)对于m=2m=2,在权重分布为D2D2的训练数据上,阈值γ2γ2为8.5时分类误差率最低,第二个基分类器为
G2(x)G2(x)在训练数据集上的误差率err2=0.2143err2=0.2143,计算G2(x)G2(x)的系数β2=0.6496β2=0.6496,那么即有
而分类器sign[f2(x)]sign[f2(x)]在训练数据集上有3个误分类点。
(4)对于m=3m=3在权重分布为D_{3}的训练数据集上,阈值γ3γ3为5.5时分类误差率最低,第三个基分类器为
G3(x)G3(x)在训练数据集上的误差率err3=0.1820err3=0.1820,计算G3G3的系数β3=0.7514β3=0.7514,那么有
更新训练数据集的权重分布有
而分类器sign[f3(x)]sign[f3(x)]在训练数据集上的误分类点个数为0,那么最终得到的强分类器为
那么经过三个基分类器的加性组合得到一个强分类器,最终的分类结果从有三个分类误差点优化到分类器在训练数据集上误分类点个数为0.
5 AdaBoost算法
下面给出AdaBoost算法的具体流程
输入:训练数据集T={(x1,y1),(x2,y2),...,(xN,yN)}T={(x1,y1),(x2,y2),...,(xN,yN)},其中xi∈χ⊆Rnxi∈χ⊆Rn,yi∈Υ={−1,+1}yi∈Υ={−1,+1};
输出:最终的强分类器 f(x)f(x)
步骤1:初始化训练数据集的权重分布
步骤2:对于m=1,2,...,Mm=1,2,...,M
- 使用具有DmDm分布的训练数据集进行分类器学习,得到相应的基分类器Gm(x):χ→{−1,+1}(31)(31)Gm(x):χ→{−1,+1}
- 根据得到的基分类器计算相应的误差率(式16)和加性系数(式15)
- 更新到Dm+1Dm+1的权重分布(式12和式13)
步骤3:基分类器进行线性组合(式1)以及得到最终的强分类器(式18)
以上便是AdaBoost算法的具体流程,下面给出其算法框架[4]
输入:训练集T={(x1,y1),(x2,y2),...,(xN,yN)};T={(x1,y1),(x2,y2),...,(xN,yN)};
基训练器Gm(x)Gm(x)
训练次数M
过程:
1:D1=1ND1=1N
2:for m=1,2,…,M do
3:G^m=argmin∑Ni=1wmiI(y(xi)≠G(xi))G^m=argmin∑i=1NwimI(y(xi)≠G(xi))
4:errm=∑Ni=1wmi=1I(y(xi)≠G(xi))∑Niwmierrm=∑i=1Nwi=1mI(y(xi)≠G(xi))∑iNwim
5:if errm>0.5errm>0.5 then break;
6:βm=12ln(1−errmerrm)βm=12ln(1−errmerrm)
7:Zm=∑Ni=1wmie−βmy(xi)Gm(xi)Zm=∑i=1Nwime−βmy(xi)Gm(xi)
8:wm+1i=wmiZme−βmy(xi)Gm(xi)wim+1=wimZme−βmy(xi)Gm(xi)
9:end for
输出:f(x)=sign[∑Mm=1βmGm(x)]f(x)=sign[∑m=1MβmGm(x)]
6 算例代码
下面给出第5部分AdaBoost算例的matlab相应代码,值得注意的是虽然上述算例中经过计算得到基学习器的个数达到3个的时候误分类的个数为0,但是实际情况下并不确定基学习器个数是多少。因此,往往在实际应用当中是需要额外引入限制因素来保证代码的执行效率以及结果的利好性。
clc
clear all
%%
%--------------------------------------------------------------------------
%初始化
%--------------------------------------------------------------------------
%训练数据
data = [0:1:9;1,1,1,-1,-1,-1,1,1,1,-1];
%初始化权值
D(1,:) = 0.1 * ones(1,10);
%基学习器
f = @(t,x) (x < t) - (x > t);
%基学习器阈值集合
T = (min(data(1,:)) + 0.5):1:(max(data(1,:)) + 0.5);
%训练次数
N = 3;
%错误率
err_i = ones(N,length(T));
%基学习器阈值
t = zeros(1,N);
%基学习器权重
a = zeros(1,N);
%基学习器判决结果
result_b = zeros(N,length(data));
i = 1;
%组合后的学习器误分类的个数
err_classification = -1 * ones(1,N);
%%
%基学习器权重生成以及数据权重更新
while(err_classification(i) ~= 0)
f1 = @(t,w) w * [f(t,data(1,:)) ~= data(2,:);f(t,data(1,:)) == data(2,:)]';
err_i_cell_all(i,:) = arrayfun(@(x)f1(x,D(i,:)),T,'UniformOutput',0);
err_i_num_all(i,:) = cell2mat(err_i_cell_all(i,:));
[min_err(i),indx(i)] = min(err_i_num_all(i,:));
if min_err(i) > 0.5
break;
end
if rem(indx(i),2) == 0
Type_base(i) = 2;
else
Type_base(i) = 1;
end
indx(i) = ceil(indx(i) / 2);
t(i) = T(indx(i));
a(i) = 1 / 2 * log((1 - min_err(i)) / min_err(i));
result_b(i,:) = f(t(i),data(1,:));
z = D(i,:) * (exp(-a(i) .* data(2,:) .* result_b(i,:)))';
D(i+1,:) = D(i,:) .* (exp(-a(i) .* data(2,:) .* result_b(i,:))) / z;
additive_learner = 0;
for j = 1:1:i
additive_learner = additive_learner + a(j) * f(t(j),data(1,:)) * (-1).^(Type_base(j) - 1);
end
result_additive_learner = sign(additive_learner);
err_classification(i) = length(find((result_additive_learner - data(2,:)) ~= 0));
i = i + 1;
end
[1] Yoav Freund, Robert E Schapire. A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting[M]// Computational Learning Theory. Springer Berlin Heidelberg, 1995:119-139.
[2] Friedman J, Hastie T, Tibshirani R. Special Invited Paper. Additive Logistic Regression: A Statistical View of Boosting[J]. Annals of Statistics, 2000, 28(2):337-374.
[3] 李航. 统计学习方法[M]. 北京:清华大学出版社, 2012. 140-142
[4] 周志华. 机器学习[M]. 北京:清华大学出版社, 2016. 174
本文详细介绍了AdaBoost算法,一种Boosting方法,用于将弱学习器提升为强学习器。通过加性模型、指数损失函数和分类器参数更新来构建强分类器。文章还提供了一个算法流程,并给出了MATLAB实现的代码示例。
916

被折叠的 条评论
为什么被折叠?



