詳解Python?AdaBoost算法的實現(xiàn)
1. AdaBoost 算法簡介
Boosting是機器學(xué)習(xí)的三大框架之一,其特點是,訓(xùn)練過程中的諸多弱模型,彼此之間有著強依賴關(guān)系。Boost也被稱為增強學(xué)習(xí)或提升法。典型的代表算法是AdaBoost算法。AdaBoost算法的核心思想是:將關(guān)注點放在預(yù)測錯誤的樣本上。
AdaBoost 算法可以概括如下:
①假設(shè)共有m個樣本數(shù)據(jù),首先根據(jù)需求劃分好訓(xùn)練集數(shù)據(jù),按照一般思路,訓(xùn)練出第一個弱模型G1?(x)。
②對第一個弱模型G1?(x),計算該弱模型的分類錯誤率(或者說帶權(quán)錯誤率,但是因為第一次迭代訓(xùn)練是均等權(quán)重的,所以第一次迭代的帶權(quán)錯誤率等于普通的分類錯誤率)。
通過計算的分類錯誤率來確定該弱模型的權(quán)重,并更新訓(xùn)練集數(shù)據(jù)的權(quán)值分布。(這里涉及兩個權(quán)重不要弄混,先是模型權(quán)重,再是樣本數(shù)據(jù)權(quán)重)
記模型G1?(x)的權(quán)重為α1?,則F1?(x)=0+α1?G1?(x)(因為是第一次迭代,所以上一次可以暫記為0)。
③開始第二次迭代,使用更新后的樣本權(quán)重再次訓(xùn)練一個弱模型,然后將該弱模型與上一次訓(xùn)練的弱模型G2?(x),按照一定的規(guī)則得到的模型權(quán)重進行復(fù)合,F(xiàn)2?(x)=F1?(x)+α2?G2?(x)。
遂得到模型F2?(x)。
這里的重點,就在于α1?,α2?等,這些模型的權(quán)重的確定。
④循環(huán)以上過程n次(從第二次開始,每次計算的模型錯誤率,是帶權(quán)錯誤率)。
(n的值是自己指定的,希望的迭代次數(shù))。
直到得到模型Fn?(x)=Fn−1?(x)+Gn?(x),即為AdaBoost算法的輸出模型,此時的模型Fn?(x)是一個強訓(xùn)練模型。
2. AdaBoost算法 邏輯詳解
按照以上思路,下邊開始針對其中涉及的細(xì)節(jié)進行詳解。
2.1 數(shù)據(jù)
首先要面對的,是數(shù)據(jù)。假設(shè)樣本數(shù)據(jù)集D中共有m個樣本,并表示如下:
D={(x1?,y1?),(x2?,y2?),...,(xm?,ym?)}
其中xi?是特征向量,yi?是標(biāo)簽。標(biāo)簽的取值可以是1和-1。
AdaBoost算法每次訓(xùn)練模型的時候,使用的可以是從m個樣本中抽樣抽出的部分樣本,但是預(yù)測的時候必須統(tǒng)一,測試集必須是固定的m個樣本。
2.2 帶權(quán)錯誤率
使用AdaBoost算法,每次訓(xùn)練完弱模型后,需要進一步計算出其帶權(quán)錯誤率。
帶權(quán)錯誤率的公式如下:
如何理解這個式子:其中I()是指示函數(shù),即,當(dāng)括號內(nèi)條件滿足時值為1,當(dāng)不滿足條件時值為0。
這里括號內(nèi)的條件,即表示對某樣本的分類不正確??梢钥闯?,預(yù)測錯誤的樣本越多,該值則越大。
ωij?即第j次迭代中的第i個樣本的權(quán)重。
在第一次迭代中第一次訓(xùn)練弱模型時,每個樣本的初始權(quán)重是均等的,均為1/m?。
即每個樣本被選中的概率是均等的。AdaBoost算法首先基于該均等的權(quán)重訓(xùn)練一個簡單的弱學(xué)習(xí)器。
且因為均等權(quán)重,在第一次迭代的輸出的弱分類器的帶權(quán)錯誤率,是剛好等于預(yù)測錯誤的個數(shù)在m個樣本中所占的比重的。(即帶權(quán)錯誤率等于普通的分類錯誤率)。
2.3 損失函數(shù) 與 確定樣本權(quán)重
AdaBoost算法的損失函數(shù)為指數(shù)損失。
以第k次迭代為例,第k次迭代將得到模型Fk?(x)=Fk−1?(x)+αk?G(x),則Fk?(x)的損失函數(shù)函數(shù)為:
經(jīng)簡單分析,可以看出,對于每個樣本
若預(yù)測正確,則指數(shù)為負(fù),損失只增加 1 e \frac{1}{e} e1?;
若預(yù)測錯誤,則損失函數(shù)的損失會增加e。
將該損失函數(shù)進行進一步展開得:
因為Loss,即該表達式整體,表示的是模型Fk?(x)的損失,e−yi?αk?Gk?(xi?)表示的則是第k次迭代中,新訓(xùn)練弱模型,樣本和模型都加權(quán)后的損失。e−yi?Fk−1?(xi?)表示的則是第k−1次迭代中得到的模型Fk−1?的損失。
鑒于AdaBoost算法是利用上一個弱分類器Fk−1?的準(zhǔn)確率(或者說錯誤率) 和 模型權(quán)重來調(diào)整數(shù)據(jù),以獲得下一個分類器。繼續(xù)觀察該表達式,可以清晰地發(fā)現(xiàn),模型Fk?的損失,等于模型Gk?乘以模型權(quán)重αk?后,并經(jīng)過 以模型Fk−1?損失為度量尺度的樣本權(quán)重的調(diào)節(jié),后的損失。所以式子中的e−yi?Fk−1?(xi?)即可以理解為樣本權(quán)重ωk,i?。
對于每一個樣本,如果在上次迭代結(jié)果的模型Fk−1?中預(yù)測正確,則在第k次迭代中給予較小的樣本權(quán)重;如果在上次迭代結(jié)果的模型Fk−1?中預(yù)測錯誤,則在第k次迭代的預(yù)測中給予較大的樣本權(quán)重,這使得其在第k次迭代中預(yù)測的結(jié)果將擁有更大的話語權(quán)。如果再次預(yù)測錯誤將帶來更大的損失。
ωk,i?=e−yi?Fk−1?(xi?)這樣的表示還尚不完美,因為要將其作為權(quán)重,就還需要進行歸一化處理才好。
進一步將Fk−1?再展開可得到每次迭代的樣本權(quán)重,與上次迭代樣本權(quán)重之間的關(guān)系,并做歸一化處理得:
其中Zt?是歸一化因子。這里的?,其中ek−1?是第k-1次迭代分類的帶權(quán)錯誤率。
可以看到該表達式中還有模型權(quán)重αk−1?需要進一步確定。
2.4 確定模型權(quán)重
模型權(quán)重的確定這一環(huán)節(jié),涉及了較為麻煩的推導(dǎo)。這里只討論邏輯,具體推導(dǎo)過程不再細(xì)究。
以第k次迭代為例,第k次迭代將得到模型Fk?(x)=Fk−1?(x)+αk?G(x),我們需要確定的αk?的值。
以使得AdaBoost算法的損失函數(shù)Loss最小為目標(biāo),經(jīng)過一系列麻煩的推導(dǎo),最終得到
根據(jù)該表達式不難看出,分類誤差率越大,則對應(yīng)的弱分類器權(quán)重系數(shù)也就越小。
2.5 輸出模型
最終模型的表達式如下所示:
這里使用了符號函數(shù)sign,即若值大于0則表示標(biāo)簽1,小于0則表示標(biāo)簽-1。
3.AdaBoost算法的python實現(xiàn)
首先生成兩組高斯分布的數(shù)據(jù),用于模型訓(xùn)練和效果展示。
import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_gaussian_quantiles # 符合高斯分布,均值默認(rèn)為0,方差為2,200個樣本,2個特征,標(biāo)簽有2類,打亂 x1,y1 = make_gaussian_quantiles( cov=2, n_samples=200, n_features=2, n_classes=2, shuffle=True, random_state=1 ) # 滿足高斯分布,兩個特征,均值都為3,方差為1.5,300個樣本數(shù)據(jù),標(biāo)簽也有兩個類別,打亂 x2,y2 = make_gaussian_quantiles( mean=(3,3), cov=1.5, n_samples=300, n_features=2, n_classes=2, shuffle=True, random_state=1 ) # 水平拼接:x1, x2 X = np.vstack((x1,x2)) # 垂直拼接:標(biāo)簽值 y = np.hstack((y1,y2))
得到了有500個樣本的數(shù)據(jù)集,該數(shù)據(jù)集有兩個特征,標(biāo)簽取值有兩種。特征數(shù)據(jù)為X,標(biāo)簽數(shù)據(jù)為y。
做數(shù)據(jù)可視化展示如下:
# 可視化 plt.scatter(X[:,0],X[:,1],c=y) plt.show()
數(shù)據(jù)分布圖像如下圖所示:
然后訓(xùn)練模型:
# 基礎(chǔ)模型 使用決策樹分類器作為基礎(chǔ)模型 from sklearn.tree import DecisionTreeClassifier # 導(dǎo)入集成模型AdaBoostClassifier from sklearn.ensemble import AdaBoostClassifier # 實例化弱模型 設(shè)置最大深度為2 weak_classifier = DecisionTreeClassifier(max_depth=2) # 集成模型 每次訓(xùn)練隨機抽取300個樣本,學(xué)習(xí)率為0.8 clf = AdaBoostClassifier(base_estimator=weak_classifier,algorithm="SAMME",n_estimators=300,learning_rate=0.8) clf.fit(X,y)
為了更直觀地展示模型在每個點處的效果,接下來我們繪制等高線圖來呈現(xiàn)模型效果。
首先找出兩個特征x1和x2的最小值和最大值,然后在原來的基礎(chǔ)上分別減一、加一,來構(gòu)建網(wǎng)格化數(shù)據(jù)。
x1_min = X[:,0].min()-1 x1_max = X[:,0].max()+1 x2_min = X[:,1].min()-1 x2_max = X[:,1].max()+1 x1_new,x2_new = np.meshgrid(np.arange(x1_min,x1_max),np.arange(x2_min,x2_max))
做預(yù)測:
y_t = clf.predict(np.c_[x1_new.ravel(),x2_new.ravel()])
模型預(yù)測結(jié)果如下:
繪制等高線圖,并填充色彩:
y_t = y_t.reshape(x1_new.shape) plt.contourf(x1_new,x2_new,y_t) plt.scatter(X[:,0],X[:,1],c=y) plt.show()
輸出圖像效果如下:
到此這篇關(guān)于詳解Python AdaBoost算法的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python AdaBoost算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何設(shè)置PyCharm中的Python代碼模版(推薦)
這篇文章主要介紹了如何設(shè)置PyCharm中的Python代碼模版,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Python實現(xiàn)計算字符串中出現(xiàn)次數(shù)最多的字符示例
這篇文章主要介紹了Python實現(xiàn)計算字符串中出現(xiàn)次數(shù)最多的字符,涉及Python針對字符串的遍歷、統(tǒng)計等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Python利用神經(jīng)網(wǎng)絡(luò)解決非線性回歸問題實例詳解
這篇文章主要介紹了Python利用神經(jīng)網(wǎng)絡(luò)解決非線性回歸問題,結(jié)合實例形式詳細(xì)分析了Python使用神經(jīng)網(wǎng)絡(luò)解決非線性回歸問題的相關(guān)原理與實現(xiàn)技巧,需要的朋友可以參考下2019-07-07Python實現(xiàn)批量word文檔轉(zhuǎn)pdf并統(tǒng)計其頁碼
pypdf2是一個Python模塊,可以用來讀取、寫入和操作PDF文件,本文就將利用該模塊實現(xiàn)批量word文檔轉(zhuǎn)pdf并統(tǒng)計其頁碼,需要的小伙伴可以了解一下2023-05-05詳解pycharm連接遠(yuǎn)程linux服務(wù)器的虛擬環(huán)境的方法
這篇文章主要介紹了pycharm連接遠(yuǎn)程linux服務(wù)器的虛擬環(huán)境的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11利用Python實現(xiàn)去重聚合Excel數(shù)據(jù)并對比兩份數(shù)據(jù)的差異
在數(shù)據(jù)處理過程中,常常需要將多個數(shù)據(jù)表進行合并,并進行比對,以便找出數(shù)據(jù)的差異和共同之處,本文將介紹如何使用 Pandas 庫對兩個 Excel 數(shù)據(jù)表進行合并與比對,需要的可以參考下2023-11-11