1. 程式人生 > 其它 >資料探勘領域十大經典演算法之—AdaBoost演算法(超詳細附程式碼)

資料探勘領域十大經典演算法之—AdaBoost演算法(超詳細附程式碼)

相關文章:

資料探勘領域十大經典演算法之—C4.5演算法(超詳細附程式碼)
資料探勘領域十大經典演算法之—K-Means演算法(超詳細附程式碼)
資料探勘領域十大經典演算法之—SVM演算法(超詳細附程式碼)
資料探勘領域十大經典演算法之—Apriori演算法
資料探勘領域十大經典演算法之—EM演算法
資料探勘領域十大經典演算法之—PageRank演算法
資料探勘領域十大經典演算法之—K-鄰近演算法/kNN(超詳細附程式碼)
資料探勘領域十大經典演算法之—樸素貝葉斯演算法(超詳細附程式碼)
資料探勘領域十大經典演算法之—CART演算法(超詳細附程式碼)
簡介
Adaboost演算法是一種提升方法,將多個弱分類器,組合成強分類器。
AdaBoost,是英文”Adaptive Boosting“(自適應增強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。
它的自適應在於:前一個弱分類器分錯的樣本的權值(樣本對應的權值)會得到加強,權值更新後的樣本再次被用來訓練下一個新的弱分類器。在每輪訓練中,用總體(樣本總體)訓練新的弱分類器,產生新的樣本權值、該弱分類器的話語權,一直迭代直到達到預定的錯誤率或達到指定的最大迭代次數。
總體——樣本——個體三者間的關係需要搞清除
總體N。樣本:{ni}i從1到M。個體:如n1=(1,2),樣本n1中有兩個個體。

演算法原理
(1)初始化訓練資料(每個樣本)的權值分佈:如果有N個樣本,則每一個訓練的樣本點最開始時都被賦予相同的權重:1/N。
(2)訓練弱分類器。具體訓練過程中,如果某個樣本已經被準確地分類,那麼在構造下一個訓練集中,它的權重就被降低;相反,如果某個樣本點沒有被準確地分類,那麼它的權重就得到提高。同時,得到弱分類器對應的話語權。然後,更新權值後的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
(3)將各個訓練得到的弱分類器組合成強分類器。各個弱分類器的訓練過程結束後,分類誤差率小的弱分類器的話語權較大,其在最終的分類函式中起著較大的決定作用,而分類誤差率大的弱分類器的話語權較小,其在最終的分類函式中起著較小的決定作用。換言之,誤差率低的弱分類器在最終分類器中佔的比例較大,反之較小。

演算法流程
第一步:
初始化訓練資料(每個樣本)的權值分佈。每一個訓練樣本,初始化時賦予同樣的權值w=1/N。N為樣本總數。

D1表示,第一次迭代每個樣本的權值。w11表示,第1次迭代時的第一個樣本的權值。
N為樣本總數。
第二步:進行多次迭代,m=1,2….M。m表示迭代次數。
a)使用具有權值分佈Dm(m=1,2,3…N)的訓練樣本集進行學習,得到弱的分類器。

該式子表示,第m次迭代時的弱分類器,將樣本x要麼分類成-1,要麼分類成1.那麼根據什麼準則得到弱分類器?
準則:該弱分類器的誤差函式最小,也就是分錯的樣本對應的 權值之和,最小。

b)計算弱分類器Gm(x)的話語權,話語權am表示Gm(x)在最終分類器中的重要程度。其中em,為上步中的εm(誤差函式的值)

該式是隨em減小而增大。即誤差率小的分類器,在最終分類器的 重要程度大。
c)更新訓練樣本集的權值分佈。用於下一輪迭代。其中,被誤分的樣本的權值會增大,被正確分的權值減小。

Dm+1是用於下次迭代時樣本的權值,Wm+1,i是下一次迭代時,第i個樣本的權值。
其中,yi代表第i個樣本對應的類別(1或-1),Gm(xi)表示弱分類器對樣本xi的分類(1或-1)。若果分對,yi*Gm(xi)的值為1,反之為-1。其中Zm是歸一化因子,使得所有樣本對應的權值之和為1.

該公式並不難,仔細看看、想想。
第三步迭代完成後,組合弱分類器。
首先,
然後,加個sign函式,該函式用於求數值的正負。數值大於0,為1。小於0,為-1.等於0,為0.得到最終的強分類器G(x)


*額外(關於權值、話語權、弱分類器準則的公式,想深入瞭解的可以看看。使用的話,知道上面的內容已經足夠)
利用前向分佈加法模型(簡單說,就是把一起求n個問題,轉化為每次求1個問題,再其基礎上,求下一個問題,如此迭代n次),adaboost演算法可以看成,求式子的最小。tn時樣本n對應的正確分類,fm是前m個分類器的結合(這裡乘了1/2,因為博主看的文章的am是1/2*log(~~),這個無所謂,無非是多個1/2少個1/2。


然後,假設前m-1個相關的引數已經確定。通過化簡E這個式子,我們可以得到:

其中,是一個常量。

然後,

其中,Tm是分類正確的樣本的權值,Mm是分類錯誤的樣本的權值。式子不算難,自己多看幾遍就能理解了。
到現在,可以看出,最小化E,其實就是最小化

這個式子是什麼?看看前面,這個就是找弱分類器時的準則!
然後得到了弱分類器ym後,我們可以進推匯出am和樣本的權值。這裡給出am的推導過程(手寫的,字很爛)其中,ε是
該圖中,最右邊的是“+exp(-am/2)*1”,寫得太亂(—_—)

最後求出來的am沒有1/2,這個無所謂。因為這裡定義fm是多乘了個1/2。

優點
(1)精度很高的分類器
(2)提供的是框架,可以使用各種方法構建弱分類器
(3)簡單,不需要做特徵篩選
(4)不用擔心過度擬合

實際應用
(1)用於二分類或多分類
(2)特徵選擇
(3)分類人物的baseline

程式碼
程式碼已在github上實現,這裡也貼出來

# encoding=utf-8

import pandas as pd
import time

from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score

from sklearn.ensemble import AdaBoostClassifier

if __name__ == '__main__':

print("Start read data...")
time_1 = time.time()

raw_data = pd.read_csv('../data/train_binary.csv', header=0)
data = raw_data.values

features = data[::, 1::]
labels = data[::, 0]

# 隨機選取33%資料作為測試集,剩餘為訓練集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)

time_2 = time.time()
print('read data cost %f seconds' % (time_2 - time_1))


print('Start training...')
# n_estimators表示要組合的弱分類器個數;
# algorithm可選{‘SAMME’, ‘SAMME.R’},預設為‘SAMME.R’,表示使用的是real boosting演算法,‘SAMME’表示使用的是discrete boosting演算法
clf = AdaBoostClassifier(n_estimators=100,algorithm='SAMME.R')
clf.fit(train_features,train_labels)
time_3 = time.time()
print('training cost %f seconds' % (time_3 - time_2))


print('Start predicting...')
test_predict = clf.predict(test_features)
time_4 = time.time()
print('predicting cost %f seconds' % (time_4 - time_3))


score = accuracy_score(test_labels, test_predict)
print("The accruacy score is %f" % score)

測試資料集為經過二分類處理後的MNIST資料集,獲取地址train_binary.csv
————————————————
版權宣告:本文為CSDN博主「fuqiuai」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/fuqiuai/article/details/79482487