基于Bagging采样下的集成学习模型.doc
《基于Bagging采样下的集成学习模型.doc》由会员分享,可在线阅读,更多相关《基于Bagging采样下的集成学习模型.doc(27页珍藏版)》请在冰豆网上搜索。
基于Bagging采样下的集成学习模型
信息与计算科学14-1班
摘要本文采用Bagging-并行化的个体学习器,即有放回地抽取训练样本集,每个基学习器只使用了初始训练集中约63.2%的样本,剩下的约36.8%的样本可用作验证集来对泛化性能进行包外估计(out-of-bagestimate)。
采用libsvm方法得到个体学习器的泛化误差及强学习器的包外泛化误差及运行时间。
得到个体学习器的准确率及强学习器的包外误差,结论个体学习器良好,强学习器较差。
关键词集成学习、Bagging、泛化误差、svm支持向量机
一集成学习理论
1.1集成学习
集成学习(ensemblelearning)是通过构建并结合多个学习器来完成学习任务的,因此有写文章中也称其为多分类器系统(multi-classifiersystem)或者是委员会学习(committee-basedlearning)。
下图是集成学习的一般结构,将一组“个体学习器”(individuallearner)用一些何理的策略结合起来,这些个体学习器可以是各种弱分类器,例如决策树算法,BP神经网络等。
若所有的个体学习器是同种类型的,则称这样的集成是“同质”的(homogeneous),此时的学习器也可以称作是“基学习器”(baselearner),相应的学习算法则为“基学习算法”(baselearningalgorithm).若集成中的个体学习器包含不同的学习器,则称这样的集成为“异质”的(heterogenous),此时的个体学习器则被称为是“组件学习器”(componentlearner)也可以被直接称为个体学习器。
弱学习器:
指泛化性能略优于随机猜测的学习器;例如在二分类问题中精确度略高于50%的分类器。
1.2Bagging与随机森林学习方法
本文说明采用并行化的个体学习器生成方式,和上文的Boosting串行化要求个体学习器存在强依赖关系不同的是,该生成方式是基于个体学习器应尽可能相互独立。
独立的个体学习器可以得到泛化性能强的集成;当然现实中不存在绝对的独立,不过可以设法使基学习器尽可能具有较大差异。
一种方法就是对训练样本进行采样,产生出若干个不同的子集,再从每个数据集子集中训练出一个基学习器。
不过如果采样出的每个子集完全不同,那么每个基学习器只用到了部分训练数据,可能都无法进行有效学习。
因此,考虑使用相互有交叠的采样子集。
假定基学习器的计算复杂度为O(m),则Bagging的复杂度大致为T(O(m)+O(s)),因采样与投票/平均过程的复杂度O(s)很小,且T是一个不太大的常数(训练轮数),因此,训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶,可见Bagging是一个高效的集成学习算法。
与标准的AdaBoost算法只适用于二分类任务不同,Bagging能不经修改地用于多分类、回归等任务。
自助采样过程还给Bagging带来一个优点:
由于每个基学习器只使用了初始训练集中约63.2%的样本,剩下的约36.8%的样本可用作验证集来对泛化性能进行包外估计(out-of-bagestimate),为此需记录每个基学习器所使用的训练样本。
令Dt表示ht实际使用的训练样本集,令Hoob(x)表示对样本x的包外预测,即仅考虑哪些未使用x训练的基学习器在x上的预测,有:
则Bagging泛化误差的包外估值为:
事实上,包外样本还有其他用途,如当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理;当基学习器是神经网络时,可使用包外样本来辅助早起停止以减小过拟合风险。
从偏差-方差分解的角度看,Bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。
二个体学习器
2.1libsvm个体学习器
LIBSVM是台湾大学林智仁(LinChih-Jen)教授等2001年开发设计的一个简单,易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进,修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;
2.2执行参数
2.2.1svmtrain的用法
svmtrain我们在前面已经接触过,他主要实现对训练数据集的训练,并可以获得SVM模型.
用法:
svmtrain[options]training_set_file[model_file]
training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,文件中包括支持向量样本数,支持向量样本以及lagrange系数等必须的参数;该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名.
默认情况下,只需要给函数提供一个样本文件名就可以了,但为了能保存结果,还是要提供一个结果文件名,比如:
test.model,则命令为:
svmtraintest.txttest.model
2.2.2svmpredict 的用法
svmpredict是根据训练获得的模型,对数据集合进行预测.
用法:
svmpredict[options]test_filemodel_fileoutput_file
其中,options为操作参数,可用的选项即表示的涵义如下所示:
-bprobability_estimates:
是否需要进行概率估计预测,可选值为0或者1,默认值为0.
model_file:
是由svmtrain产生的模型文件;
test_file:
是要进行预测的数据文件,格式也要符合libsvm格式, 即使不知道label的值, 也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;
output_file:
是svmpredict的输出文件,表示预测的结果值.
2.2获取训练集
输出的bagging训练集及其他函数详见附录A
…
三测试
3.1个体学习器错误率
表3.1个体学习器错误率
学习器
1
2
3
4
5
6
7
8
9
10
错误率
0.34
0.355
0.313
0.319
0.343
0.33
0.288
0.365
0.27
0.299
时间
0.193
0.1617
0.1556
0.1189
0.1723
0.2281
0.1585
0.1579
0.2812
0.2245
3.2强学习器泛化误差
表3.2强学习器泛化误差
学习器
1
正确率
0.4414
0.3345
0.3621
0.3276
0.3448
0.3759
0.3759
0.3517
0.3172
0.3621
时间
0.0057
四分析
4.1结论分析
从表3.1中我们看到基学习器误差平均30%左右,学习结论良好。
从表3.2中我们看到个体学习器误差平均68%左右,泛化结论差。
附录A
A.1
matlab函数:
集成算法主函数:
function[PRE,out,accuracy,time]=MainUniStudy(T)
%out--强学习器的最终分类标签
%PRE--强学习器后的测试样本x的泛化误差
%T--基学习器的数量
[model,D,d,predict_label,accuracy]=InfoDealTest(T);
label=[];test=[];time=[]
tic;
fori=1:
T
Data=predict_label{1,i};
label=[label,Data(1:
290,1)];
%Y=[tabulate(x(i,:
))];%获得每一行数据出现频率的的统计
yuan=d{1,i};%取出随机后样本的数据的分类标签
test=[test,yuan(1:
290,1)];%预测标签最少的所有行
%Y=[tabulate(x(i,:
))];%获得每一行数据出现频率的的统计
end
[out]=ReturnMax(label);
out=out';%强学习器的最终label输出,,用的是投票方法
PRE=[];
forj=1:
T
check=test(:
j);
count=0;
fori=1:
size(out,1)
if(out(i,1)==check(i,1))
count=count+1;
end
end
rate=count/size(out,1);
PRE=[PRE,rate];
end
time=[time,toc];
数据处理函数:
function[model,D,d,predict_label,acc,time]=InfoDeal(T)
%data--所有的数据集[]
%rate--从数据集中取出的样本比率如0.8
%T--训练集的个数
load('data.mat');
[row,col]=size(data);
%total=round(row*rate);%选出的训练集个数
D=[];d=[];time=[];
fori=1:
T
%shunxu=randi((row-total),1);%顺序取连续样本的起点
%shunxu,(shunxu+total-1)
%number=row-total;%将样本重复取值增加为所有数据集个数
choose=randi(row,row,1);%随机重复取值
label=data(choose,19);
inst=data(choose,1:
18);
[m,n]=hist(choose,unique(choose));%对相同行的数据统计
n=n';
[rows]=Find(1:
row,n);
rows=rows';
label1=data(rows,19);
inst1=data(rows,1:
18);
tic;
model{i}=svmtrain(label,inst,'-s1-t0');
[predict_label{i},accuracy{i},e]=svmpredict(label1,inst1,model{i});
time=[time,toc];
D{i}=[label,inst];d{i}=[label1,inst1];
end
acc=[];
fori=1:
10
a=accuracy{1,i};
acc=[acc,0.01*(100-a(1,1))];
end
返回矩阵中每行出现最多的数据值:
function[out]=ReturnMax(Data)%返回矩阵中每行出现最多的数据值
forir=1:
size(Data,1)%行数
foric=1:
size(Data,2)%列数
temp(ic)=size(find(Data(ir,:
)==Data(ir,ic)),2);
end
[dataid]=max(temp,[],2);
out(ir)=Data(ir,id);