背景
1甘畅、BP_Adaboost模型
Adaboost算法的思想是合并多個(gè)“弱”分類器的輸出以產(chǎn)生有效分類渠驼。其主要步驟為:首先給出弱學(xué)習(xí)算法和樣本空間(x,y)再榄,從樣本空間中找出m組訓(xùn)練數(shù)據(jù)疾瓮,每組訓(xùn)練數(shù)據(jù)的權(quán)重都是1/m撮弧;然后用弱學(xué)習(xí)算法迭代運(yùn)算T次淀歇,每次運(yùn)算后都按照分類結(jié)果更新訓(xùn)練數(shù)據(jù)權(quán)重分布(對(duì)于分類失敗的訓(xùn)練個(gè)體賦予較大權(quán)重易核,下一次迭代運(yùn)算時(shí)更加關(guān)注這些訓(xùn)練個(gè)體);弱分類器通過(guò)反復(fù)迭代得到一個(gè)分類函數(shù)序列f1,f2,...,fT浪默,每個(gè)分類器函數(shù)賦予一個(gè)權(quán)重牡直,分類結(jié)果越好的函數(shù)缀匕,其對(duì)應(yīng)權(quán)重越大。T次迭代后碰逸,最終強(qiáng)分類函數(shù)F由弱分類函數(shù)加權(quán)得到乡小。BP_Adaboost模型即把BP神經(jīng)網(wǎng)絡(luò)作為弱分類器。反復(fù)訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)樣本輸出饵史,通過(guò)Adaboost算法得到多個(gè)BP神經(jīng)網(wǎng)絡(luò)弱分類器組成的強(qiáng)分類器满钟。
2、公司財(cái)務(wù)預(yù)警系統(tǒng)介紹
公司財(cái)務(wù)預(yù)警系統(tǒng)是為了防止公司財(cái)務(wù)系統(tǒng)運(yùn)行偏離預(yù)期目標(biāo)而建立的報(bào)警系統(tǒng)胳喷,具有針對(duì)性和預(yù)測(cè)性等特點(diǎn)湃番。它通過(guò)公司的各項(xiàng)指標(biāo)綜合評(píng)價(jià)并預(yù)測(cè)公司財(cái)務(wù)狀況、發(fā)展趨勢(shì)和變化厌蔽,為決策者科學(xué)決策提供支持牵辣。
財(cái)務(wù)危機(jī)預(yù)警指標(biāo)體系中的指標(biāo)可分為表內(nèi)信息指標(biāo)、盈利能力指標(biāo)奴饮、償還能力指標(biāo)、成長(zhǎng)能力指標(biāo)择浊、線性流量指標(biāo)和表外信息指標(biāo)六大指標(biāo)戴卜,每項(xiàng)大指標(biāo)又分為若干小指標(biāo),如盈利 能力指標(biāo)又分為凈資產(chǎn)收益率琢岩、總資產(chǎn)報(bào)酬率投剥、每股收益、主營(yíng)業(yè)務(wù)利潤(rùn)率和成本費(fèi)用利潤(rùn)率等担孔。在用于公司財(cái)務(wù)預(yù)警預(yù)測(cè)時(shí)江锨,如果對(duì)所有指標(biāo)都進(jìn)行評(píng)價(jià)后綜合,模型過(guò)于復(fù)雜糕篇,并且各指標(biāo)間關(guān)聯(lián)性較強(qiáng)啄育,因此在模型建立前需要篩選指標(biāo)。
指標(biāo)篩選分為顯著性分析和因子分析兩步拌消。顯著性分析通過(guò)T檢驗(yàn)方法分析ST公司和非ST公司挑豌,在財(cái)務(wù)指標(biāo)中找出差別較大、能夠明顯區(qū)分兩類公司的財(cái)務(wù)指標(biāo)墩崩。因子分析在顯著性分析基礎(chǔ)上對(duì)篩選出來(lái)的指標(biāo)計(jì)算主成分特征值氓英,從中找出特征值大的指標(biāo)作為公司危機(jī)預(yù)警方法的最終評(píng)價(jià)指標(biāo)。最終找出成分費(fèi)用利潤(rùn)率鹦筹、資產(chǎn)營(yíng)運(yùn)能力铝阐、公司總資產(chǎn)、總資產(chǎn)增長(zhǎng)率铐拐、流動(dòng)比率徘键、營(yíng)業(yè)現(xiàn)金流量练对、審計(jì)意見(jiàn)類型、每股收益啊鸭、存貨周轉(zhuǎn)率和資產(chǎn)負(fù)債率十項(xiàng)指標(biāo)作為評(píng)價(jià)指標(biāo)锹淌,該十項(xiàng)指標(biāo)能夠比較全面地反映出公司的財(cái)務(wù)狀況。
模型建立
基于BP_Adaboost模型的公司財(cái)務(wù)預(yù)警算法流程圖如下圖1所示赠制。
算法步驟如下:
步驟1:數(shù)據(jù)選擇和網(wǎng)絡(luò)初始化
步驟2:弱分類器預(yù)測(cè)
步驟3:計(jì)算預(yù)測(cè)序列權(quán)重
步驟4:測(cè)試數(shù)據(jù)權(quán)重調(diào)整
步驟5:強(qiáng)分類函數(shù)
本文中共有1 350組公司財(cái)務(wù)狀況數(shù)據(jù)赂摆,每組數(shù)據(jù)的輸入為10維,代表上述的10個(gè)指標(biāo)钟些,輸出為1維烟号,代表公司財(cái)務(wù)狀況,為1時(shí)表示財(cái)務(wù)狀況良好政恍,為-1時(shí)表示財(cái)務(wù)狀況出現(xiàn)問(wèn)題汪拥。從中隨機(jī)選取1 000組數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),350組數(shù)據(jù)作為測(cè)試數(shù)據(jù)篙耗。根據(jù)數(shù)據(jù)維數(shù)迫筑,采用的BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)為10-6-1,共訓(xùn)練生成10個(gè)BP神經(jīng)網(wǎng)絡(luò)弱分類器宗弯,最后用10個(gè)弱分類器組成強(qiáng)分類器對(duì)公司財(cái)務(wù)狀況進(jìn)行分類脯燃。
MATLAB實(shí)現(xiàn)
根據(jù)Adaboost和BP神經(jīng)網(wǎng)絡(luò)原理,編程實(shí)現(xiàn)基于BP_Adaboost算法的公司財(cái)務(wù)預(yù)警建模蒙保。
1辕棚、數(shù)據(jù)集選擇
從樣本空間中選擇訓(xùn)練樣本、測(cè)試樣本邓厕,并對(duì)測(cè)試樣本分配權(quán)重逝嚎,其中訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)存儲(chǔ)在data.mat文件中,input_train详恼、output_train為訓(xùn)練輸入輸出數(shù)據(jù)补君,input_test、output_test為預(yù)測(cè)輸入輸出數(shù)據(jù)单雾。
%% 清空環(huán)境變量
clc
clear
%% 下載數(shù)據(jù)
load data input_train output_train input_test output_test
%% 權(quán)重初始化
[mm,nn]=size(input_train);
D(1,:)=ones(1,nn)/nn;
2赚哗、弱分類器學(xué)習(xí)分類
把BP神經(jīng)網(wǎng)絡(luò)看做弱分類器,經(jīng)過(guò)訓(xùn)練后分類訓(xùn)練樣本硅堆,并且根據(jù)訓(xùn)練樣本分類結(jié)構(gòu)調(diào)整訓(xùn)練樣本權(quán)重值屿储,最終得出一系列弱分類器及其權(quán)重,為了體現(xiàn)出強(qiáng)分類器的分類效果渐逃,本文降低了BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練次數(shù)以降低弱分類器分類能力够掠。
%% 弱分類器分類
K=10;
for i=1:K
%訓(xùn)練樣本歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
error(i)=0;
%BP神經(jīng)網(wǎng)絡(luò)構(gòu)建
net=newff(inputn,outputn,6);
net.trainParam.epochs=5;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00004;
%BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練
net=train(net,inputn,outputn);
%訓(xùn)練數(shù)據(jù)預(yù)測(cè)
an1=sim(net,inputn);
test_simu1(i,:)=mapminmax('reverse',an1,outputps);
%測(cè)試數(shù)據(jù)預(yù)測(cè)
inputn_test =mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu(i,:)=mapminmax('reverse',an,outputps);
%統(tǒng)計(jì)輸出效果
kk1=find(test_simu1(i,:)>0);
kk2=find(test_simu1(i,:)<0);
aa(kk1)=1;
aa(kk2)=-1;
%統(tǒng)計(jì)錯(cuò)誤樣本數(shù)
for j=1:nn
if aa(j)~=output_train(j);
error(i)=error(i)+D(i,j);
end
end
%弱分類器i權(quán)重
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、強(qiáng)分類器分類和結(jié)果統(tǒng)計(jì)
由10組弱分類器BP網(wǎng)絡(luò)組成強(qiáng)分類器對(duì)分析樣本進(jìn)行分類茄菊,并統(tǒng)計(jì)分類誤差疯潭。
%% 強(qiáng)分類器分類結(jié)果
output=sign(at*test_simu);
%% 分類結(jié)果統(tǒng)計(jì)
%統(tǒng)計(jì)強(qiáng)分類器每類分類錯(cuò)誤個(gè)數(shù)
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('第一類分類錯(cuò)誤 第二類分類錯(cuò)誤 總錯(cuò)誤');
% 窗口顯示
disp([kkk1 kkk2 kkk1+kkk2]);
plot(output)
hold on
plot(output_test,'g')
%統(tǒng)計(jì)弱分離器效果
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
disp('統(tǒng)計(jì)弱分類器分類效果');
error1
disp('強(qiáng)分類器分類誤差率')
(kkk1+kkk2)/350
disp('弱分類器分類誤差率')
(sum(error1)/(K*350))
4赊堪、結(jié)果分析
分析樣本共有350組數(shù)據(jù),采用10個(gè)BP弱分類器組成的強(qiáng)分類器分類公司財(cái)務(wù)運(yùn)行狀況竖哩,分類誤差統(tǒng)計(jì)如下表1 所列哭廉。
表1 分類誤差統(tǒng)計(jì)
強(qiáng)分類器分類誤差率 | 弱分類器分類平均誤差率 |
---|---|
0.0400 | 0.0846 |
從上表可以看出,強(qiáng)分類器分類誤差低于弱分類器分類誤差率相叁,表明BP_Adaboost分類算法取得了良好的效果遵绰。
擴(kuò)展
Adaboost方法不僅可以用于設(shè)計(jì)強(qiáng)分類器,還可以用于設(shè)計(jì)強(qiáng)預(yù)測(cè)器增淹。強(qiáng)預(yù)測(cè)期設(shè)計(jì)思路與強(qiáng)分類器設(shè)計(jì)類似椿访,都是先賦予測(cè)試樣本權(quán)重,然后根據(jù)弱預(yù)測(cè)器預(yù)測(cè)結(jié)果調(diào)整測(cè)試樣本權(quán)重并確定弱預(yù)測(cè)器權(quán)重虑润,最后把弱預(yù)測(cè)器序列作為強(qiáng)預(yù)測(cè)器成玫。不同的是在強(qiáng)分類器中增加預(yù)測(cè)錯(cuò)類別樣本的權(quán)重,在強(qiáng)預(yù)測(cè)器中增加預(yù)測(cè)誤差超過(guò)閾值的樣本權(quán)重拳喻。采用BP_Adaboost強(qiáng)預(yù)測(cè)器預(yù)測(cè)上一篇(http://www.reibang.com/p/c9c437391a7d)文章中非線性函數(shù)的輸出哭当,函數(shù)形式為
具體MATLAB實(shí)現(xiàn)如下。
1冗澈、數(shù)據(jù)集選擇
從樣本空間中選擇訓(xùn)練樣本荣病、測(cè)試樣本,并對(duì)測(cè)試樣本分配權(quán)重渗柿。非線性函數(shù)的輸出數(shù)據(jù)存儲(chǔ)在data1.mat文件中,其中input為函數(shù)輸入數(shù)據(jù)脖岛,output為函數(shù)輸出數(shù)據(jù)朵栖,從中隨機(jī)選擇1 900組數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),100組數(shù)據(jù)作為測(cè)試數(shù)據(jù)柴梆。
%% 清空環(huán)境變量
clc
clear
%% 下載數(shù)據(jù)
load data1 input output
%% 權(quán)重初始化
k=rand(1,2000);
[m,n]=sort(k);
%訓(xùn)練樣本
input_train=input(n(1:1900),:)';
output_train=output(n(1:1900),:)';
%測(cè)試樣本
input_test=input(n(1901:2000),:)';
output_test=output(n(1901:2000),:)';
%樣本權(quán)重
[mm,nn]=size(input_train);
D(1,:)=ones(1,nn)/nn;
%訓(xùn)練樣本歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
2陨溅、弱預(yù)測(cè)器學(xué)習(xí)預(yù)測(cè)
把BP神經(jīng)網(wǎng)絡(luò)看做弱預(yù)測(cè)器,經(jīng)過(guò)訓(xùn)練后預(yù)測(cè)測(cè)試樣本輸出绍在,并且根據(jù)預(yù)測(cè)結(jié)果調(diào)整測(cè)試樣本權(quán)重门扇,最終得出一系列弱預(yù)測(cè)器及其權(quán)重。這里把預(yù)測(cè)誤差超過(guò)0.1的測(cè)試樣本作為應(yīng)該加強(qiáng)學(xué)習(xí)的樣本偿渡。
K=10;
for i=1:K
%弱預(yù)測(cè)器訓(xùn)練
net=newff(inputn,outputn,5);
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net=train(net,inputn,outputn);
%弱預(yù)測(cè)器預(yù)測(cè)
an1=sim(net,inputn);
BPoutput=mapminmax('reverse',an1,outputps);
%預(yù)測(cè)誤差
erroryc(i,:)=output_train-BPoutput;
%測(cè)試數(shù)據(jù)預(yù)測(cè)
inputn1=mapminmax('apply',input_test,inputps);
an2=sim(net,inputn1);
test_simu(i,:)=mapminmax('reverse',an2,outputps);
%調(diào)整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
%計(jì)算弱預(yù)測(cè)器權(quán)重
at(i)=0.5/exp(abs(Error(i)));
%D值歸一化
D(i+1,:)=D(i+1,:)/sum(D(i+1,:));
end
3臼寄、強(qiáng)預(yù)測(cè)器預(yù)測(cè)
把10組弱預(yù)測(cè)器函數(shù)組成強(qiáng)預(yù)測(cè)器預(yù)測(cè)輸出,并比較強(qiáng)預(yù)測(cè)器預(yù)測(cè)誤差和弱預(yù)測(cè)器預(yù)測(cè)誤差溜宽。
%% 強(qiáng)預(yù)測(cè)器預(yù)測(cè)
at=at/sum(at);
%% 結(jié)果統(tǒng)計(jì)
%強(qiáng)分離器效果
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('強(qiáng)吉拳、弱預(yù)測(cè)器預(yù)測(cè)誤差絕對(duì)值','fontsize',12)
xlabel('預(yù)測(cè)樣本','fontsize',12)
ylabel('誤差絕對(duì)值','fontsize',12)
legend('強(qiáng)預(yù)測(cè)器預(yù)測(cè)','弱預(yù)測(cè)器預(yù)測(cè)')
4、結(jié)果分析
預(yù)測(cè)樣本共有350組适揉,10個(gè)BP神經(jīng)網(wǎng)絡(luò)構(gòu)成弱預(yù)測(cè)器序列留攒,強(qiáng)預(yù)測(cè)器分類誤差絕對(duì)值和弱預(yù)測(cè)器預(yù)測(cè)平均誤差絕對(duì)值如下圖2所示煤惩。
從圖2可以看出,強(qiáng)預(yù)測(cè)器預(yù)測(cè)誤差低于弱預(yù)測(cè)器預(yù)測(cè)誤差炼邀,BP_Adaboost強(qiáng)預(yù)測(cè)器預(yù)測(cè)算法取得了良好的效果魄揉。