Python实现Adaboost
1.Adaboost概念
提升方法的思路是綜合多個分類器,得到更準(zhǔn)確的分類結(jié)果。 即“三個臭皮匠頂個諸葛亮”。《統(tǒng)計學(xué)習(xí)方法》稱AdaBoost是提升算法的代表,所謂提升算法,指的是一種常用的統(tǒng)計學(xué)習(xí)方法,應(yīng)用廣泛且有效。在分類問題中,它通過改變訓(xùn)練樣本的權(quán)重,學(xué)習(xí)多個分類器,并將這些分類器進(jìn)行線性組合,提髙分類的性能。
AdaBoost算法的基本思想:
1)多輪訓(xùn)練,多個分類器
2)每輪訓(xùn)練增加錯誤分類樣本的權(quán)值,降低正確分類樣本的權(quán)值
3)降低錯誤率高的分類器的權(quán)值,增加正確率高的分類器的權(quán)值
2.Adaboost算法流程
給定一個二類分類的訓(xùn)練數(shù)據(jù)集,T={(x1,y1),(x2,y2),…(xn,yn)}T=\{({x_1},y_1),({x_2},y_2),\dots({x_n},y_n)\}T={(x1?,y1?),(x2?,y2?),…(xn?,yn?)},其中χi∈X?Rnχ_i∈X? R^nχi?∈X?Rn表示實例的特征向量,yi∈Y∈{+1,?1}y_i∈Y\in\{+1,-1\}yi?∈Y∈{+1,?1},XXX是實例空間,YYY是標(biāo)記集合。AdaBoost利用以下算法,從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)一系列弱分類器或基本分類器,并將這些弱分類器線性組合成為一個強(qiáng)分類器。
AdaBoost算法
輸入:訓(xùn)練數(shù)據(jù)集T={(x1,y1),(x2,y2),…(xn,yn)}T=\{({x_1},y_1),({x_2},y_2),\dots({x_n},y_n)\}T={(x1?,y1?),(x2?,y2?),…(xn?,yn?)},其中χi∈X?Rnχ_i∈X? R^nχi?∈X?Rn,yi∈Y∈{+1,?1}y_i∈Y\in\{+1,-1\}yi?∈Y∈{+1,?1};弱學(xué)習(xí)算法;
輸出:最終分類器G(x)G(x)G(x)。
(1)初始化訓(xùn)練數(shù)據(jù)的權(quán)值分布
D1=(W11,...,W1i,...,W1n)D_1=(W_{11},...,W_{1i},...,W_{1n})D1?=(W11?,...,W1i?,...,W1n?)
每個w的下標(biāo)由兩部分構(gòu)成,前一個數(shù)表示當(dāng)前迭代次數(shù),與D的下標(biāo)保持一致,后一個數(shù)表示第幾個權(quán)值,與位置保持一致。初始情況下,每個權(quán)值都是均等的。
(2)對m=1,2,...Mm=1,2,...Mm=1,2,...M
(這里的M表示訓(xùn)練的迭代次數(shù),是由用戶指定的。每輪迭代產(chǎn)生一個分類器,最終就有M個分類器,當(dāng)然我們也可以設(shè)置一些條件,滿足某些條件時跳出迭代,例如,所有樣本都分對了,誤差為0時,跳出迭代):
(a)使用具有權(quán)值分布的訓(xùn)練數(shù)據(jù)集學(xué)習(xí),得到基本分類器
Gm(x):X→{+1,?1}G_m(x):X{\rightarrow} \{+1,-1\}Gm?(x):X→{+1,?1}
(b)在Gm(x)G_m(x)Gm?(x)訓(xùn)練數(shù)據(jù)集上的分類誤差率
em=∑iNP(Gm(xi)≠yi)=∑iNwmiI(Gm(xi)≠yi))e_m=\sum_i^NP(G_m(x_i){\neq}y_i)=\sum_i^Nw_{mi}I(G_m(x_i){\neq}y_i))em?=∑iN?P(Gm?(xi?)??=yi?)=∑iN?wmi?I(Gm?(xi?)??=yi?))
分類誤差率這個名字可能產(chǎn)生誤解,這里其實是個加權(quán)和。
(c)計算Gm(x)G_m(x)Gm?(x)的系數(shù)
αm=12log1?emem\alpha_m = \frac{1}{2}log{\frac{1-e_m}{e_m}}αm?=21?logem?1?em??
這里的對數(shù)是自然對數(shù)。ama_mam?表示Gm(x)G_m(x)Gm?(x)在最終分類器中的重要性。由式αm=12log1?emem\alpha_m = \frac{1}{2}log{\frac{1-e_m}{e_m}}αm?=21?logem?1?em??可知,當(dāng)em<=1/2e_m<=1/2em?<=1/2時,am>=0a_m>=0am?>=0,并且ama_mam?隨著eme_mem?的減小而增大,所以分類誤差率越小的基本分類器在最終分類器中的作用越大。
(d)更新訓(xùn)練數(shù)據(jù)集的權(quán)值分布
Dm+1=(Wm+1,1,...,Wm+1,i,...,Wm+1,n)D_{m+1}=(W_{m+1,1},...,W_{m+1,i},...,W_{m+1,n})Dm+1?=(Wm+1,1?,...,Wm+1,i?,...,Wm+1,n?)
wm+1,i=wm,iZme?αmyiGm(xi)w_{m+1, i}=\frac{w_{m, i}}{Z_m}e^{-\alpha_my_iG_m(x_i)}wm+1,i?=Zm?wm,i??e?αm?yi?Gm?(xi?)
y只有正負(fù)一兩種取值,所以上式可以寫作:
wm+1,i={wmiZme?am,Gm(xi)=yiwmiZmeam,Gm(xi)≠yiw_{m+1,i}=\begin{cases} \frac{w_{mi}}{Z_m}e^{-a_m},G_m(x_i)=y_i \\ \frac{w_{mi}}{Z_m}e^{a_m},G_m(x_i){\neq}y_i \end{cases}wm+1,i?={Zm?wmi??e?am?,Gm?(xi?)=yi?Zm?wmi??eam?,Gm?(xi?)??=yi??
這里,ZmZ_mZm?是規(guī)范化因子
Zm=∑i=1Nwmiexp(?αmyiGm(xi))Z_m=\sum_{i=1}^Nw_{m i}exp({-\alpha_my_iG_m(x_i)})Zm?=∑i=1N?wmi?exp(?αm?yi?Gm?(xi?))
它使Dm+1D_{m+1}Dm+1?成為一個概率分布。
由此可知,被基本分類器誤分類樣本的權(quán)值得以擴(kuò)大,而被正確分類樣本的權(quán)值卻得以縮小。兩相比較,誤分類樣本的權(quán)值被放大e2am=1?ememe^{2am} = {\frac{1-e_m}{e_m}}e2am=em?1?em??倍。因此,誤分類樣本在下一輪學(xué)習(xí)中起更大的作用。不改變所給的訓(xùn)練數(shù)據(jù),而不斷改變訓(xùn)練數(shù)據(jù)權(quán)值的分布,使得訓(xùn)練數(shù)據(jù)在基本分類器的學(xué)習(xí)中起不同的作用,這是AdaBoost的一個特點(diǎn)。
(3)構(gòu)建基本分類器的線性組合:
f(x)=∑m=1MamGm(x)f(x)=\sum_{m=1}^{M}a_mG_m(x)f(x)=∑m=1M?am?Gm?(x)
得到最終分類器:
G(x)=sign(f(x))=sign(∑m=1MamGm(x))G(x)=sign(f(x))=sign(\sum_{m=1}^{M}a_mG_m(x))G(x)=sign(f(x))=sign(∑m=1M?am?Gm?(x))
這里需要注意的是,我們得到的是M個f(x)方程,需要將每個方程的結(jié)果求和,最好只取結(jié)果的正負(fù)號,在Adaboost中我們的預(yù)測結(jié)果與數(shù)值是無關(guān)的。
3.完整代碼
代碼運(yùn)行結(jié)果:
參考資料:
1、《機(jī)器學(xué)習(xí)實戰(zhàn)》Peter Harrington著
2、《機(jī)器學(xué)習(xí)》西瓜書,周志華著
3、 斯坦福大學(xué)公開課 :機(jī)器學(xué)習(xí)課程
4、機(jī)器學(xué)習(xí)視頻,鄒博
5、《統(tǒng)計學(xué)習(xí)方法》李航
6、提升方法
7、分類——組合算法之提升1:AdaBoost提升算法以及Python實現(xiàn)
轉(zhuǎn)載于:https://www.cnblogs.com/hanzi5/p/10105613.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Python实现Adaboost的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat Connector 连接器
- 下一篇: 同一台电脑安装python2python