寫一點自己理解的AdaBoost,然后再貼上面試過程中被問到的相關問題。按照以下目錄展開。
當然,也可以去我的博客上看
- Boosting提升算法
- AdaBoost
- 原理理解
- 實例
- 算法流程
- 公式推導
- 面經
Boosting提升算法
AdaBoost是典型的Boosting算法,屬於Boosting家族的一員。在說AdaBoost之前,先說說Boosting提升算法。Boosting算法是將“弱學習算法“提升為“強學習算法”的過程,主要思想是“三個臭皮匠頂個諸葛亮”。一般來說,找到弱學習算法要相對容易一些,然后通過反復學習得到一系列弱分類器,組合這些弱分類器得到一個強分類器。Boosting算法要涉及到兩個部分,加法模型和前向分步算法。加法模型就是說強分類器由一系列弱分類器線性相加而成。一般組合形式如下:
$$F_M(x;P)=\sum_{m=1}^nβ_mh(x;a_m)$$
其中,$h(x;a_m)$ 就是一個個的弱分類器,$a_m$是弱分類器學習到的最優參數,$β_m$就是弱學習在強分類器中所占比重,$P$是所有$a_m$和$β_m$的組合。這些弱分類器線性相加組成強分類器。
前向分步就是說在訓練過程中,下一輪迭代產生的分類器是在上一輪的基礎上訓練得來的。也就是可以寫成這樣的形式:
$$F_m (x)=F_{m-1}(x)+ β_mh_m (x;a_m)$$
由於采用的損失函數不同,Boosting算法也因此有了不同的類型,AdaBoost就是損失函數為指數損失的Boosting算法。
AdaBoost
原理理解
基於Boosting的理解,對於AdaBoost,我們要搞清楚兩點:
- 每一次迭代的弱學習$h(x;a_m)$有何不一樣,如何學習?
- 弱分類器權值$β_m$如何確定?
對於第一個問題,AdaBoost改變了訓練數據的權值,也就是樣本的概率分布,其思想是將關注點放在被錯誤分類的樣本上,減小上一輪被正確分類的樣本權值,提高那些被錯誤分類的樣本權值。然后,再根據所采用的一些基本機器學習算法進行學習,比如邏輯回歸。
對於第二個問題,AdaBoost采用加權多數表決的方法,加大分類誤差率小的弱分類器的權重,減小分類誤差率大的弱分類器的權重。這個很好理解,正確率高分得好的弱分類器在強分類器中當然應該有較大的發言權。
實例
為了加深理解,我們來舉一個例子。
有如下的訓練樣本,我們需要構建強分類器對其進行分類。x是特征,y是標簽。
序號 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
令權值分布$D_1=(w_{1,1},w_{1,2},…,w_{1,10} )$
並假設一開始的權值分布是均勻分布:$w_{1,i}=0.1,i=1,2,…,10$
現在開始訓練第一個弱分類器。我們發現閾值取2.5時分類誤差率最低,得到弱分類器為:
當然,也可以用別的弱分類器,只要誤差率最低即可。這里為了方便,用了分段函數。得到了分類誤差率$e_1=0.3$。
第二步計算$(G_1 (x)$在強分類器中的系數$α_1=\frac{1}{2} log\frac{ 1-e_1}{e_1}=0.4236$,這個公式先放在這里,下面再做推導。
第三步更新樣本的權值分布,用於下一輪迭代訓練。由公式:
$$w_{2,i}=\frac{w_{1,i}}{z_1}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的算法流程:
- 輸入:訓練數據集$T=\{(x_1,y_1),(x_2,y_2),(x_N,y_N)\}$,其中,$x_i∈X⊆R^n$,$y_i∈Y={-1,1}$,迭代次數$M$
- 1. 初始化訓練樣本的權值分布:$D_1=(w_{1,1},w_{1,2},…,w_{1,i}),w_{1,i}=\frac{1}{N},i=1,2,…,N$。
- 2. 對於$m=1,2,…,M$
- (a) 使用具有權值分布$D_m$的訓練數據集進行學習,得到弱分類器$G_m (x)$
- (b) 計算$G_m(x)$在訓練數據集上的分類誤差率:
$$e_m=\sum_{i=1}^Nw_{m,i} I(G_m (x_i )≠y_i )$$
- (c) 計算$G_m (x)$在強分類器中所占的權重:
$$α_m=\frac{1}{2}log \frac{1-e_m}{e_m} $$
- (d) 更新訓練數據集的權值分布(這里,$z_m$是歸一化因子,為了使樣本的概率分布和為1):
$$w_{m+1,i}=\frac{w_{m,i}}{z_m}exp(-α_m y_i G_m (x_i )),i=1,2,…,10$$
$$z_m=\sum_{i=1}^Nw_{m,i}exp(-α_m y_i G_m (x_i ))$$
- 3. 得到最終分類器:
$$F(x)=sign(\sum_{i=1}^Nα_m G_m (x))$$
公式推導
現在我們來搞清楚上述公式是怎么來的。
假設已經經過$m-1$輪迭代,得到$F_{m-1} (x)$,根據前向分步,我們可以得到:
$$F_m (x)=F_{m-1} (x)+α_m G_m (x)$$
我們已經知道AdaBoost是采用指數損失,由此可以得到損失函數:
$$Loss=\sum_{i=1}^Nexp(-y_i F_m (x_i ))=\sum_{i=1}^Nexp(-y_i (F_{m-1} (x_i )+α_m G_m (x_i )))$$
這時候,$F_{m-1}(x)$是已知的,可以作為常量移到前面去:
$$Loss=\sum_{i=1}^N\widetilde{w_{m,i}} exp(-y_i α_m G_m (x_i ))$$
其中,$\widetilde{w_{m,i}}=exp(-y_i (F_{m-1} (x)))$ ,敲黑板!這個就是每輪迭代的樣本權重!依賴於前一輪的迭代重分配。
是不是覺得還不夠像?那就再化簡一下:
$$\widetilde{w_{m,i}}=exp(-y_i (F_{m-1} (x_i )+α_{m-1} G_{m-1} (x_i )))=\widetilde{w_{m-1,i}} exp(-y_i α_{m-1} G_{m-1} (x_i ))$$
現在夠像了吧?ok,我們繼續化簡Loss:
$$Loss=\sum_{y_i=G_m(x_i)}\widetilde{w_{m,i}} exp(-α_m)+\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}} exp(α_m)$$
$$=\sum_{i=1}^N\widetilde{w_{m,i}}(\frac{\sum_{y_i=G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}exp(-α_m)+\frac{\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}exp(α_m))$$
公式變形之后,炒雞激動!$\frac{\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}$這個不就是分類誤差率$e_m$嗎???!重寫一下,
$$Loss=\sum_{i=1}^N\widetilde{w_{m,i}}exp(-α_m)+e_m exp(α_m))$$
Ok,這樣我們就得到了化簡之后的損失函數。接下來就是求導了。
對$α_m$求偏導,令$\frac{∂Loss}{∂α_m }=0$得到:
$$α_m=\frac{1}{2}log\frac{1-e_m}{e_m} $$
真漂亮!
另外,AdaBoost的代碼實戰與詳解請戳代碼實戰之AdaBoost
面經
今年8月開始找工作,參加大廠面試問到的相關問題有如下幾點:
- 手推AdaBoost
- 與GBDT比較
- AdaBoost幾種基本機器學習算法哪個抗噪能力最強,哪個對重采樣不敏感?
作者 Scorpio.Lu
轉載請注明出處!