Boosting 是一類算法的總稱,這類算法的特色是經過訓練若干弱分類器,而後將弱分類器組合成強分類器進行分類。爲何要這樣作呢?由於弱分類器訓練起來很容易,將弱分類器集成起來,每每能夠獲得很好的效果。俗話說,"三個臭皮匠,頂個諸葛亮",就是這個道理。這類 boosting 算法的特色是各個弱分類器之間是串行訓練的,當前弱分類器的訓練依賴於上一輪弱分類器的訓練結果。各個弱分類器的權重是不一樣的,效果好的弱分類器的權重大,效果差的弱分類器的權重小。值得注意的是,AdaBoost 不止適用於分類模型,也能夠用來訓練迴歸模型。這須要將弱分類器替換成迴歸模型,並改動損失函數。html
進入正題以前,先來看Adaboost的兩個 核心問題:
- 在每一輪學習以前,如何改變訓練數據的權值分佈?
- 如何將一組弱分類器組合成一個強分類器?
針對第一個問題,Adaboost算法的作法是:node
提升那些被前一輪弱分類器錯誤分類樣本的權值,而下降那些被正確分類樣本的權值。如此,那些沒有獲得正確分類的樣本,因爲其權值加大而受到後一輪的弱分類器的更大關注。ios
第二個問題,弱分類器的組合,AdaBoost採起加權多數表決的方法。具體地:算法
加大 分類偏差率小 的弱分類器的權值,使其在表決中起較大的做用;減少分類偏差率大的弱分類器的權值,使其在表決中起較小的做用。bootstrap
AdaBoost算法的巧妙之處就在於它將這些學習思路天然而且有效地在一個算法裏面實現。網絡
幾個誤區:app
重點關注如下4個問題框架
本節主要介紹Adaptive Boosting。首先經過講一個老師教小學生識別蘋果的例子,來引入Boosting的思想,即把許多「弱弱」的hypotheses合併起來,變成很強的預測模型。而後重點介紹這種算法如何實現,關鍵在於每次迭代時,給予樣本不一樣的係數u,宗旨是放大錯誤樣本,縮小正確樣本,獲得不一樣的小矩g。而且在每次迭代時根據錯誤ϵ值的大小,給予不一樣gt不一樣的權重。最終由不一樣的gt進行組合獲得總體的預測模型G。實際證實,Adaptive Boosting可以獲得有效的預測模型。函數
咱們先來看一個簡單的識別蘋果的例子,老師展現20張圖片,讓6歲孩子們經過觀察,判斷其中哪些圖片的內容是蘋果。從判斷的過程當中推導如何解決二元分類問題的方法。post
顯然這是一個監督式學習,20張圖片包括它的標籤都是已知的。首先,學生Michael回答說:全部的蘋果應該是圓形的。根據Michael的判斷,對應到20張圖片中去,大部分蘋果能被識別出來,但也有錯誤。其中錯誤包括有的蘋果不是圓形,並且圓形的水果也不必定是蘋果。以下圖所示:
上圖中藍色區域的圖片表明分類錯誤。顯然,只用「蘋果是圓形的」這一個條件不能保證分類效果很好。咱們把藍色區域(分類錯誤的圖片)放大,分類正確的圖片縮小,這樣在接下來的分類中就會更加註重這些錯誤樣本。
而後,學生Tina觀察被放大的錯誤樣本和上一輪被縮小的正確樣本,回答說:蘋果應該是紅色的。根據Tina的判斷,獲得的結果以下圖所示:
上圖中藍色區域的圖片同樣表明分類錯誤,即根據這個蘋果是紅色的條件,使得青蘋果和草莓、西紅柿都出現了判斷錯誤。那麼結果就是把這些分類錯誤的樣本放大化,其它正確的樣本縮小化。一樣,這樣在接下來的分類中就會更加註重這些錯誤樣本。
接着,學生Joey通過觀察又說:蘋果也多是綠色的。根據Joey的判斷,獲得的結果以下圖所示:
上圖中藍色區域的圖片同樣表明分類錯誤,根據蘋果是綠色的條件,使得圖中藍色區域都出現了判斷錯誤。一樣把這些分類錯誤的樣本放大化,其它正確的樣本縮小化,在下一輪判斷繼續對其修正。
後來,學生Jessica又發現:上面有梗的纔是蘋果。獲得以下結果:
乍看上面這個式子,彷佛很差求解。可是,咱們對它作一些等價處理,其中分式中分子能夠當作gt做用下犯錯誤的點,而分母能夠當作犯錯的點和沒有犯錯誤的點的集合,即全部樣本點。其中犯錯誤的點和沒有犯錯誤的點分別用橘色方塊和綠色圓圈表示:
綜上所述,完整的adaptive boosting(AdaBoost)Algorithm流程以下:
從咱們以前介紹過的VC bound角度來看,AdaBoost算法理論上知足:
【例1】
初始:
迭代五次:
【例3】
【拓展】爲何每一個樣本最終的結果取分類器獲得全部值排序以後的中位數做爲最終的結果?
答:由於中位數的值可以使得偏差最小,具體證實見下圖
base_estimator:A理論上能夠選擇任何一個分類或者回歸學習器,不過須要支持樣本權重。咱們經常使用的通常是CART決策樹或者神經網絡MLP。默認是決策樹.另外有一個要注意的點是,若是咱們選擇的AdaBoostClassifier算法是SAMME.R,則咱們的弱分類學習器還須要支持機率預測,也就是在scikit-learn中弱分類學習器對應的預測方法除了predict還須要有predict_proba。
algorithm:這個參數只有AdaBoostClassifier有。主要緣由是scikit-learn實現了兩種Adaboost分類算法,SAMME和SAMME.R。二者的主要區別是弱學習器權重的度量,SAMME使用了和咱們的原理篇裏二元分類Adaboost算法的擴展,即用對樣本集分類效果做爲弱學習器權重,而SAMME.R使用了對樣本集分類的預測機率大小來做爲弱學習器權重。因爲SAMME.R使用了機率度量的連續值,迭代通常比SAMME快,所以AdaBoostClassifier的默認算法algorithm的值也是SAMME.R。咱們通常使用默認的SAMME.R就夠了,可是要注意的是使用了SAMME.R, 則弱分類學習器參數base_estimator必須限制使用支持機率預測的分類器。SAMME算法則沒有這個限制。
loss:這個參數只有AdaBoostRegressor有,Adaboost.R2算法須要用到。有線性‘linear’, 平方‘square’和指數 ‘exponential’三種選擇, 默認是線性,通常使用線性就足夠了,除非你懷疑這個參數致使擬合程度很差。
n_estimators:過小容易欠擬合,太大容易過擬合,默認50
learning_rate:fk(x)=fk−1(x)+ναkGk(x),v就是學習率,較小的v意味着須要更多的弱學習器的迭代次數。一般咱們用步長和迭代次數一塊兒來決定算法的擬合效果,能夠從一個小一點的v開始調參,默認是1.
max_features:劃分時考慮的最大特徵數。默認是「None」,可使用不少種類型的值,默認是"None",意味着劃分時考慮全部的特徵數;若是是"log2"意味着劃分時最多考慮log2N個特徵;若是是"sqrt"或者"auto"意味着劃分時最多考慮N−−√個特徵。若是是整數,表明考慮的特徵絕對數。若是是浮點數,表明考慮特徵百分比,即考慮(百分比xN)取整後的特徵數。其中N爲樣本總特徵數。通常來講,若是樣本特徵數很少,好比小於50,咱們用默認的"None"就能夠了,若是特徵數很是多,咱們能夠靈活使用剛纔描述的其餘取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
max_depth:默承認以不輸入,若是不輸入的話,決策樹在創建子樹的時候不會限制子樹的深度。通常來講,數據少或者特徵少的時候能夠無論這個值。若是模型樣本量多,特徵也多的狀況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。經常使用的能夠取值10-100之間。
min_samples_split:內部節點再劃分所需最小樣本數。這個值限制了子樹繼續劃分的條件,若是某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 默認是2.若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。
min_samples_leaf:葉子節點最少樣本數。 這個值限制了葉子節點最少的樣本數,若是某葉子節點數目小於樣本數,則會和兄弟節點一塊兒被剪枝。 默認是1,能夠輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。
min_weight_fraction_leaf:葉子節點最小的樣本權重和。這個值限制了葉子節點全部樣本權重和的最小值,若是小於這個值,則會和兄弟節點一塊兒被剪枝。 默認是0,就是不考慮權重問題。通常來講,若是咱們有較多樣本有缺失值,或者分類樹樣本的分佈類別誤差很大,就會引入樣本權重,這時咱們就要注意這個值了。
max_leaf_nodes:經過限制最大葉子節點數,能夠防止過擬合,默認是"None」,即不限制最大的葉子節點數。若是加了限制,算法會創建在最大葉子節點數內最優的決策樹。若是特徵很少,能夠不考慮這個值,可是若是特徵分紅多的話,能夠加以限制,具體的值能夠經過交叉驗證獲得。
參考文獻:
【2】AdaBoost原理詳解