基于BP神经网络+Adaboost的强分类器设计实现公司财务预警

      大家好,我是带我去滑雪!

       Adaboost算法的思想是合并多个弱分类器的输出以产生有效分类。其主要步骤是先利用弱学习算法进行迭代运算,每次运算都按照分类结果更新训练数据权重分布,对于分类失败的训练个体赋予较大的权重,下一次迭代运算时更加关注这些训练个体。弱分类器通过反复训练得到一个分类函数序列,将每个分类函数赋予一个权重,分类结果越好的函数,其对应的权重越大。经过多次迭代后,最终强分类函数由弱分类函数加权得到。

       BP神经网络+Adaboost模型就是把BP神经网络作为弱分类器,反复训练BP神经网络预测样本输出,最后通过Adaboost算法将多个BP神经网络弱分类器组合成强分类器。

一、解决的问题和模型

(1)问题与指标选取

       公司财务预警是为了防止公司财务运行偏离预期目标而建立的,通过公司的各项指标综合评价并预测公司财务状况、发展趋势和变化,为决策者提供智力支持。

       由于评价一个公司的指标很多,如果对所有指标都进行评价后综合,模型过于复杂,并且各项指标间相关性较强,因此在模型建立前需要进行筛选。筛选指标分为显著性分析和因子分析两步。最终选择成分费用率、资产营运能力、公司总资产、总资产率、流动比率、营业现金流量、审计意见类型、每股收益、存货周转率和资产负债率共计10项指标作为评价指标,该10项指标能够较为全面的反映出公司的财务状况。共收集有1350家公司的数据。

(2)模型建立

        输入数据为10项指标,输出为1维,代表公司财务状况,当输出为1表示财务状况良好,输出-1时表示财务状况存在问题。选取1350家中的1000家数据作为训练数据,350组数据作为测试数据。根据输入输出数据结构,采用BP神经网络的结构为10-6-1,一共训练生成10个BP神经网络弱分类器,最后用10个弱分类器组合成强分类器对公司的财务状况进行分类。

二、代码实现

(1)数据集选择

clc
clear

load data input_train output_train input_test output_test
[mm,nn]=size(input_train);
D(1,:)=ones(1,nn)/nn;

(2)弱分类器学习分类

K=10;
for i=1:K
    
    %训练样本归一化
    [inputn,inputps]=mapminmax(input_train);
    [outputn,outputps]=mapminmax(output_train);
    error(i)=0;
    
    %BP神经网络构建
    net=newff(inputn,outputn,6);
    net.trainParam.epochs=5;
    net.trainParam.lr=0.1;
    net.trainParam.goal=0.00004;
    
    %BP神经网络训练
    net=train(net,inputn,outputn);
    
    %训练数据预测
    an1=sim(net,inputn);
    test_simu1(i,:)=mapminmax('reverse',an1,outputps);
    
    %测试数据预测
    inputn_test =mapminmax('apply',input_test,inputps);
    an=sim(net,inputn_test);
    test_simu(i,:)=mapminmax('reverse',an,outputps);
    
    %统计输出效果
    kk1=find(test_simu1(i,:)>0);
    kk2=find(test_simu1(i,:)<0);
    
    aa(kk1)=1;
    aa(kk2)=-1;
    
    %统计错误样本数
    for j=1:nn
        if aa(j)~=output_train(j);
            error(i)=error(i)+D(i,j);
        end
    end
    
    %弱分类器i权重
    at(i)=0.5*log((1-error(i))/error(i));
    
    %更新D值
    for j=1:nn
        D(i+1,j)=D(i,j)*exp(-at(i)*aa(j)*test_simu1(i,j));
    end
    
    %D值归一化
    Dsum=sum(D(i+1,:));
    D(i+1,:)=D(i+1,:)/Dsum;
    
end

(3)强分类器分类和结果统计

output=sign(at*test_simu);

%% 分类结果统计
%统计强分类器每类分类错误个数
kkk1=0;
kkk2=0;
for j=1:350
    if output(j)==1
        if output(j)~=output_test(j)
            kkk1=kkk1+1;
        end
    end
    if output(j)==-1
        if output(j)~=output_test(j)
            kkk2=kkk2+1;
        end
    end
end

kkk1
kkk2
disp('第一类分类错误  第二类分类错误  总错误');
% 窗口显示
disp([kkk1 kkk2 kkk1+kkk2]);

plot(output)
hold on
plot(output_test,'g')

%统计弱分离器效果
for i=1:K
    error1(i)=0;
    kk1=find(test_simu(i,:)>0);
    kk2=find(test_simu(i,:)<0);
    
    aa(kk1)=1;
    aa(kk2)=-1;
    
    for j=1:350
        if aa(j)~=output_test(j);
            error1(i)=error1(i)+1;
        end
    end
end

(4) 结果分析

       分类误差统计表:

强分类器分类误差 弱分类器评价误差
0.04 0.0846

基于BP神经网络+Adaboost的强分类器设计实现公司财务预警_第1张图片


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

你可能感兴趣的:(机器学习之python,神经网络,人工智能,深度学习)