三 Adaboost 算法
AdaBoost 是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器,即弱分類器,然后把這些弱分類器集合起來,構造一個更強的最終分類器。(很多博客里說的三個臭皮匠賽過諸葛亮)
算法本身是改變數據分布實現的,它根據每次訓練集之中的每個樣本的分類是否正確,以及上次的總體分類的准確率,來確定每個樣本的權值。將修改權值的新數據送給下層分類器進行訓練,然后將每次訓練得到的分類器融合起來,作為最后的決策分類器。
完整的adaboost算法如下
簡單來說,Adaboost有很多優點:
1)adaboost是一種有很高精度的分類器
2)可以使用各種方法構建子分類器,adaboost算法提供的是框架
3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單
4)簡單,不用做特征篩選
5)不用擔心overfitting!
四 Adaboost 舉例
也許你看了上面的介紹或許還是對adaboost算法雲里霧里的,沒關系,百度大牛舉了一個很簡單的例子,你看了就會對這個算法整體上很清晰了。
下面我們舉一個簡單的例子來看看adaboost的實現過程:
圖中,“+”和“-”分別表示兩種類別,在這個過程中,我們使用水平或者垂直的直線作為分類器,來進行分類。
第一步:
根據分類的正確率,得到一個新的樣本分布D2,一個子分類器h1
其中划圈的樣本表示被分錯的。在右邊的途中,比較大的“+”表示對該樣本做了加權。
也許你對上面的ɛ1,ɑ1怎么算的也不是很理解。下面我們算一下,不要嫌我啰嗦,我最開始就是這樣思考的,只有自己把算法演算一遍,你才會真正的懂這個算法的核心,后面我會再次提到這個。
算法最開始給了一個均勻分布 D 。所以h1 里的每個點的值是0.1。ok,當划分后,有三個點划分錯了,根據算法誤差表達式得到 誤差為分錯了的三個點的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根據表達式
的可以算出來為0.42. 然后就根據算法 把分錯的點權值變大。如此迭代,最終完成adaboost算法。
第二步:
根據分類的正確率,得到一個新的樣本分布D3,一個子分類器h2
第三步:
得到一個子分類器h3
整合所有子分類器:
因此可以得到整合的結果,從結果中看,及時簡單的分類器,組合起來也能獲得很好的分類效果,在例子中所有的。
五 Adaboost 疑惑和思考
到這里,也許你已經對adaboost算法有了大致的理解。但是也許你會有個問題,為什么每次迭代都要把分錯的點的權值變大呢?這樣有什么好處呢?不這樣不行嗎? 這就是我當時的想法,為什么呢?我看了好幾篇介紹adaboost 的博客,都沒有解答我的疑惑,也許大牛認為太簡單了,不值一提,或者他們並沒有意識到這個問題而一筆帶過了。然后我仔細一想,也許提高錯誤點可以讓后面的分類器權值更高。然后看了adaboost算法,和我最初的想法很接近,但不全是。 注意到算法最后的表到式為,這里面的a 表示的權值,是由
得到的。而a是關於誤差的表達式,到這里就可以得到比較清晰的答案了,所有的一切都指向了誤差。提高錯誤點的權值,當下一次分類器再次分錯了這些點之后,會提高整體的錯誤率,這樣就導致 a 變的很小,最終導致這個分類器在整個混合分類器的權值變低。也就是說,這個算法讓優秀的分類器占整體的權值更高,而挫的分類器權值更低。這個就很符合常理了。到此,我認為對adaboost已經有了一個透徹的理解了。
六 總結
最后,我們可以總結下adaboost算法的一些實際可以使用的場景:
1)用於二分類或多分類的應用場景
2)用於做分類任務的baseline
無腦化,簡單,不會overfitting,不用調分類器
3)用於特征選擇(feature selection)
4)Boosting框架用於對badcase的修正
只需要增加新的分類器,不需要變動原有分類器
由於adaboost算法是一種實現簡單,應用也很簡單的算法。Adaboost算法通過組合弱分類器而得到強分類器,同時具有分類錯誤率上界隨着訓練增加而穩定下降,不會過擬合等的性質,應該說是一種很適合於在各種分類場景下應用的算法。
第二篇
第二節,AdaBoost算法
(一)認識AdaBoost
AdaBoost算法有AdaBoost.M1和AdaBoost.M2兩種算法,AdaBoost.M1是我們通常所說的Discrete AdaBoost,而AdaBoost.M2是M1的泛化形式。關於AdaBoost算法的一個結論是:當弱分類器算法使用簡單的分類方法時,boosting的效果明顯地統一地比bagging要好.當弱分類器算法使用C4.5時,boosting比bagging較好,但是沒有前者明顯。后來又有學者提出了解決多標簽問題的AdaBoost.MH和AdaBoost.MR算法,其中AdaBoost.MH算法的一種形式又被稱為Real Boost算法---弱分類器輸出一個可能度,該值的范圍是整個R, 和與之相應的權值調整,強分類器生成的AdaBoost算法。
事實上:Discrete AdaBoost是指,弱分類器的輸出值限定在{-1,+1},每個弱分類器有相應的權值,從而構成一個強分類器。本文就詳解該二分類的AdaBoost算法,其他請參考‘Adaboost原理、算法以及應用’。
假設是二值分類問題,X表示樣本空間,Y={-1,+1}表示樣本分類。令S={(Xi,yi)|i=1,2,…,m}為樣本訓練集,其中Xi∈X,yi∈Y。再次重申,我們假設統計樣本的分布式是均勻分布的,如此在兩分類分類中(類別-1或者1)可以將閾值設為0。實際訓練數據中,樣本往往是不均衡的,需要算法來選擇最優閾值(如ROC曲線)。AdaBoost算法就是學習出一個分類器YM(x) --由M個弱分類器構成。在進行分類的時候,將新的數據點x代入,如果YM(x)小於0則將x的類別賦為-1,如果YM(x)大於0則將x的類別賦為1。均勻分布中閾值就是0,非均衡分布則還要根據ROC曲線等方法確定一個分類的最優閾值。
基本過程:針對不同的訓練集訓練一個個基本分類器(弱分類器),然后集成而構成一個更強的最終的分類器(強分類器)。不同的訓練集是通過調整訓練數據中每個樣本對應的權重實現的。每次訓練后根據此次訓練集中的每個樣本是否被分類正確以及上次的總體分類的准確率,來確定每個樣本的權值。將修改權值的新數據送給下層分類器進行訓練,然后將每次訓練得到的分類器融合起來,作為最后的決策分類器。
每個弱分類器可以是機器學習算法中的任何一個,如logistic回歸,SVM,決策樹等。
Adaboost有很多優點:
1)adaboost是一種有很高精度的分類器
2)可以使用各種方法構建子分類器,adaboost算法提供的是框架
3)當使用簡單分類器時,計算出的結果是可以理解的,而且弱分類器構造極其簡單
4)簡單,不用做特征篩選
5)不用擔心overfitting
(二)AdaBoost算法過程
完整的adaboost算法如下(訓練樣本樣本總數是N個,M是迭代停止后(積累錯誤率為0或者達到最大迭代次數)得到弱分類器數目)。
給定一個訓練數據集T={(x1,y1), (x2,y2)…(xN,yN)},其中實例,而實例空間
,yi屬於標記集合{-1,+1},Adaboost的目的就是從訓練數據中學習一系列弱分類器或基本分類器,然后將這些弱分類器組合成一個強分類器,流程如下:
最開始的時候,每個樣本對應的權重是相同的(1/m),在此樣本分布下訓練出一個基本分類器h1(x)。對於h1(x)錯分的樣本,則增加其對應樣本的權重;而對於正確分類的樣本,則降低其權重。這樣可以使得錯分的樣本突出出來,並得到一個新的樣本分布。同時,根據錯分的情況賦予h1(x)一個權重,表示該基本分類器的重要程度,錯分得越少權重越大。在新的樣本分布下,再次對基本分類器進行訓練,得到基本分類器h2(x)及其權重。依次類推,經過M次這樣的循環,就得到了M個基本分類器及對應權重。最后把這M個基本分類器按一定權重累加起來,就得到了最終所期望的強分類器YM(x)。迭代的停止條件就是達到了訓練樣本累加分類錯誤率為0.0或者達到了最大迭代次數。
(i)初始化訓練數據的權值分布,每一個訓練樣本最開始時被賦予相同的權值:1/N。
(ii)進行多輪迭代,迭代的停止條件就是達到了訓練樣本累加分類錯誤率為0.0或者達到了最大迭代次數L。用m = 1,2, ..., M表示迭代的第多少輪,也就是得到了多少個弱分類器,M<=L。
a.使用具有權值分布Dm的訓練數據集學習,得到基本分類器:
b.計算Gm(x)在訓練數據集上的分類誤差率
由上述式子可知,Gm(x)在訓練數據集上的誤差率em就是被弱分類器Gm(x)分類錯誤樣本的權值之和。就是在這里,訓練樣本權重因子發生了作用,所有的一切都指向了當前弱分類器的誤差。提高分類錯誤樣本的權值,下一個分類器學習中其“地位”就提高了(以單層決策樹為例,因為每次都要得到當前訓練樣本中em最小的決策樁);同時若這次的弱分類器再次分錯了這些點,那么其錯誤率em也就更大,最終導致這個分類器在整個混合分類器的權值am變低---讓優秀的分類器占整體的權值更高,而挫的分類器權值更低。
c. 計算Gm(x)的權值系數,am表示Gm(x)在最終分類器中的重要程度(目的:得到基本分類器在最終分類器中所占的權重):
可知:em <= 1/2時(兩分類Adaboost算法em不可能大於1/2),am >= 0;am隨着em的減小而增大,意味着分類誤差率越小的本分類器在最終分類器中的作用越大。
另外,若某一個若分類器分類錯誤率為0計算am將會發生除數為0的異常,這屬於邊界處理。此時可以根據數據集的具體情況設定錯誤率為一個很小的數值,例如1e-16。觀察樣本權重更新就可以知道:沒有錯分,所有樣本的權重就不會進一步調整,樣本權重相當於沒有改變。當然,該弱分類器權重alpha將較大,但是因為算法並不因此停止,如果后面還有其他弱分類器也能達到訓練錯誤率為0,也同樣會有較大的權重,從而避免由單個弱分類器完全決定強分類器的情況。當然,如果第一個弱分類器錯誤率就為0,那么整個分類就完成了,它有再大的權重alpha也無妨。采用下述修正方案:
alpha = float(0.5*log((1.0-error)/max(error,1e-16) ))
d. 更新訓練數據集的權值分布(目的:得到樣本的新的權值分布),用於下一輪迭代。這使得被基本分類器Gm(x)分類錯誤的樣本的權值增大,而被正確分類樣本的權值減小。通過這樣的方式,AdaBoost算法提高了較難分類的樣本的‘地位’。
Zm的意義在於讓權重因子之和為1.0,使向量D是一個概率分布向量。其定義是
(iii) 組合各個弱分類器得到最終分類器,如下:
(三)Python實現單決策樹AdaBoost算法
單層決策樹(decision stump,也叫決策樹樁)是一種簡單的決策樹,決策樹中只有一個樹樁,也就是僅基於樣本單個特征來做決策分類。單層決策樹是AdaBoost算法中最流行的弱分類器。
AdaBoost把多個不同的決策樹用一種非隨機的方式組合起來,表現出驚人的性能。第一,把決策樹的准確率大大提高,可以與SVM媲美。第二,速度快,且基本不用調參數。第三,幾乎不Overfitting。本節就以多個單層決策樹做基本分類器實現AdaBoost算法,值得注意的是每個基本分類器單層決策樹決策用分類使用的特征都是在樣本N個特征中做最優選擇的(也就是說在分類特征選擇這個層面,每個單層決策樹彼此之間是完全獨立的,可能若干個單層決策樹都是基於同一個樣本特征),而非樣本特征的串聯。
該版本的AdaBoost分類算法包含decisionstump.py(decisionstump對象,其屬性是包含dim, thresh, ineqtype三個域的決策樹樁,方法有buildstump()、stumpClassify()等。),adaboost.py, object_json.py, test.py,其中adaboot.py實現分類算法,對象adaBoost包含屬性分類器詞典adaboostClassifierDict和adaboost train&classify方法等。為了存儲和傳輸更少的字節數,也可以在adaboost模塊增加一個新類adaboostClassifier只用來存儲分類詞典和分類算法(本包中沒有這么做)。test模塊則包含了一個使用adaboost分類器進行分類的示例。
由於adaboost算法每一個基本分類器都可以采用任何一種分類算法,因此通用的方案是采用dict來存儲學習到的AdaBoost分類器,結構如下圖:
adaboost對象可以針對決策樹、SVM等定義私有的各種弱分類算法,train和classifier方法則會根據當前的弱分類器類型創建響應的弱分類器實例並調用私有弱分類train\classifer方法完成train\classify。需要記住的是,adaboost train方法創建的弱分類器對象只用來調用相應的弱分類器方法,而該弱分類實例所有的屬性則存儲在adaboostClassifierDict中,這樣可以減少弱分類器實例數目。另外,方法jsonDumpsTransfer()和jsonLoadTransfer()則要根據adaboostClassifierDict中支持的弱分類器類型刪除\創建相應實例,從而支持JSON存儲和解析。
采取上圖中的分類器存儲方案及相應的分類函數,AdaBoost支持每一個基本分類器在決策樹、貝葉斯、SVM等監督學習算法中做最優選擇。分類其中adaboostClassifierDict中的classifierType用戶可以自己指定,從而在上述分類存儲結構的基礎上做一些利於分類器程序編寫的調整。我實現的單層決策樹Adaboost指定classifierType為desicionstump,即基本分類器采用desicionstump,每一個弱分類器都是一個DS對象。所以存儲結構可以調整為下圖所示(利於分類函數實現):
通過調整adaboost算法弱分類器的數目,會得到分類錯誤率不同的adaboost分類器。測試證明,numIt=50時錯誤率最低。
AdaBoost分類算法學習包的下載地址是:
machine learning adaboost
(四)Adaboost應用
由於adaboost算法是一種實現簡單、應用也很簡單的算法,應該說是一種很適合於在各種分類場景下應用的算法。adaboost算法的一些實際可以使用的場景:
1)用於二分類或多分類的應用場景
2)用於做分類任務的baseline--無腦化,簡單,不會overfitting,不用調分類器
3)用於特征選擇(feature selection)
4)Boosting框架用於對badcase的修正--只需要增加新的分類器,不需要變動原有分類器