前面两节课我们介绍了AdaBoost。 接下来我们介绍对多个弱分类器独立进行学习的Bagging学习法和随机森林。
1 Bagging
想要得到泛化能力强的集成,集成中的个体学习器应尽可能相互独立,而在现实任务中无法做到,但是可以使基学习器尽可能产生较大差异。给定一个数据集,一种可能的做法就是对训练样本进行采样产生出若干个子集,然后每个子集训练出一个基学习器。
Bagging基于“自助采样法”, 给定一个包含m个样本的数据集,我们先随机选取一个样本放入采样集中,再把该样本放入初始的数据集,使得下次采样时该样本仍有可能被采集到,这样经过m次随机操作我们得到了m个样本的采样集。初始训练集中有的样本多次出现,有的从未出现。照这样我们采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些学习器结合起来。在对预测输出进行结合时, Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。
分类任务伪代码: Dbs 是自助采样产生的样本分布。
输入:训练集D=(x1,y1),(x2,y2),⋯,(xm,ym) 基学习算法A 训练轮数 T
过程:
1:for t = 1,2….T do
2: - - - ht=A(D,Dbs)
3:end for
输出:H(x)=argmaxy∈γ∑Tt=1I(ht(x)=y)
自助采样法 只有63.2%的样本被采用,那么剩余的36.8%的样本可以用来进行测试(包外估计),事实上,包外估计还有其他用途: 如基学习器是决策树时,可使用包外样本来辅助剪枝;如果基学习器是神经网络时,包外样本可以用来辅助早期停止以减小过拟合风险。
clc;clear;close all;
%%Creat Samples%
n = 50;
x = randn(n, 2); % 产生n*2的矩阵
y =2 * (x(:,1)>x(:,2)) - 1 ; %产生 1 -1 标签
T = 5000;
Y = zeros(50, 50);
X0 = linspace(-3,3,50);
[X(:,:,1) X(:,:,2)] = meshgrid(X0);
%%剪枝分类器--基分类器%
for i=1:T
db = ceil(2*rand);
r = ceil(n*rand(n,1)); % n*1矩阵 (0-n的整数)
% 自助采样
xb = x(r,:); % 随机选取一行组合作为样本,(n*2)
yb = y(r); % 标签 (n*1)
[xs, xi] = sort(xb(:,db));
el = cumsum(yb(xi));
eu = cumsum(yb(xi(end:-1:1)));
e = eu(end-1:-1:1) - el(1:end-1);
[em,ei] = max(abs(e));
c = mean(xs(ei:ei+1)); %阈值
s = sign(e(ei));
Y = Y + sign(s*(X(:,:,db)-c))/T;
end
figure(1);clf;hold on; axis([-3 3 -3 3]);
colormap([1 0.7 1; 0.7 1 1]);
contourf(X0,X0,sign(Y));
plot(x(y==1,1),x(y==1,2),'bo');
plot(x(y==-1,1),x(y==-1,2),'rx');
2 随机森林
随机森林是Bagging的变体,RF在以决策树为基学习器构建Bagging的基础上,进一步在决策树的训练过程中引入了随机属性选择。
具体过程:传统的决策树在选择划分属性时是在当前节点属性集合(假设有d个属性)中选择一个最佳的属性,而在随机森林中,对基决策树的每一个节点,先从该节点的属性集合中随机选择包含k个属性的子集。然后再从这个子集中选择一个最优的属性用于划分。 其中k控制了随机性的引入程度,k=d:传统决策树,k=1:随机选择一个属性用于划分。一般的,推荐 k=log2(d)
2007

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



