大家好,我是带我去滑雪!
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 |
更多优质内容持续发布中,请移步主页查看。
点赞+关注,下次不迷路!