近來初步學習machine learning。發現adaboost 挺幽默,就把自己的一些思考寫下來。
首要參看了http://stblog.baidu-tech.com/?p=19,其實說抄也不為過,但是我增加了一些我認為有意思的東西,所以我仍是把它貼出來了,呵呵。
---圖像進行了修改
一 Boosting 算法的來歷
boost 算法系列的來歷來自於PAC Learnability(PAC 可學習性)。這套理論首要研討的是啥時分一個疑問是可被學習的,當然也會評論關於可學習的疑問的具體的學習算法。這套理論是由Valiant提出來的,也因此(還有其他貢獻哈)他獲得了2010年的圖靈獎。這兒也貼出Valiant的頭像,標明下俺等菜鳥的崇拜之情。哈哈哈


PAC 定義了學習算法的強弱
弱學習算法---辨認過失率小於1/2(即准確率僅比隨機猜測略高的學習算法)
強學習算法---辨認准確率很高並能在多項式時間內結束的學習算法
一同 ,Valiant和 Kearns首次提出了 PAC學習模型中弱學習算法和強學習算法的等價性疑問,即任意給定僅比隨機猜測略好的弱學習算法 ,是不是可以將其提升為強學習算法 ? 假設二者等價 ,那么只需找到一個比隨機猜測略好的弱學習算法就可以將其提升為強學習算法 ,而不用尋找很難獲得的強學習算法。 也便是這種猜測,讓很多牛人去方案算法來驗證PAC理論的准確性。
不過很長一段時間都沒有一個切實可行的方法來結束這個志向。細節決定勝敗,再好的理論也需要有用的算法來實行。總算功夫不負有心人, Schapire在1996年提出一個有用的算法真實結束了這個夙願,它的名字叫AdaBoost。AdaBoost把多個不一樣的抉擇方案樹用一種非隨機的方法組合起來,表現出驚人的功用!第一,把抉擇方案樹的准確率大大前進,可以與SVM比美。第二,速度快,且底子不用調參數。第三,幾乎不Overfitting。我估計當時Breiman和Friedman一定快樂壞了,由於眼看着他們提出的CART正在被SVM比下去的時分,AdaBoost讓抉擇方案樹起死回生!Breiman不由自主地在他的論文里贊揚AdaBoost是最好的現貨方法(off-the-shelf,即“拿下了就可以用”的意思)。(這段話摘自計算學習那些事)
了解了這段有意思的來歷,下面來看adaboost算法應當會喜好大增。
二 Boosting算法的展開前史(摘自http://stblog.baidu-tech.com/?p=19)
Boosting算法是一種把若干個分類器聯系為一個分類器的方法,在boosting算法發作之前,還出現過兩種比照首要的將多個分類器聯系 為一個分類器的方法,即boostrapping方法和bagging方法。我們先扼要介紹一下bootstrapping方法和bagging方法。
1)bootstrapping方法的首要進程
首要進程:
i)重復地從一個樣本集結D中采樣n個樣本
ii)關於每次采樣的子樣本集,進行計算學習,獲得假定Hi
iii)將若干個假定進行組合,形成畢竟的假定Hfinal
iv)將畢竟的假定用於具體的分類任務
2)bagging方法的首要進程 -----bagging可以有多種抽取方法
首要思路:
i)操練分類器
從整體樣本調會集,抽樣n* < N個樣本 關於抽樣的集結操練分類器Ci
ii)分類器進行投票,畢竟的效果是分類器投票的優勝效果
但是,上述這兩種方法,都只是將分類器進行簡略的組合,實踐上,並沒有發揮出分類器組合的威力來。直到1989年,Yoav Freund與 Robert Schapire提出了一種可行的將弱分類器組合為強分類器的方法。並由此而獲得了2003年的哥德爾獎(Godel price)。
Schapire還提出了一種前期的boosting算法,其首要進程如下:
i)從樣本整體集結D中,不放回的隨機抽樣n1 < n個樣本,得到集結 D1
操練弱分類器C1
ii)從樣本整體集結D中,抽取 n2 < n個樣本,其間吞並進一半被C1 分類過失的樣本。得到樣本集結D2
操練弱分類器C2
iii)抽取D樣本調會集,C1 和 C2 分類不一致樣本,構成D3
操練弱分類器C3
iv)用三個分類器做投票,得到畢竟分類效果
到了1995年,Freund and schapire提出了現在的adaboost算法,其首要構造可以描繪為:
i)循環迭代多次
更新樣本分布
尋找當時分布下的最優弱分類器
計算弱分類器過失率
ii)聚合多次操練的弱分類器
三 Adaboost 算法
AdaBoost 是一種迭代算法,其間心思想是關於同一個操練集操練不一樣的分類器,即弱分類器,然后把這些弱分類器集結起來,構造一個更強的畢竟分類器。(很多博客里說的三個臭皮匠賽過諸葛亮)
算法本身是改動數據分布結束的,它根據每次操練集傍邊的每個樣本的分類是不是准確,以及前次的整體分類的准確率,來判定每個樣本的權值。將修改權值的新數據送給基層分類器進行操練,然后將每次操練得到的分類器交融起來,作為畢竟的抉擇計區別類器。
無缺的adaboost算法如下
簡略來說,Adaboost有很多利益:
1)adaboost是一種有很高精度的分類器
2)可以運用各種方法構建子分類器,adaboost算法供應的是構造
3)當運用簡略分類器時,計算出的效果是可以了解的。而且弱分類器構造極點簡略
4)簡略,不用做特征挑選
5)不用擔憂overfitting!
四 Adaboost 舉例
或許你看了上面的介紹或許仍是對adaboost算法雲里霧里的,沒關系,baidu大牛舉了一個很簡略的比方,你看了就會對這個算法整體上很清楚了。
下面我們舉一個簡略的比方來看看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算法通過組合弱分類器而得到強分類器,一同具有分類過失率上界跟着操練增加而安穩下降,不會過擬合等的性質,應當說是一種很適合於在各種分類場景下運用的算法。