目前集成學(xué)習(xí)有bagging沪么、boosting算法秘豹,兩者異同可以參考這篇博客
隨機(jī)森林(RandomForest)是一種bagging的方法骤肛;
Adaboost贝奇、GBDT虹菲、XGBoost 都是一種boosting方法。
本文只介紹AdaBoost的基本原理方便自己復(fù)習(xí)掉瞳,并附上兩年前寫的matlab程序毕源。
基本原理
參考:李航的《統(tǒng)計(jì)學(xué)習(xí)方法》
AdaBoost通過加大分類誤差率小的弱分類器的權(quán)重,使其在表決中起的作用較大陕习,減小分類誤差率大的弱分類器的權(quán)重,使其在表決中起較小的作用该镣。
- 訓(xùn)練數(shù)據(jù)集{(x1,y1),(x1,y2),...,(xn,yn)}
- 初始化訓(xùn)練樣本的概率權(quán)重分布D1=(D11,D12,...,D1n)冻璃,和為1,初始一般用均勻分布
- 使用弱分類器對訓(xùn)練數(shù)據(jù)進(jìn)行分類,使得分類錯(cuò)誤的樣本的概率權(quán)重的和最小省艳,e_1 = \sum D_{1j},j代表分類錯(cuò)誤的樣本跋炕,得到弱分類器G1。
- 計(jì)算分類器G1的系數(shù):
\alpha_1 = \frac{1}{2} log^{\frac{1-e_1}{e_1}}- 更新概率權(quán)重D2
D_{2i} = D_{1i} *e^{-\alpha_1y_iG_1(x_i)}律适,再歸一化:Z = \sum D_{2i}辐烂, D_{2i} = \frac{D_{2i}}{Z}- 再根據(jù)D2按上邊步驟得到弱分類器G2,和系數(shù)\alpha_2
- 循環(huán)得到系列弱分類器G1,G2,G3,...Gm
- 線性加權(quán)構(gòu)建強(qiáng)分類器:f(x) = sign(\sum_{k=1}^{m}\alpha_kG_k)
舉例表示
matlab程序?qū)崿F(xiàn)
adaboost_model.m
模型函數(shù):
%%---------- 《提升算法-多維》:建模專用 -------------用于二分類
%說明:
% 輸入X=[n*m],Y=[n*1](-1/1二類值);
% 輸出CUT=[p*4],CUT(:,1)為切分點(diǎn)捂贿,CUT(:,2:3)為切分值纠修,CUT(:,4)為權(quán)重系數(shù),CUT(:,5)為變量標(biāo)志位厂僧;
% ERR為訓(xùn)練誤差精度扣草,ECHO為訓(xùn)練最大步數(shù);
% 使用C_CART函數(shù)進(jìn)行切分颜屠。
%例如:
% x=[2 4 0 3 1 5 6 7 8 9;2 6 7 22 5 15 4 9 8 1;5 8 12 9 0 11 30 7 6 4;5 4 9 0 0.2 2 7 6 3 1]';
% y=[1 -1 1 -1 1 -1 1 1 1 -1]';
%作者:zlw
%時(shí)間:2016-07-27
%---------------------------------------------------
%%
function [ CUT ] = adaboost_model( x,y,ERR,ECHO)
%ADABOOST_MODEL Summary of this function goes here
% Detailed explanation goes here
%%自適應(yīng)提升算法(adaboosting)實(shí)現(xiàn)多維特征進(jìn)行 二分類(-1,1)問題辰妙;
xy=[x,y];
%--------------------------------------------
[n,m]=size(x);
%xy=sortrows(xy,1);%按某列排序;
for i=1:m
[XY(:,:,i),DI(:,i)]=sortrows(xy,i);%將矩陣按照第i列升序跟著排列
end
D=1/n*ones(n,m);%樣本初始權(quán)值汽纤;
%------- -------
y=xy(:,end);
echo=1;p_err=1;Fx=0;CUT=[];
while (p_err>ERR && echo<ECHO)
G0=zeros(n,1);D0=zeros(n,1);
for i=1:m
[cut(i),cut_v(i,:),err(i),G(:,i)] = C_cart(XY(:,i,i) ,XY(:,end,i),D(:,i));%計(jì)算各個(gè)變量分類的最優(yōu)切分點(diǎn)上岗、誤差、對應(yīng)的預(yù)測值
end
min_err=min(err); %最小分類誤差蕴坪,(需要注意err可能為0)
min_i=find(err==min_err);min_i=min_i(1);%分類誤差最小的變量序號(hào)
op_cut=cut(min_i); %最優(yōu)分類閾值
op_G=G(:,min_i); %分類值
op_cutv=cut_v(min_i,:);%分類值
alpha=0.5*log((1-min_err)/min_err); %G的系數(shù)
CUT=[CUT;op_cut,op_cutv,alpha,min_i];
G0(DI(:,min_i))=op_G;%原始序號(hào)下的預(yù)測值
Fx=alpha*G0+Fx;%決策函數(shù)
%計(jì)算分類錯(cuò)誤率
a=Fx>0;
b=y>0;
p_err=sum(abs(a-b))/n;
%---------- 更新權(quán)值 ----------
sumD=0;
for i=1:n
D(i,min_i)=D(i,min_i)*exp(-alpha*XY(i,end,min_i)*op_G(i));
sumD=sumD+D(i,min_i);
end
D(:,min_i)=D(:,min_i)/sumD;
D0(DI(:,min_i))=D(:,min_i);%原始序號(hào)下的樣本權(quán)值
for k=1:m
D(:,k)=D0(DI(:,k)) ;%各列為列排序后的樣本權(quán)值
end
echo=echo+1;
end
end
C_cat.m
切分函數(shù):
function [ op_cut,op_cutv ,min_err,op_G] = C_cart( x,y,D )
%C_CART Summary of this function goes here
% Detailed explanation goes here
[n,~]=size(x);
class_y=unique(y);
pre0=ones(n,1);
for i=1:n-1
cut(i)= (x(i)+x(i+1))/2;%分類閾值
%----- %得到分類誤差
pre(1:i)=class_y(1)*pre0(1:i);%歸為類1
pre(i+1:n)=class_y(2)*pre0(i+1:n);%歸為類2
G1=[pre(1:i),pre(i+1:n)]';
err1=0;
for j=1:n
if y(j)~=pre(j)
err1=err1+D(j);
end
end
pre(1:i)=class_y(2)*pre0(1:i);%歸為類2
pre(i+1:n)=class_y(1)*pre0(i+1:n);%歸為類1
G2=[pre(1:i),pre(i+1:n)]';
err2=0;
for j=1:n
if y(j)~=pre(j)
err2=err2+D(j);
end
end
if err1<=err2
err(i)=err1;G(:,i)=G1;cut_v(i,:)=[class_y(1),class_y(2)];
else
err(i)=err2;G(:,i)=G2;cut_v(i,:)=[class_y(2),class_y(1)];
end
%--------------------------
end
min_err=min(err); %最小分類誤差
min_i=find(err==min_err);min_i=min_i(1);
op_cut=cut(min_i); %最優(yōu)分類閾值
op_G=G(:,min_i); %分類值
op_cutv=cut_v(min_i,:);
end
adaboost_pre.m
預(yù)測函數(shù):
%%---------- 《提升回歸樹算法》:預(yù)測專用 -------------
%說明:
% 輸入:測試數(shù)據(jù)X=[n*m],生成樹CUT=[p*5],CUT(:,1)為切分點(diǎn)肴掷,CUT(:,2:3)為切分值,CUT(:,4)為權(quán)重系數(shù)背传,CUT(:,5)為變量標(biāo)志位呆瞻;
% 輸出:預(yù)測Y=[n*1];
%
%作者:zlw
%時(shí)間:2016-07-27
%%
function [ Y ] = adaboost_pre( x, CUT )
%ADABOOST_PRE Summary of this function goes here
% Detailed explanation goes here
[n,~]=size(x);
Y=[];
for i=1:n
y_predict=0;
for j=1:size(CUT,1)
n_r=CUT(j,end);
if x(i,n_r)<CUT(j,1)
y_predict=y_predict+CUT(j,4)*CUT(j,2);
else
y_predict=y_predict+CUT(j,4)*CUT(j,3);
end
end
Y = [Y;y_predict];
end
end
test.m
測試文件
clc;clear;close all;
x=[2 4 0 3 1 5 6 7 8 9;2 6 7 22 5 15 4 9 8 1;5 8 12 9 0 11 30 7 6 4;5 4 9 0 0.2 2 7 6 3 1]';
% x=[2 4 0 3 1 5 6 7 8 9]';
y=[1 -1 1 -1 1 -1 1 1 1 -1]';
ERR=0.08;%最大訓(xùn)練誤差
ECHO=100;%最大訓(xùn)練循環(huán)次數(shù)
[ CUT ] = adaboost_model( x,y ,ERR,ECHO);%訓(xùn)練
[ Y ] = adaboost_pre( x, CUT );%預(yù)測
%計(jì)算分類錯(cuò)誤率
a=Y>0;
b=y>0;
p_err=sum(abs(a-b))/size(x,1);
disp(CUT);
disp(p_err);