天天看點

adaboost算法_adaboost為什麼要增加基分類器?

adaboost算法_adaboost為什麼要增加基分類器?

目的

本人面過騰訊和頭條的算法崗,可能是因為我履歷上寫了:

使用過adaboost算法模型

,是以無論是一面還是二面都被面試官問到有關

adaboost算法原理

的相關問題,而且變态的頭條面試官居然還問到:

為什麼增加弱分類器,模型的效果變好?

我當時是被問得一臉懵逼,是以寫下這篇blog來梳理adaboost的相關知識點,本篇blog主要圍繞三個點展開: - 以前向分布算法的角度了解adaboost - 為什麼增加基分類器模型的效果變好? - 為什麼我們要使用弱分類器作為基分類器而不是強分類器?

以前向分布算法的角度了解adaboost

通俗的adaboost

adaboost模型其實是非常強大的,在很多資料挖掘比賽上都會用來做stacking。而且本身的算法也是通俗易懂,主要包括兩步: - 改變資料分布:每次訓練完一個基分類器後,提高分類錯誤點的權重,減少分類正确點的權重。 - 調整模型權重:分類正确率高的模型權重更高,分類錯誤率高的模型權重低。

然後,我們就會給出一系列計算資料權重的公式,以及計算模型權重的公式,但是這些公式太難記了,往往在面試中一緊張就會忘掉,而且對于程式員來說,記公式,low爆了,我們一系就不會,一系就從頭手推adaboost,讓面試官眼前一亮。

前向分步算法

現在一個非常常用的模型架構是加法模型,形如:

adaboost算法_adaboost為什麼要增加基分類器?

我們的神經網絡在用,logistic regression在用,svm也在用。那我們能不能用到內建學習中呢?我們将每一個分類器線性組合起來得到下面這樣的模型:

adaboost算法_adaboost為什麼要增加基分類器?

我們要得到一個很好的

adaboost算法_adaboost為什麼要增加基分類器?

,得給它設定一個目标函數。我們的神經網絡使用的是

cross entropy

,adaboost在這裡使用了一個叫

指數損失函數

的目标函數:

adaboost算法_adaboost為什麼要增加基分類器?
adaboost算法_adaboost為什麼要增加基分類器?

我們整個目标函數是(注意

adaboost算法_adaboost為什麼要增加基分類器?

):

adaboost算法_adaboost為什麼要增加基分類器?

我們先直覺地感受一下這個目标函數,當

adaboost算法_adaboost為什麼要增加基分類器?

比較多時,L的值慢慢減少,當分類器錯誤率高時,

adaboost算法_adaboost為什麼要增加基分類器?

的值就多,L的值慢慢增大。但是我們發現優化這個公式太困難了,我們有一堆

adaboost算法_adaboost為什麼要增加基分類器?

和一堆小g,是以我們使用加法模型中的特例,前向分步來計算:每次隻優化新加進來的權重還有分類器:

adaboost算法_adaboost為什麼要增加基分類器?

adaboost算法_adaboost為什麼要增加基分類器?

,這個在我們優化時是固定的,原式子等于:

adaboost算法_adaboost為什麼要增加基分類器?

以上這個式子不利于我們求導,我們使用訓示函數$I$來簡化我們的函數:

adaboost算法_adaboost為什麼要增加基分類器?

我們仔細觀察(2)式子,不難發現是個單調函數,是以說如果求出該函數的極值點,則必為極大值或者極小值,對式子(3)求偏導數,且令其等于0:

adaboost算法_adaboost為什麼要增加基分類器?

adaboost算法_adaboost為什麼要增加基分類器?

,我們稱e為錯誤量,可以簡化式子(4):

adaboost算法_adaboost為什麼要增加基分類器?

我們直覺地感受下

adaboost算法_adaboost為什麼要增加基分類器?

的變化,當錯誤量小于0.5,我們的模型起到比随機結果好的作用,那麼權重就大于0,等于0.5相當于跟随機結果一樣,權重為0:

adaboost算法_adaboost為什麼要增加基分類器?

在最後我們求出我們的最後的式子,其中$g_m$是我們的基分類器在第m輪訓練出來的:

adaboost算法_adaboost為什麼要增加基分類器?

我們還可以訓練得出新資料的權重分布:

adaboost算法_adaboost為什麼要增加基分類器?

由于前向分布算法跟adaboost具體的算法實作相差一個規範化因子Z,是以W的初始化一般為1.

為什麼增加基分類器模型的效果變好?

我看了李航的解答,對于我來說思維有點跳躍了,是以在這裡我給出我自己的想法:-)。

在這裡,我們假設效果變好是指,訓練準确率上升了也就是

adaboost算法_adaboost為什麼要增加基分類器?

越少越好,那麼這裡就會涉及到一個問題,就是訓練誤差上界,如果誤差的上界是随着基分類器的數量在減少,那麼就可以說增加基分類器G(x)越來越好,下面開始開腦洞了:

adaboost算法_adaboost為什麼要增加基分類器?

接下來,我們比較這樣這樣的式子,如果它小于1,那麼就大功告成,其中分母是

adaboost算法_adaboost為什麼要增加基分類器?

的誤差上界:

adaboost算法_adaboost為什麼要增加基分類器?

我們看兩個極值點: - 當我們的分類器是随機的,即

adaboost算法_adaboost為什麼要增加基分類器?

,那麼式子(7)為1 - 當我們的分類器是超強分類器,即

adaboost算法_adaboost為什麼要增加基分類器?

,那麼式子(7)為0

看到這裡是不是發現了什麼,對如果我們的$J(alpha_M)$是單調函數,或許式子(7)隻有一個極值點,并且極值點的值在1~0之間,那麼我們就可以認為式子(7)小于1且增加分類器能夠使得訓練誤差上界變少,對(7)式子求偏導數,并令它等于0:

adaboost算法_adaboost為什麼要增加基分類器?

你會發現

adaboost算法_adaboost為什麼要增加基分類器?

跟式子(4)是一樣的,隻有一個極值點,我們接下來把式子(4)代入式子(7)求得:

adaboost算法_adaboost為什麼要增加基分類器?

在這裡$e_M$是我們的錯誤量,值得範圍是0~1,代入求得式子(8)的最大值為1,這時我們的分類器的是随機分類器。但是我們假設我們的分類器是比随機好的,那麼

adaboost算法_adaboost為什麼要增加基分類器?

,是以說加入基分類器對于訓練集來說效果是比沒有加好的。

為什麼我們要使用弱分類器作為基分類器而不是強分類器

這裡的解釋就沒有那麼數學了,我簡單地說一下我的看法。實際上你也可以從實驗看出來,使用淺層的決策樹比使用很深的決策樹效果好很多。當你使用一個很強的分類器,它在訓練集上效果很好,那麼分類器的權重就會很大,這樣在決策的時候完全是這個分類器在起作用,很容易造成過拟合,這樣在實際的測試上效果會變差,但是在訓練集上的表現還是不錯的。

繼續閱讀