實習了三個多月,把ML的算法都忘得差很少了,最近寫論文用到了AdaBoost和AdaRank,這裏從新複習總結了下,主要參考了:http://blog.csdn.net/haidao2009/article/details/7514787 。算法
AdaBoost 是一種迭代算法,其核心思想是針對同一個訓練集訓練不一樣的分類器,即弱分類器,而後把這些弱分類器集合起來,構造一個更強的最終分類器。(不少博客裏說的三個臭皮匠勝過諸葛亮)網絡
算法自己是改變數據分佈實現的,它根據每次訓練集之中的每一個樣本的分類是否正確,以及上次的整體分類的準確率,來肯定每一個樣本的權值。將修改權值的新數據送給下層分類器進行訓練,而後將每次訓練獲得的分類器融合起來,做爲最後的決策分類器。完整的adaboost算法以下:框架
下面咱們舉一個簡單的例子來看看adaboost的實現過程:學習
圖中,「+」和「-」分別表示兩種類別,在這個過程當中,咱們使用水平或者垂直的直線做爲分類器,來進行分類。.net
根據分類的正確率,獲得一個新的樣本分佈D2,一個子分類器h1 其中劃圈的樣本表示被分錯的。在右邊的途中,比較大的「+」表示對該樣本作了加權。對象
也許你對上面的ɛ1,ɑ1怎麼算的也不是很理解。下面咱們算一下,不要嫌我囉嗦,我最開始就是這樣思考的,只有本身把算法演算一遍,你纔會真正的懂這個算法的核心,後面我會再次提到這個。算法最開始給了一個均勻分佈 D 。因此h1 裏的每一個點的值是0.1。ok,當劃分後,有三個點劃分錯了,根據算法偏差表達式blog
獲得 偏差爲分錯了的三個點的值之和,因此ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根據表達式 的能夠算出來爲0.42. 而後就根據算法 把分錯的點權值變大。如此迭代,最終完成adaboost算法。事務
根據分類的正確率,獲得一個新的樣本分佈D3,一個子分類器h2 get
獲得一個子分類器h3 博客
整合全部子分類器:
所以能夠獲得整合的結果,從結果中看,及時簡單的分類器,組合起來也能得到很好的分類效果,在例子中全部的。
得到不一樣若分類器的方式有以下幾種:
到這裏,也許你已經對adaboost算法有了大體的理解。可是也許你會有個問題,爲何每次迭代都要把分錯的點的權值變大呢?這樣有什麼好處呢?不這樣不行嗎? 這就是我當時的想法,爲何呢?我看了好幾篇介紹adaboost 的博客,都沒有解答個人疑惑,也許大牛認爲太簡單了,不值一提,或者他們並無意識到這個問題而一筆帶過了。而後我仔細一想,也許提升錯誤點可讓後面的分類器權值更高。而後看了adaboost算法,和我最初的想法很接近,但不全是。 注意到算法最後的表到式爲,這裏面的a 表示的權值,是由 獲得的。而a是關於偏差的表達式,到這裏就能夠獲得比較清晰的答案了,全部的一切都指向了偏差。提升錯誤點的權值,當下一次分類器再次分錯了這些點以後,會提升總體的錯誤率,這樣就致使 a 變的很小,最終致使這個分類器在整個混合分類器的權值變低。也就是說,這個算法讓優秀的分類器佔總體的權值更高,而挫的分類器權值更低。這個就很符合常理了。到此,我認爲對adaboost已經有了一個透徹的理解了。
咱們能夠總結下adaboost算法的一些實際可使用的場景:
1)用於二分類或多分類的應用場景
2)用於作分類任務的baseline
無腦化,簡單,不會overfitting,不用調分類器
3)用於特徵選擇(feature selection)
4)Boosting框架用於對badcase的修正
只須要增長新的分類器,不須要變更原有分類器
因爲adaboost算法是一種實現簡單,應用也很簡單的算法。Adaboost算法經過組合弱分類器而獲得強分類器,同時具備分類錯誤率上界隨着訓練增長而穩定降低,不會過擬合等的性質,應該說是一種很適合於在各類分類場景下應用的算法。