5.1 案例背景
5.1.1 BP_Adaboost模型
Adaboost算法的思想是合並多個“弱”分類器的輸出以產生有效分類。其主要步驟為:首先給出弱學習算法和樣本空間($X$,$Y$),從樣本空間中找出$m$組訓練數據,每組訓練數據的權重都是$\frac{1}{m}$。然后用弱學習算法迭代運算$T$次,每次運算后都按照分類結果更新訓練數據權重分布,對於分類失敗的訓練個體賦予較大權重,下次迭代運算時更加關注這些訓練個體。弱分類器通過反復迭代得到一個分類函數序列${f_1},{f_2},...,{f_T}$,每個分類函數賦予一個權重,分類結果越好的函數,其對應權重越大。$T$次迭代之后,最終強分類函數$F$由弱分類函數加權得到。BP_Adaboost模型即BP神經網絡作為弱分類器,反復訓練BP神經網絡預測樣本輸出,通過Adaboost算法得到多個BP神經網絡弱分類器組成的強分類器。
5.1.2 公司財務預警系統介紹
公司財務預警系統是為了防止公司財務系統運行偏離預期目標而建立的報警系統,具有針對性和預測性等特點。它通過公司的各項指標綜合評價並預測公司財務狀況、發展趨勢和變化,為決策者科學決策提供智力支持。
評價指標:成分費用利潤率、資產營運能力、公司總資產、總資產增長率、流動比率、營業現金流量、審計意見類型、每股收益、存貨周轉率和資產負債率
5.2 模型建立
算法步驟如下:
- 數據初始化和網絡初始化。從樣本空間中隨機選擇$m$組訓練數據,初始化測試數據的分布權值${D_t}(i) = \frac{1}{m}$,根據樣本輸入輸出維數確定神經網絡結構,初始化BP神經網絡權值和閾值。
- 若分類器預測。訓練第$t$個弱分類器時,用訓練數據訓練BP神經網絡並且預測訓練數據輸出,得到預測序列$g(t)$的預測誤差$e_{t}$,誤差和$e_{t}$的計算公式為\[{e_t} = \sum\limits_i {{D_t}(i)} \;\;\;i = 1,2, \ldots ,m(g(t) \ne y)\]
- 計算預測序列權重。根據預測序列$g(t)$的預測誤差$e_{t}$計算序列的權重$a_{t}$,權重計算公式為\[{a_t} = \frac{1}{2}\ln \left( {\frac{{1 - {e_t}}}{{{e_t}}}} \right)\]
- 測試數據權重調整。根據預測序列權重$a_{t}$挑中下一輪訓練樣本的權重,調整公式為\[{D_{t + 1}}(i) = \frac{{{D_t}(i)}}{{{B_t}}} \cdot {e^{ - {a_t}{y_i}{g_t}({x_i})}}\;\;\;i = 1,2, \ldots ,m\]式中,$B_{t}$為歸一化因子,目的是在權重比例不變的情況下使分布權值和為1。
- 強分類函數。訓練$T$輪后得到$T$組弱分類函數$f(g_{t},a_{t})$,由$T$組弱分類函數組合得到了強分類函數\[h(x) = {\rm{sign}}[\sum\limits_{t = 1}^T {{a_t} \cdot f({g_t},{a_t})} ]\]
5.3 編程實現
5.3.1 載入數據(初始化)
%% 基於BP-Adaboost的強分類器分類 %% 清空環境變量 clc clear %% 加載數據 load('data.mat') %% 權重初始化 [mm,nn]=size(input_train); D(1,:)=ones(1,nn)/nn;
5.3.2 弱分類器訓練
%% 弱分類器分類 K=30; for i=1:K %訓練樣本歸一化 [inputn,inputps]=mapminmax(input_train); [outputn,outputps]=mapminmax(output_train); error(i)=0; %BP神經網絡構建 net=newff(inputn,outputn,[15,8]); net.trainParam.epochs=20; 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
5.3.3 統計結果
%% 強分類器分類結果 output=sign(at*test_simu); %% 分類結果統計 [tbl,chi2,p]=crosstab(output,output_test)
subplot(2,1,1) plot(output_test,'r',"LineWidth",1.3) subplot(2,1,2) plot(output,'b',"LineWidth",1.3)
%統計強分類器分類效果 error_q=(tbl(1,2)+tbl(2,1))/sum(sum(tbl)); error_q
%統計弱分離器效果 for i=1:K kk1=find(test_simu(i,:)>0); kk2=find(test_simu(i,:)<0); bb(kk1)=1; bb(kk2)=-1; [tbl1,~,~]=crosstab(bb,output_test); error_r(i)=(tbl1(1,2)+tbl1(2,1))/sum(sum(tbl)); end %統計弱分類器分類效果 error_r
mean(error_r)
5.4 強預測器
與強分類器設計方法類似,都是先賦予測試樣本權重,然后根據弱預測器預測結果調整測試樣本權重並確定弱預測器權重,最后把弱預測器序列加權作為強預測器。不同的是在強分類器中增加預測類別錯誤的樣本的權重,在強預測器中增加預測誤差超過閾值的樣本的權重。