欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python?AdaBoost算法的實現(xiàn)

 更新時間:2022年10月19日 11:38:58   作者:侯小啾  
Boosting是機器學習的三大框架之一。Boost也被稱為增強學習或提升法,其中典型的代表算法是AdaBoost算法。本文介紹了AdaBoost算法及python實現(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論