本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
Bagging(Bootstrap aggregating)算法又称为装袋算法,是机器学习中的一种集成学习算法
Bagging算法可各种分类、回归算法结合,既可以提高模型的准确率,又可以加强模型的泛化能力
本文讲解如何将Bagging算法与BP神经网络结合,提高BP神经网络的泛化能力和稳定性
本节介绍bagging集成算法是什么,以及它的训练方式与结果集成方式
什么是bagging集成学习
bagging是集成学习中的一种集成方式,最初由Leo Breiman于1996年提出,主要用于抵抗模型的过拟合
bagging简单来说,就是集成多个模型,通过模型的相互纠正与抵消,使得模型预测结果更准、泛化能力更好
bagging的算法流程如下:
👉1. 训练M个模型
👉2. 综合M个模型的预测结果作为最终预测结果
bagging算法只是一种集成算法框架,可以套用于各种模型,用于提升模型的泛化能力
bagging中最著名的是将决策树模型进行bagging集成,它就是众所周知的随机森林模型
bagging的模型训练
在Bagging集成算法中,M个模型的训练遵循以下两点指导原则:
👉1. 模型弱化
👉2. 模型多样化
模型弱化
训练的这M个模型,不需要每个模型都能预测得非常好,因为最终会相互取长补缺
因此,模型可以相对弱化一下,每个模型只需要能起到大概的预测效果就可以
弱化模型的常用手段如下:
1. 模型结构的弱化
例如在BP神经网络中,可以将网络层数、隐神经元数设少一些
2. 变量的弱化
每个模型可以只抽取部分变量进行建模,这使得每个模型的复杂度降低
由于最后共有M个模型,相对弱化的模型可以减少最终整体模型的复杂度、计算量
模型多样化
模型多样化是指每个模型的训练结果应该不一样,如果模型都是一样那就没有集成的意义了
模型差异化的常用手段如下:
1. 模型样本的差异化
bagging算法一般通过boostrap抽样来使样本差异化,达到每次训练的模型不一样
boostrap抽样指的是放回式抽样本,即整体样本有n个,则每次都在整体样本中抽样,抽n次得到n个样本
2. 模型超参数的差异化
不同的超参数,训练出来的模型结果就不一样,通过超参数的差异化,使得模型差异化
超参数可以是与模型结构相关的,例如BP神经网络中的隐层节点数、随机种子等等
超参数可以是与训练算法相关的,例如BP神经网络中的随机种子等等
3. 变量的差异化
在输入变量较多时,每个模型可以只抽取部分变量进行建模,通过变量的差异化也可以使模型差异化
bagging的模型结果集成方法
对于bagging集成算法,最终模型结果集成一般都是采用简单的集成方式,
对于模式识别问题,可以通过投票方式来集成所有模型的类别结果,作为集体模型的预测结果
对于数值预测问题,则一般采用求均值的方式集成所有模型的结果,作为集体模型的预测结果
由于bagging的最终目的是令模型的泛化能力增强,所以集成方式一般是简单的,往往也是最有效的
如果脑洞大开,想采取其它结果集成方式时,需要注意该方式会不会破坏集体模型的泛化能力
本节讲解如何使用Bagging集成BP神经网络,以及具体的代码实现
bagging-BP神经网络
BP神经网络在神经元足够多时可以拟合任意函数,BP神经网络是一个具有极强拟合能力的模型
较强的拟合能力是BP神经网络的优势,但同时也是它的弱点,因为这会导致模型很容易过拟合
因此,可以采用bagging集成方式,将BP神经网络进行集成
围绕bagging集成方式的核心思想,结合BP神经网络的特色,进行下述集成:
1. 基模型的设置:采用三层BP神经网络,设置不太弱也不太强的隐神经元个数
只设置一个隐层,是因为三层BP神经网络就已经有足够的拟合能力
而隐神经元个数不能设置太少,是因为过少的神经元会使模型欠拟合过严重,且易同质化
而隐神经元个数不能设置太多,是为了简化模型的复杂度,同时提高集体模型的泛化能力
2. 模型的多样化策略
采取boostrap进行放回式抽样,这样可以使每个模型各自倾向不同的样本,提高局部拟合效果
同时每次训练时采用不同的随机种子训练BP神经网络,使得各个模型的训练结果不一样
3. 结果集成方法
最后预测时,将所有模型的预测结果进行求均值,作为最终集体模型的预测结果
Bagging-BP神经网络-代码实现
根据上述bagging-BP神经网络的算法设计,编写代码如下
%本代码展示如何使用Bagging集成BP神经网络拟合sin函数
%转载请说明来自 《老饼讲解神经网络》 www.bbbdata.com
clear all ;close all;
X = -6:0.3:6; % 输入数据X
y = sin(X); % 输出数据y
g = 50; % 最大规模数
[vn,sn] = size(X); % 变量个数,样本个数
% BP神经网络集群模型
netG= {}; % 初始化BP网络集群
for i = 1:g % 逐个训练BP神经网络模型
idx = fix(rand(1,sn)*sn)+1; % 本次抽取的样本序号
cur_X = X(:,idx); % 本次用于训练的样本的X
cur_y = y(:,idx); % 本次用于训练的样本的Y
net = newff(cur_X,cur_y,5, {'tansig','purelin'},'trainlm'); % 构建BP神经网络
net.divideParam.trainRatio = 0.85; % 用于训练的数据比例
net.divideParam.valRatio = 0.15 ; % 用于验证过拟合的数据比例
net.divideParam.testRatio = 0; % 关闭测试数据的比例
net = train(net,cur_X,cur_y); % 训练BP神经网络
netG{i} = net; % 保存本次训练的BP神经网络
end
%--------BP神经网络集成预测---------------
test_x = -6:0.01:6; % 用于预测的x
py = 0; % 初始化预测值
for i = 1: g % 将集群中的BP神经网络逐个对样本进行预测
py = sim(netG{i},test_x)+py; % 将本次的预测值添加到总预测值中
end
py = py/g; % 计算均值,作为最终的预测值
% ---------绘制结果--------------------
plot(X,y,'o','MarkerEdgeColor','k','MarkerFaceColor','y','MarkerSize',6) % 画出训练样本点
hold on
plot(test_x,py,'-r','LineWidth',1) % 画出拟合曲线
legend('训练样本','模型拟合曲线') % 展示图例
这里作为讲解例子,为了避免代码复杂,没有划分测试数据,
如果实际使用,则需要自行先划分出测试数据,剩余的数据再用以上的代码进行建模哦
代码运行结果如下:
可以看到,Bagging-BP神经网络可以很完美地拟合目标曲线
✍️补充:关于bagging-BP神经网络的有效性
需要特别说明的是,笔者多次运行上述Bagging-BP神经网络代码,所得到的拟合效果都是非常完美的
而如果使用单个BP神经网络进行训练,虽然也有完美的效果,但结果有时候也会有一些小瑕疵,
也就是说,Bagging-BP神经网络虽然更加复杂,但它的稳定性明显要比单个BP神经网络更加好,
特别是在变量较多的情况下,模型的瑕疵往往是我们难以发现的,这时候就更加体现出Bagging的优势
同时,使用Bagging-BP神经网络在参数设置、训练上也没有单个BP那么敏感,
例如多设一两个神经元什么的,对结果影响并不会那么大,这就体现了集成算法在建模时的容错性
但是,不得不提的是,Bagging明显使模型更加庞大,运算、训练过程更加复杂,这是Bagging最不好的地方
好了,以上就是如何利用Bagging算法来集成BP神经网络的全部内容了~
End