1. 程式人生 > >幾種Boost演算法的比較(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

幾種Boost演算法的比較(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

關於boost演算法

  boost演算法是基於PAC學習理論(probably approximately correct)而建立的一套整合學習演算法(ensemble learning)。其根本思想在於通過多個簡單的弱分類器,構建出準確率很高的強分類器,PAC學習理論證實了這一方法的可行性。下面關於幾種Boost演算法的比較,是基於文章《Additive Logistic Regression a Statistical View of Boosting》整理的。

幾種boost演算法步驟

  通常使用最多的應該是離散的Adaboost演算法(Discrete AdaBoost),主要因為它的簡單卻不俗的表現,Discrete Adaboost演算法的步驟如下:

  可以看出,Discrete AdaBoost的每一個弱分類的輸出結果是1或-1,並沒有屬於某個類的概率,略顯粗糙。 如果讓每個弱分類器輸出樣本屬於某個類的概率,則可以得到Real AdaBoost演算法,其步驟如下:

  Real Adaboost每個弱分類器輸出樣本屬於某類的概率後,通過一個對數函式將0-1的概率值對映到實數域,最後的分類器是所有對映函式的和。

將Real Adaboost演算法每次迭代的兩部合併,直接產生一個對映到實數域的函式,則就成了Gentle AdaBoost, 其演算法步驟如下:

  Gentle AdaBoost則在每次迭代時,基於最小二乘去做一個加權迴歸,最後所有迴歸函式的和作為最終的分類器。

  LogitBoost演算法則和Gentle AdaBoost演算法有點相像,不過其每次進行迴歸擬合的變數z是在不斷更新的,Gentle AdaBoost使用的是y。LogitBoost演算法步驟如下:

4種boost演算法的原理差異

  上面4中boost演算法,其大體結構都是比較相似的,那麼是如何推匯出每種演算法的具體形式的呢?   首先是關於損失函式(或代價函式),通常見到比較多的是均方誤差和似然函式,而上面的演算法中,Discrete AdaBoost、Real AdaBoost和Gentle AdaBoost演算法都是採用對數損失函式,具體形式如下:

J(F)=Ee(−yF(x))J(F)=Ee(−yF(x))

  其表達的意義實質上與分類錯誤個數是相同的。   而Logit Boost演算法則採用最大化對數似然函式來推導的。   第二點是具體優化方法,Discrete AdaBoost與Real AdaBoost主要通過類似梯度下降的方法來優化,而Gentle AdaBoost與Logit Boost都是採用類似牛頓迭代的方式優化的。

演算法的效果差異

  在前面提到的參考文章中,對幾種演算法的效果進行了大量比較,大致如下;

  1. 整體效果而言,效果由好到差的順序為Logit Boost,Gentle AdaBoost, Real AdaBoost, Discrete AdaBoost
  2. 若弱分類器採用樹樁模型(也就是隻要2個葉子節點的決策樹),Discrete AdaBoost的結果比其他3種演算法結果差了很多,大概是由於系統偏差過大導致的泛化誤差較大
  3. 若弱分類器採用多層的決策樹(4或8個葉子節點),Discrete AdaBoost的結果能有較大提升,而其他3種演算法則差異不大。

  平時我們所用的AdaBoost演算法大多是Discrete AdaBoost,從這裡可以看出Discrete AdaBoost演算法模型相對比較簡單,需要弱分類器的精確度稍高,因此在具體應用時最好將每個弱分類器的葉子節點控制在4個或8個。   關於Boost演算法還有很多比較有趣的結論,這裡不多講,可以參考上面的那篇Paper。