Adaboost与BP神经网络集成学习模型:原理、公式与应用

在机器学习领域,集成学习凭借其强大的性能备受关注。今天,咱们就深入探讨一种结合了Adaboost算法和BP神经网络的集成学习模型,搞清楚它的原理、数学表达式,再结合实际代码理解其实现过程。

集成学习与Adaboost算法基础

集成学习的思路很巧妙,它把多个弱学习器整合起来,构建出一个性能超强的强学习器。Adaboost(Adaptive Boosting)就是集成学习里的“明星”迭代算法。它的核心逻辑是在训练过程中动态调整样本权重。简单来说,前一轮被误分类的样本,在后续训练中会被重点关照,权重会加大。经过多轮训练,把这些弱学习器按不同权重组合,就形成了强大的学习器。

举个形象的例子,假如你要识别动物,有个“小助手”总是把猫误认成狗,那下次训练时,Adaboost就会让这个“小助手”多看看猫的图片,加深印象,这样它下次认错的概率就会降低。最后把多个这样不断改进的“小助手”的判断综合起来,识别的准确率就能大大提高。

BP神经网络:模型基石

BP(Back Propagation)神经网络是多层前馈神经网络的代表,误差反向传播算法是它的“秘密武器”。网络由输入层、隐藏层和输出层构成。数据从输入层进入,在隐藏层经过非线性变换,最后在输出层得到预测结果。

以一个简单的房价预测问题为例,输入层的神经元可以是房屋面积、房间数量等特征,隐藏层对这些特征进行复杂的组合和变换,输出层就给出预测的房价。

BP神经网络的前向传播过程涉及一系列数学运算。假设输入层有n0n_0n0个神经元,隐藏层有n1n_1n1个神经元,输出层有n2n_2n2个神经元。对于输入样本x=(x1,x2,⋯ ,xn0)Tx=(x_1,x_2,\cdots,x_{n_0})^Tx=(x1,x2,,xn0)T

  • 隐藏层输入:netj=∑i=1n0wjixi+bjnet_{j}=\sum_{i = 1}^{n_0}w_{ji}x_i + b_jnetj=i=1n0wjixi+bjj=1,2,⋯ ,n1j = 1,2,\cdots,n_1j=1,2,,n1 ,这里的wjiw_{ji}wji是输入层第iii个神经元到隐藏层第jjj个神经元的权重,bjb_jbj是隐藏层第jjj个神经元的偏置,这个公式计算了隐藏层神经元接收到的输入信号总和。
  • 隐藏层输出:yj=f(netj)y_j = f(net_j)yj=f(netj)j=1,2,⋯ ,n1j = 1,2,\cdots,n_1j=1,2,,n1f(⋅)f(\cdot)f()是激活函数,像sigmoid函数、ReLU函数等。激活函数的作用是给神经网络引入非线性因素,让它能处理更复杂的问题。
  • 输出层输入:netk=∑j=1n1vkjyj+cknet_k=\sum_{j = 1}^{n_1}v_{kj}y_j + c_knetk=j=1n1vkjyj+ckk=1,2,⋯ ,n2k = 1,2,\cdots,n_2k=1,2,,n2vkjv_{kj}vkj是隐藏层第jjj个神经元到输出层第kkk个神经元的权重,ckc_kck是输出层第kkk个神经元的偏置。
  • 输出层输出:ok=g(netk)o_k = g(net_k)ok=g(netk)k=1,2,⋯ ,n2k = 1,2,\cdots,n_2k=1,2,,n2g(⋅)g(\cdot)g()是输出层的激活函数,根据问题类型选择,回归问题常用线性函数,分类问题常用softmax函数。

在训练BP神经网络时,误差反向传播算法会计算误差对权重和偏置的梯度,进而更新它们。比如均方误差函数E=12∑k=1n2(tk−ok)2E=\frac{1}{2}\sum_{k = 1}^{n_2}(t_k - o_k)^2E=21k=1n2(tkok)2tkt_ktk是第kkk个输出神经元的真实值。通过计算Δvkj=−η∂E∂vkj=ηδkyj\Delta v_{kj}=-\eta\frac{\partial E}{\partial v_{kj}}=\eta\delta_k y_jΔvkj=ηvkjE=ηδkyj 来更新输出层权重,Δwji=−η∂E∂wji=η∑k=1n2δkvkjf′(netj)xi\Delta w_{ji}=-\eta\frac{\partial E}{\partial w_{ji}}=\eta\sum_{k = 1}^{n_2}\delta_k v_{kj}f'(net_j)x_iΔwji=ηwjiE=ηk=1n2δkvkjf(netj)xi 来更新隐藏层权重,η\etaη是学习率,控制每次权重更新的幅度。

Adaboost与BP神经网络集成学习模型原理

初始化样本权重

在模型训练的起始阶段,给定包含NNN个样本的训练集{(x1,y1),(x2,y2),⋯ ,(xN,yN)}\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}{(x1,y1),(x2,y2),,(xN,yN)} ,要对样本权重进行初始化。第一轮训练时,每个样本的权重D1(i)D_1(i)D1(i)都相等,即D1(i)=1ND_1(i)=\frac{1}{N}D1(i)=N1i=1,2,⋯ ,Ni = 1,2,\cdots,Ni=1,2,,N 。这就好比让所有样本站在同一起跑线上开始训练。

迭代训练弱学习器(BP神经网络)

假设要进行TTT轮迭代训练:

  • 训练弱学习器:在第ttt轮(t=1,2,⋯ ,Tt = 1,2,\cdots,Tt=1,2,,T),用当前的样本权重DtD_tDt来训练一个BP神经网络ht(x)h_t(x)ht(x)
  • 计算弱学习器的误差率et=∑i=1NDt(i)[yi≠ht(xi)]e_t=\sum_{i = 1}^{N}D_t(i)[y_i\neq h_t(x_i)]et=i=1NDt(i)[yi=ht(xi)] ,这里的[yi≠ht(xi)][y_i\neq h_t(x_i)][yi=ht(xi)]是指示函数,样本预测错误时它为1,正确时为0。误差率ete_tet反映了当前弱学习器在加权样本上的错误程度。
  • 计算弱学习器的权重αt=12ln⁡(1−etet)\alpha_t=\frac{1}{2}\ln\left(\frac{1 - e_t}{e_t}\right)αt=21ln(et1et)ete_tet越小,说明弱学习器表现越好,αt\alpha_tαt就越大,它在最终强学习器里的重要性也就越高。
  • 调整样本权重Dt+1(i)=Dt(i)Ztexp⁡(−αtyiht(xi))D_{t + 1}(i)=\frac{D_t(i)}{Z_t}\exp\left(-\alpha_ty_ih_t(x_i)\right)Dt+1(i)=ZtDt(i)exp(αtyiht(xi))Zt=∑i=1NDt(i)exp⁡(−αtyiht(xi))Z_t=\sum_{i = 1}^{N}D_t(i)\exp\left(-\alpha_ty_ih_t(x_i)\right)Zt=i=1NDt(i)exp(αtyiht(xi)) 是归一化因子,保证Dt+1D_{t + 1}Dt+1是概率分布。这个过程会加大误分类样本的权重,让后续训练更关注这些样本。

组合弱学习器得到强学习器

经过TTT轮迭代后,把所有训练好的弱学习器组合成强学习器H(x)H(x)H(x)H(x)=sign(∑t=1Tαtht(x))H(x)=\text{sign}\left(\sum_{t = 1}^{T}\alpha_th_t(x)\right)H(x)=sign(t=1Tαtht(x)) 。这就像是综合了多个“小助手”的意见,得出最终的判断。

代码示例解读

% 清空环境变量
clc
clear

% 下载数据
load data1 input output

% 权重初始化
k=rand(1,2000);
[m,n]=sort(k);

% 训练样本
input_train=input(n(1:1900),:)';
output_train=output(n(1:1900),:)';

% 测试样本
input_test=input(n(1901:2000),:)';
output_test=output(n(1901:2000),:)';

% 样本权重
[mm,nn]=size(input_train);
D(1,:)=ones(1,nn)/nn;

% 训练样本归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);

K=10;
for i=1:K
    % 弱预测器训练
    net=newff(inputn,outputn,5);
    net.trainParam.epochs=20;
    net.trainParam.lr=0.1;
    net=train(net,inputn,outputn);

    % 弱预测器预测
    an1=sim(net,inputn);
    BPoutput=mapminmax('reverse',an1,outputps);

    % 预测误差
    erroryc(i,:)=output_train-BPoutput;

    % 测试数据预测
    inputn1=mapminmax('apply',input_test,inputps);
    an2=sim(net,inputn1);
    test_simu(i,:)=mapminmax('reverse',an2,outputps);

    % 调整D值
    Error(i)=0;
    for j=1:nn
        if abs(erroryc(i,j))>0.2  % 较大误差
            Error(i)=Error(i)+D(i,j);
            D(i+1,j)=D(i,j)*1.1;
        else
            D(i+1,j)=D(i,j);
        end
    end

    % 计算弱预测器权重
    at(i)=0.5/exp(abs(Error(i)));

    % D值归一化
    D(i+1,:)=D(i+1,:)/sum(D(i+1,:));
end

% 强预测器预测
at=at/sum(at);

% 结果统计
% 强分离器效果
output=at*test_simu;
error=output_test-output;
plot(abs(error),'-*')
hold on
for i=1:8
    error1(i,:)=test_simu(i,:)-output;
end
plot(mean(abs(error1)),'-or')

title('强预测器预测误差绝对值','fontsize',12)
xlabel('预测样本','fontsize',12)
ylabel('误差绝对值','fontsize',12)
legend('强预测器预测','弱预测器预测')

在这段代码里,先是加载数据并划分训练集和测试集,接着初始化样本权重。在循环训练中,每次构建一个含5个隐藏神经元的BP神经网络作为弱学习器,设定训练轮数为20,学习率为0.1 。计算预测误差后,根据误差大小调整样本权重,误差绝对值大于0.2时,相应样本权重乘以1.1 。用at(i)=0.5/exp⁡(∣Error(i)∣)at(i)=0.5/\exp(\vert Error(i)\vert)at(i)=0.5/exp(Error(i))计算弱学习器权重,再对样本权重归一化。最后,组合弱学习器进行预测,对比强、弱预测器的误差并绘图展示。

Adaboost和BP神经网络集成学习模型结合了两者的优势,在很多领域都有出色表现。不过,在实际应用中,还得根据具体问题调整参数,像BP神经网络的结构、Adaboost的迭代次数等,这样才能发挥出模型的最大潜力。希望通过这篇文章,大家能对这个模型有更深入的理解,在机器学习的实践中运用得更加得心应手。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐