集成學習 Adaboost 提升樹 GBDT Xgboost Blending Stacking

目錄

1. Adaboost

2. 提升樹(boosting tree)

3. 梯度提升決策樹(GBDT)

4. Xgboost

5. Bagging 和 隨機森林 RandomForest

6. GBDT 和 RandomForest的區別

7. xgboost,RF,LR優缺點場景

Blending

Stacking


集成學習

集成學習,是指構建並結合多個學習器來完成學習任務。

集成學習中可以只包含同類型的個體學習器(基學習器)或者不同類型的個體學習器。

要實現好的集成效果,個體學習器應該“好而不同”,個體學習器要有一定的“準確性”,且學習器間有 “差異性”。

 

目前集成方法大致分爲兩大類:

  • 個體學習器間存在強依賴關係,必須串行生成的序列化方法。Boosting(例如Adaboost、GBDT、Xgboost)
  • 個體學習器間不存在強依賴關係,可同時生成的並行化方法。Bagging 隨機森林

 

1. Adaboost

Adaboost步驟如下:

1) 初始化訓練數據的權值分佈。如果有N個樣本,則每一個訓練樣本最開始時都被賦予相同的權值:1/N。

2) 在每輪迭代中

  • 通過當前權值分佈得到基分類器。
  • 計算當前基分類器的分類誤差率。
  • 更新權值分佈,提高錯誤分類樣本的權值,降低正確分類樣本的權值。

3) 組合基分類器,誤差率小的基分類器權值高,誤差率大的基分類器權值低。

 

2. 提升樹(boosting tree)

提升樹是以分類樹或迴歸樹作爲基學習器的提升方法。

分類問題的提升樹是AdaBoost算法的特殊情況。

前向分步算法的第 步,前一輪學到的模型是

迴歸問題的提升樹只需要擬合殘差。(對決策樹的參數Θ的確定採用經驗風險最小化來確定)

3. 梯度提升決策樹(GBDT

       梯度提升樹(GBDT)原理小結

失函數的負梯度在當前模型的值,作爲迴歸問題殘差的近似,去擬合迴歸樹。

       GBDT的正則化方法:

  1. 步長  步長和最大迭代次數一起決定算法的擬合效果
  2. 子採樣比例 [0.5 0.8]之間
  3. 對弱學習器CART迴歸樹進行正則化剪枝。

GBDT 調參:GBDT調參

GBDT是一個Boosting的模型,通過組合多個弱模型逐步擬合殘差得到一個強模型。樹模型具有天然的優勢,能夠很好的挖掘組合高階統計特徵,兼具較優的可解釋性。GBDT的主要缺陷是依賴連續型的統計特徵,對於高維度稀疏特徵、時間序列特徵不能很好的處理。

GBDT構造新特徵的方法可以使特徵工程自動化。

4. Xgboost

xgboost如何分裂,分裂時的依據,如何控制它是否分裂的,xgboost和GBDT區別

xgboost防止過擬合的方法,xgboost過擬合怎麼辦

XGBoost算法原理小結

Xgboost 與 GBDT 的不同之處

       一是算法本身的優化:在算法的基學習器模型選擇上,對比GBDT只支持決策樹,還可以直接很多其他的弱學習器。(XGBoost的基學習器 可以是CART(這個時候就是GBDT)也可以是線性分類器)在算法的損失函數上,除了本身的損失,還加上了正則化部分。在算法的優化方式上,GBDT的損失函數只對誤差部分做負梯度(一階泰勒)展開,而XGBoost損失函數對誤差部分做二階泰勒展開,更加準確。算法本身的優化是我們後面討論的重點。

       二是算法運行效率的優化:對每個弱學習器,比如決策樹建立的過程做並行選擇,找到合適的子樹分裂特徵和特徵值。在並行選擇之前,先對所有的特徵的值進行排序分組,方便前面說的並行選擇。對分組的特徵,選擇合適的分組大小,使用CPU緩存進行讀取加速。將各個分組保存到多個硬盤以提高IO速度。

       注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完成才能進行下一次迭代的(第t次迭代的代價函數裏面包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因爲要確定最佳分割點),xgboost在訓練之前,預先對數據進行排序,然後保存block結構,後面的迭代中重複的使用這個結構,大大減小計算量。這個block結構也使得並行稱爲了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多線程進行。

  三是算法健壯性的優化:對於缺失值的特徵,通過枚舉所有缺失值在當前節點是進入左子樹還是右子樹來決定缺失值的處理方式。算法本身加入了L1和L2正則化項,可以防止過擬合,泛化能力更強。

缺失值處理:

  • 在尋找split point(在節點分裂決策樹)的時候,不會對該特徵爲missing的樣本進行遍歷統計,只對該列特徵值爲non-missing的樣本上對應的特徵值進行遍歷,通過這個技巧來減少了爲稀疏離散特徵尋找split point的時間開銷。
  • 在邏輯實現上,爲了保證完備性,會分別處理將missing該特徵值的樣本分配到左葉子結點和右葉子結點的兩種情形,計算增益後選擇增益大的方向進行分裂即可。
  • 如果在訓練中沒有缺失值而在預測中出現缺失,那麼會自動將缺失值的劃分方向放到右子樹。

XGBoost 一次求解出決策樹最優的所有J個葉子節點區域和每個葉子節點區域的最優解c_{tj}

XGBoost類庫使用小結

XGBoost調參

1) n_estimators; 決策樹基學習器的個數,先固定learning rate 0.1
2) max_depth  樹結構的深度(這個參數的取值最好在3-10之間) 和 min_child_weight 最小的子節點權重閾值,如果某個樹節點的權重小於這個閾值,則不會再分裂子樹,; 
3) gamma;  XGBoost的決策樹分裂所帶來的損失減小閾值。(起始值也可以選其它比較小的值,在0.1到0.2之間就可以)
4) subsamplecolsample_bytree、colsample_bylevel、colsample_bynode;  子採樣參數,這三個參數都是用於特徵採樣的,選擇多少特徵去分裂子樹(典型值的範圍在0.5-0.9之間。)
5) reg_alphareg_lambda;  XGBoost的正則化參數。
6) learning_rate; 調完其他所有參數後,最後再來調learning_rate和n_estimators。

注意:

1. max_leaf_nodes

  • 樹上最大的節點或葉子的數量。
  • 可以替代max_depth的作用。如果定義了這個參數,GBM會忽略max_depth參數。

2. min_child_weight = 1

  • 在這裏選了一個比較小的值,因爲這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。

參考鏈接:

XGboost數據比賽實戰之調參篇(完整流程)

XGBoost判斷特徵重要度的指標:

weight - 該特徵在所有樹中被用作分割樣本的特徵的次數。 
gain - 在所有樹中的平均增益。 
cover - 在樹中使用該特徵時的平均覆蓋範圍。

XGBoost詳解

5. Bagging 和 隨機森林 RandomForest

集成中的個體學習器應儘可能相互獨立,基學習器有儘可能大的差異。

使用有交疊的採樣子集。(數據集中重複採樣)

對於並行訓練出來的基學習器,對於分類任務使用簡單的投票法,迴歸任務使用簡單平均法。

又放回的採樣。

隨機森林,以決策樹爲基學習器構建Bagging集成的基礎上,引入了隨機屬性選擇。RF中,先從該節點的屬性集合中隨機選擇一個包含k個屬性的子集,然後再從這個子集中選擇一個最優屬性用於劃分。

scikit-learn隨機森林調參小結

1) 首先對n_estimators進行網格搜索. 最大基學習器的個數

2) 對決策樹最大深度max_depth和內部節點再劃分所需最小樣本數min_samples_split進行網格搜索。

3) 對於內部節點再劃分所需最小樣本數min_samples_split,我們暫時不能一起定下來,因爲這個還和決策樹其他的參數存在關聯。下面我們再對內部節點再劃分所需最小樣本數min_samples_split葉子節點最少樣本數min_samples_leaf一起調參。

4) 最大特徵數max_features

6. GBDT 和 RandomForest的區別

1)隨機森林採用的bagging思想,而GBDT採用的boosting思想。(這兩種方法都是Bootstrap思想的應用,Bootstrap是一種有放回的抽樣方法思想。雖然都是有放回的抽樣,但二者的區別在於:Bagging採用有放回的均勻取樣,而Boosting根據錯誤率來取樣(Boosting初始化時對每一個訓練樣例賦相等的權重1/n,然後用該算法對訓練集訓練t輪,每次訓練後,對訓練失敗的樣例賦以較大的權重),因此Boosting的分類精度要優於Bagging。)Bagging的訓練集的選擇是隨機的,各訓練集之間相互獨立,弱分類器可並行,而Boosting的訓練集的選擇與前一輪的學習結果有關,是串行的。

2)組成隨機森林的樹可以是分類樹,也可以是迴歸樹;而GBDT只能由迴歸樹組成。

3)組成隨機森林的樹可以並行生成;而GBDT只能是串行生成。

4)對於最終的輸出結果而言,隨機森林採用多數投票等;而GBDT則是將所有結果累加起來,或者加權累加起來。

5)隨機森林對異常值不敏感;GBDT對異常值非常敏感。

6)隨機森林對訓練集一視同仁;GBDT是基於權值的弱分類器的集成。

7)隨機森林是通過減少模型方差提高性能;GBDT是通過減少模型偏差提高性能。

7. xgboost,RF,LR優缺點場景

Xgboost:

優缺點:1)在尋找最佳分割點時,考慮傳統的枚舉每個特徵的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成爲分割點的候選者,然後從候選者中根據上面求分割點的公式計算找出最佳的分割點。

2)xgboost考慮了訓練數據爲稀疏值的情況,可以爲缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。

3)特徵列排序後以塊的形式存儲在內存中,在迭代中可以重複使用;雖然boosting算法迭代必須串行,但是在處理每個特徵列時可以做到並行。

4)按照特徵列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer,然後再計算,提高算法的效率。

5)xgboost 還考慮了當數據量比較大,內存不夠時怎麼有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,儘可能的提高算法的效率。

適用場景:分類迴歸問題都可以。

Rf:

優點:

1)表現性能好,與其他算法相比有着很大優勢。

2)隨機森林能處理很高維度的數據(也就是很多特徵的數據),並且不用做特徵選擇。

3)在訓練完之後,隨機森林能給出哪些特徵比較重要。

4)訓練速度快,容易做成並行化方法(訓練時,樹與樹之間是相互獨立的)。

5)在訓練過程中,能夠檢測到feature之間的影響。

6)對於不平衡數據集來說,隨機森林可以平衡誤差。當存在分類不平衡的情況時,隨機森林能提供平衡數據集誤差的有效方法。

7)如果有很大一部分的特徵遺失,用RF算法仍然可以維持準確度。

8)隨機森林算法有很強的抗干擾能力(具體體現在6,7點)。所以當數據存在大量的數據缺失,用RF也是不錯的。

9)隨機森林抗過擬合能力比較強(雖然理論上說隨機森林不會產生過擬合現象,但是在現實中噪聲是不能忽略的,增加樹雖然能夠減小過擬合,但沒有辦法完全消除過擬合,無論怎麼增加樹都不行,再說樹的數目也不可能無限增加的)。10)隨機森林能夠解決分類與迴歸兩種類型的問題,並在這兩方面都有相當好的估計表現。(雖然RF能做迴歸問題,但通常都用RF來解決分類問題)。11)在創建隨機森林時候,對generlization error(泛化誤差)使用的是無偏估計模型,泛化能力強。

缺點:1)隨機森林在解決迴歸問題時,並沒有像它在分類中表現的那麼好,這是因爲它並不能給出一個連續的輸出。當進行迴歸時,隨機森林不能夠做出超越訓練集數據範圍的預測,這可能導致在某些特定噪聲的數據進行建模時出現過度擬合。(PS:隨機森林已經被證明在某些噪音較大的分類或者回歸問題上回過擬合)。2)對於許多統計建模者來說,隨機森林給人的感覺就像一個黑盒子,你無法控制模型內部的運行。只能在不同的參數和隨機種子之間進行嘗試。3)可能有很多相似的決策樹,掩蓋了真實的結果。4)對於小數據或者低維數據(特徵較少的數據),可能不能產生很好的分類。(處理高維數據,處理特徵遺失數據,處理不平衡數據是隨機森林的長處)。5)執行數據雖然比boosting等快(隨機森林屬於bagging),但比單隻決策樹慢多了。

適用場景:數據維度相對低(幾十維),同時對準確性有較高要求時。因爲不需要很多參數調整就可以達到不錯的效果,基本上不知道用什麼方法的時候都可以先試一下隨機森林。

 

Blending

參考鏈接:從零實現機器學習算法(七) Blending

Blending第一層將訓練集需要劃分爲訓練集(train_set)和驗證集(val_set)。第一層中可以選擇多個模型,這些模型可以是同質的也可以是異質的。然後分別使用訓練集對這些模型訓練將訓練好的模型對驗證集進行驗證得到預測特徵這些預測特徵將作爲第二層的訓練集。

Blending在測試過程中,也分爲兩層。在第一層中,使用訓練好的模型對測試數據進行預測,得到測試集的預測特徵;在第二層中使用訓練好的單層感知機對預測特徵進行預測,得到最終的預測結果。

總結:用不相交的數據訓練不同的 Base Model,將它們的輸出取(加權)平均。實現簡單,但對訓練數據利用少了。

Stacking

參考鏈接:Kaggle機器學習之模型融合(stacking)心得

整個過程很像 交叉驗證。首先將訓練數據分爲 5 份,接下來一共 5 個迭代,每次迭代時,將 4 份數據作爲訓練集對每個基學習器進行訓練,然後在剩下一份驗證集上進行預測。同時也要將其在測試數據上的預測保存下來。這樣,每個 Base Model 在每次迭代時會對訓練數據的其中 1 份做出預測,對測試數據的全部做出預測。5 個迭代都完成以後我們就獲得了一個 #訓練數據行數 x #Base Model 數量 的矩陣,這個矩陣接下來就作爲第二層的 Model 的訓練數據。當第二層的 Model 訓練完以後,將之前保存的 Base Model 對測試數據的預測(因爲每個 Base Model 被訓練了 5 次,對測試數據的全體做了 5 次預測,所以對這 5 次求一個平均值,從而得到一個形狀與第二層訓練數據相同的矩陣)拿出來讓它進行預測,就得到最後的輸出。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章