BP神经网络

【案例】用Bagging集成算法提升BP的泛化能力

作者 : 老饼 发表日期 : 2023-01-18 19:29:58 更新日期 : 2024-12-06 13:09:09
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



Bagging(Bootstrap aggregating)算法又称为装袋算法,是机器学习中的一种集成学习算法

Bagging算法可各种分类、回归算法结合,既可以提高模型的准确率,又可以加强模型的泛化能力

本文讲解如何将Bagging算法与BP神经网络结合,提高BP神经网络的泛化能力和稳定性





    01. Bagging集成算法简介    





本节介绍bagging集成算法是什么,以及它的训练方式与结果集成方式





        什么是bagging集成学习       


bagging是集成学习中的一种集成方式,最初由Leo Breiman于1996年提出,主要用于抵抗模型的过拟合
bagging简单来说,就是集成多个模型,通过模型的相互纠正与抵消,使得模型预测结果更准、泛化能力更好
 什么是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的最终目的是令模型的泛化能力增强,所以集成方式一般是简单的,往往也是最有效的
如果脑洞大开,想采取其它结果集成方式时,需要注意该方式会不会破坏集体模型的泛化能力








     02.bagging-BP神经网络     




本节讲解如何使用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神经网络的有效性
需要特别说明的是,笔者多次运行上述Bagging-BP神经网络代码,所得到的拟合效果都是非常完美的
而如果使用单个BP神经网络进行训练,虽然也有完美的效果,但结果有时候也会有一些小瑕疵,
 不使用Bagging时的BP神经网络效果
 也就是说,Bagging-BP神经网络虽然更加复杂,但它的稳定性明显要比单个BP神经网络更加好,
特别是在变量较多的情况下,模型的瑕疵往往是我们难以发现的,这时候就更加体现出Bagging的优势
同时,使用Bagging-BP神经网络在参数设置、训练上也没有单个BP那么敏感,
 例如多设一两个神经元什么的,对结果影响并不会那么大,这就体现了集成算法在建模时的容错性
但是,不得不提的是,Bagging明显使模型更加庞大,运算、训练过程更加复杂,这是Bagging最不好的地方







好了,以上就是如何利用Bagging算法来集成BP神经网络的全部内容了~









  End  






联系老饼