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