1. 程式人生 > >機器學習——整合演算法(二)

機器學習——整合演算法(二)

接著整合演算法講講GBDT和Xgboost,二者的原理其實差不多的,他們都屬於提升演算法。梯度上升(Gradient Boosting)是說,在整合演算法中每個弱決策樹的生成都是依據損失函式的梯度方向。

提升演算法,是找到找到最優解F(x)使得損失函式在訓練集上期望(偏差)最小。損失函式若是迴歸則常取最小平方誤差和絕對值誤差;如果是迴歸則採用類似Logister的似然函式,屬於指數損失函式。首先從常函式F0(x)開始

                                                    

以貪心演算法的思路擴充套件得到Fm(x)

                                   

這要求在函式空間內的最優化問題,在每次選擇最優基函式時十分困難,這裡使用梯度下降的方法近似計算(涉及到泛函分析,可以把f當做變數x,來類比求梯度的過程)

                                 

這裡是將樣本資料代入基函式f(x)得到f(x1)、f(x2)...f(xn),那麼損失函式L(y,x)退化為向量L(y,f(x1))、L(y,f(x2))...L(y,f(xn))。為了求步長γ,使用線性搜尋求最優步長:

                                  

求最優步長也是隨著一次次迭代進行下去的,先計算偽殘差(這個概念不懂)

                                  

使用資料計算擬合殘差的基函式fm(x),接下來就可以計算出最優步長了(屬於一維優化問題?)

                              

從而得到更新的模型

                                      

綜上,整個過程通過階段性的加性擴充套件和梯度下降手段,將函式估計轉化為引數估計,來進行最優化求解(涉及到泛函分析力的一些知識,還不是特別清楚,等以後補上吧)

GBDT,Gradient Boosting Decision Tree是指梯度上升決策樹,裡面的基函式自然就是決策樹了(尤其是CART)。其中的主要過程和前面介紹的提升演算法差不多,在第m步迭代中根據偽殘差計算決策樹tm(x),

                                          

假設該決策樹葉子節點數目為J,也就是把輸入空間劃分為J個不相交的區域R_{1m}R_{2m}...R_{Jm},式子中的b_{jm}是樣本所在區域R_{jm}的預測值,I(x)是示性符號。得到第m步的分類器

                                            

其中的最優步長γm由線性搜尋計算出來

                                          

更進一步,對樹的每個區域分佈計算步長,從而係數b_{jm}被合併到步長中(還不懂怎麼操作的)

                                      

Xgboost基本的原理與上面推導的類似,但是有對目標函式taylor展開利用其二階導的資訊(GBDT只使用了一階導去擬合)。設目標函式如下

                                           

利用Taylor展開式

                                      

令損失函式的一階導和二階導為

                                                                               

則目標函式展開為

                                     

現在對目標函式化簡

                                     

這裡的權值w是指每個葉節點的權值,樣本落在葉節點q中,則定義f為f_{t}(x)=w_{q(x)}。一個決策樹的核心是葉子權值和樹結構,專案這個式子中,w即為權值,q即為樹結構(即最終哪個樣本落在哪個葉子節點上的結構)

                                           

上式子中,決策樹的複雜度可考慮葉子結點數和葉權值,可以將正則懲罰項定義為(這種不是唯一的)

                                           

對於上面已經化簡的式子,為了繼續化簡,我們定義

                                          

目標函式變為

                                        

對w求偏導

                                    

回代到原式子

                                 

這樣我們只要列舉樣本集中的可分點,選擇增益最大的劃分,來構建決策樹。

 GBDT和Xgboost比較,GBDT一般以CART為基分類器,而Xgboost還可以支援LR等現行分類器,這些分類器本身就是帶著L1和L2正則化懲罰項的 。GBDT是通過對樹進行正則化技術來降低過擬合風險,如剪枝等減少葉節點、限制樹層數的措施;而Xgboost是在目標函式中加入正則化項(包含了葉節點數和葉權值)來控制模型複雜度。Xgboost還借鑑隨機森林,支援列抽樣,可以降低過擬合風險。另外Xgboost雖然是串聯的模型,但是在計算時是可以並行進行的,大大提高了計算速率。

下面列出各整合演算法的優缺點。這裡RF算是屬於Bagging,其他三個屬於Boosting,其中Adaboost屬於傳統範疇,而GBDT和Xgboost則與傳統boosting有較大區別(算是GB演算法吧),GB的每一輪迭代都是為了減少殘差,是在殘差減小的方向上建立的模型。

Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網路等學習器上效用更為明顯;Boosting主要關注降低偏差,因此Boosting能基於泛化效能相當弱的學習器構建出很強的整合。

方差度量了同等大小的訓練集的變動導致學習效能的變化,刻畫了資料擾動所導致的影響;偏差指的是演算法的期望預測與真實預測之間的偏差程度,反應了模型本身的擬合能力。

隨機森林

Adaboost

GBDT

Xgboost

優點

1)在當前所有演算法中,具有極好的準確率;

2)能夠有效地執行在大資料集上;

3)能夠處理具有高維特徵的輸入樣本,而且不需要降維;

4)能夠評估各個特徵在分類問題上的重要性;

5)在生成過程中,能夠獲取到內部生成誤差的一種無偏估計;

6)對於預設值問題也能夠獲得很好得結果;

1)Adaboost作為分類器時,分類精度很高;

2)在Adaboost的框架下,可以使用各種迴歸分類模型來構建弱學習器,非常靈活;

3)作為簡單的二元分類器時,構造簡單,結果可理解;

4)不容易發生過擬合;

1) 可以靈活處理各種型別的資料,包括連續值和離散值;

2)在相對少的調參時間情況下,預測的準確率也可以比較高,(這個是相對SVM來說的);

3)使用一些健壯的損失函式,對異常值的魯棒性非常強,比如 Huber損失函式和Quantile損失函式

1) 採用二階擬合,收斂速度快;

2)防止過擬合,還可以對特徵的值有缺失的樣本,自動學習出它的分裂方向;

3)計算速度快,支援平行計算

缺點

1)對於許多統計建模者來說,隨機森林給人的感覺就像一個黑盒子,你無法控制模型內部的執行。只能在不同的引數和隨機種子之間進行嘗試;

2)可能有很多相似的決策樹,掩蓋了真實的結果;

3)對於小資料或者低維資料(特徵較少的資料),可能不能產生很好的分類;

4)執行資料雖然比boosting等快(隨機森林屬於bagging),但比單隻決策樹慢多了;

1)對異常樣本敏感,異常樣本在迭代中可能會獲得較高的權重,影響最終的強學習器的預測準確性; 1)由於弱學習器之間存在依賴關係,難以並行訓練資料。不過可以通過自採樣的SGBT來達到部分並行;