寫一點自己理解的adaboost,然後再貼上面試過程中被問到的相關問題。按照以下目錄展開。
當然,也可以去我的部落格上看
面經adaboost是典型的boosting演算法,屬於boosting家族的一員。在說adaboost之前,先說說boosting提公升演算法。boosting演算法是將「弱學習演算法「提公升為「強學習演算法」的過程,主要思想是「三個臭皮匠頂個諸葛亮」。一般來說,找到弱學習演算法要相對容易一些,然後通過反覆學習得到一系列弱分類器,組合這些弱分類器得到乙個強分類器。boosting演算法要涉及到兩個部分,加法模型和前向分步演算法。加法模型就是說強分類器由一系列弱分類器線性相加而成。一般組合形式如下:
$$f_m(x;p)=\sum_^nβ_mh(x;a_m)$$
其中,$h(x;a_m)$ 就是乙個個的弱分類器,$a_m$是弱分類器學習到的最優引數,$β_m$就是弱學習在強分類器中所佔比重,$p$是所有$a_m$和$β_m$的組合。這些弱分類器線性相加組成強分類器。
前向分步就是說在訓練過程中,下一輪迭代產生的分類器是在上一輪的基礎上訓練得來的。也就是可以寫成這樣的形式:
$$f_m (x)=f_(x)+ β_mh_m (x;a_m)$$
由於採用的損失函式不同,boosting演算法也因此有了不同的型別,adaboost就是損失函式為指數損失的boosting演算法。
基於boosting的理解,對於adaboost,我們要搞清楚兩點:
每一次迭代的弱學習$h(x;a_m)$有何不一樣,如何學習?
弱分類器權值$β_m$如何確定?
對於第乙個問題,adaboost改變了訓練資料的權值,也就是樣本的概率分布,其思想是將關注點放在被錯誤分類的樣本上,減小上一輪被正確分類的樣本權值,提高那些被錯誤分類的樣本權值。然後,再根據所採用的一些基本機器學習演算法進行學習,比如邏輯回歸。
對於第二個問題,adaboost採用加權多數表決的方法,加大分類誤差率小的弱分類器的權重,減小分類誤差率大的弱分類器的權重。這個很好理解,正確率高分得好的弱分類器在強分類器中當然應該有較大的發言權。
為了加深理解,我們來舉乙個例子。
有如下的訓練樣本,我們需要構建強分類器對其進行分類。x是特徵,y是標籤。序號1
2345
6789
10x01
2345
6789
y111
-1-1-11
11-1令權值分布$d_1=(w_,w_,…,w_ )$
並假設一開始的權值分布是均勻分布:$w_=0.1,i=1,2,…,10$
現在開始訓練第乙個弱分類器。我們發現閾值取2.5時分類誤差率最低,得到弱分類器為:
當然,也可以用別的弱分類器,只要誤差率最低即可。這裡為了方便,用了分段函式。得到了分類誤差率$e_1=0.3$。
第二步計算$(g_1 (x)$在強分類器中的係數$α_1=\frac log\frac=0.4236$,這個公式先放在這裡,下面再做推導。
$$w_=\frac}exp(-α_1 y_i g_1 (x_i )),i=1,2,…,10$$
得到新的權值分布,從各0.1變成了:
$$d_2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)$$
可以看出,被分類正確的樣本權值減小了,被錯誤分類的樣本權值提高了。
第四步得到第一輪迭代的強分類器:
$$sign(f_1 (x))=sign(0.4236g_1 (x))$$
以此類推,經過第二輪……第n輪,迭代多次直至得到最終的強分類器。迭代範圍可以自己定義,比如限定收斂閾值,分類誤差率小於某乙個值就停止迭代,比如限定迭代次數,迭代1000次停止。這裡資料簡單,在第3輪迭代時,得到強分類器:
$$sign(f_3 (x))=sign(0.4236g_1 (x)+0.6496g_2 (x)+0.7514g_3 (x))$$
的分類誤差率為0,結束迭代。
$f(x)=sign(f_3 (x))$就是最終的強分類器。
總結一下,得到adaboost的演算法流程:
$$e_m=\sum_^nw_ i(g_m (x_i )≠y_i )$$
$$α_m=\fraclog \frac $$
$$w_=\frac}exp(-α_m y_i g_m (x_i )),i=1,2,…,10$$
$$z_m=\sum_^nw_exp(-α_m y_i g_m (x_i ))$$
$$f(x)=sign(\sum_^nα_m g_m (x))$$
現在我們來搞清楚上述公式是怎麼來的。
假設已經經過$m-1$輪迭代,得到$f_ (x)$,根據前向分步,我們可以得到:
$$f_m (x)=f_ (x)+α_m g_m (x)$$
我們已經知道adaboost是採用指數損失,由此可以得到損失函式:
$$loss=\sum_^nexp(-y_i f_m (x_i ))=\sum_^nexp(-y_i (f_ (x_i )+α_m g_m (x_i )))$$
這時候,$f_(x)$是已知的,可以作為常量移到前面去:
$$loss=\sum_^n\widetilde} exp(-y_i α_m g_m (x_i ))$$
其中,$\widetilde}=exp(-y_i (f_ (x)))$ ,敲黑板!這個就是每輪迭代的樣本權重!依賴於前一輪的迭代重分配。
是不是覺得還不夠像?那就再化簡一下:
$$\widetilde}=exp(-y_i (f_ (x_i )+α_ g_ (x_i )))=\widetilde} exp(-y_i α_ g_ (x_i ))$$
現在夠像了吧?ok,我們繼續化簡loss:
$$loss=\sum_\widetilde} exp(-α_m)+\sum_\widetilde} exp(α_m)$$
$$=\sum_^n\widetilde}(\frac\widetilde}}^n\widetilde}}exp(-α_m)+\frac\widetilde}}^n\widetilde}}exp(α_m))$$
公式變形之後,炒雞激動!$\frac\widetilde}}^n\widetilde}}$這個不就是分類誤差率$e_m$嗎???!重寫一下,
$$loss=\sum_^n\widetilde}exp(-α_m)+e_m exp(α_m))$$
ok,這樣我們就得到了化簡之後的損失函式。接下來就是求導了。
對$α_m$求偏導,令$\frac=0$得到:
$$α_m=\fraclog\frac $$
真漂亮!
另外,adaboost的**實戰與詳解請戳**實戰之adaboost
手推adaboost
與gbdt比較
adaboost幾種基本機器學習演算法哪個抗噪能力最強,哪個對重取樣不敏感?
作者 scorpio.lu
AdaBoost演算法原理
每個haar特徵對應看乙個弱分類器,但並不是任伺乙個haar特徵都能較好的描述人臉灰度分布的某一特點,如何從大量的haar特徵中挑選出最優的haar特徵並製作成分類器用於人臉檢測,這是adaboost演算法訓練過程所要解決的關鍵問題。paul viola和michael jones於2001年將ad...
AdaBoost演算法原理
演算法原理 adaboost 演算法針對不同的訓練集訓練同乙個基本分類器 弱分類器 然後把這些在不同訓練集上得到的分類器集合起來,構成乙個更強的最終的分類器 強分類器 理論證明,只要每個弱分類器分類能力比隨機猜測要好,當其個數趨向於無窮個數時,強分類器的錯誤率將趨向於零。adaboost 演算法中不...
AdaBoost演算法詳解
adaboost 演算法介紹 adaboost演算法本身是通過改變資料分布來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的準確率,來修改每個樣本的權值。將修改過權值的新資料集送給下層分類器進行訓練,最後將每次得到的分類器最後融合起來,作為最後的決策分類器。adaboost演...