從決策樹到GBDT再到XGBoost

http://www.cnblogs.com/en-heng/p/5013995.html


決策樹是一種通過對特徵屬性的分類對樣本進行分類的樹形結構,包括有向邊與三類節點:

  • 根節點(root node),表示第一個特徵屬性,只有出邊沒有入邊;
  • 內部節點(internal node),表示特徵屬性,有一條入邊至少兩條出邊
  • 葉子節點(leaf node),表示類別,只有一條入邊沒有出邊。





上圖就是二叉決策樹的示例。最上面的是 Root node,中間的是 Internal node,最下面面和右邊那些就是Leaf nodes.


決策樹具有以下特點:

  • 對於二叉決策樹而言,可以看作是if-then規則集合,由決策樹的根節點到葉子節點對應於一條分類規則;
  • 分類規則是互斥並且完備的,所謂互斥即每一條樣本記錄不會同時匹配上兩條分類規則,所謂完備即每條樣本記錄都在決策樹中都能匹配上一條規則。
  • 分類的本質是對特徵空間的劃分,如下圖所示,

決策樹學習的本質是從訓練數據集中歸納出一組分類規則。


生成的決策樹對訓練數據會有很好的分類效果,卻可能對未知數據的預測不準確,即決策樹模型發生過擬合(overfitting)——訓練誤差(training error)很小、泛化誤差(generalization error,亦可看作爲test error)較大。下圖給出訓練誤差、測試誤差(test error)隨決策樹節點數的變化情況:



可以觀察到,當節點數較小時,訓練誤差與測試誤差均較大,即發生了欠擬合(underfitting)。當節點數較大時,訓練誤差較小,測試誤差卻很大,即發生了過擬合。只有當節點數適中是,訓練誤差居中,測試誤差較小;對訓練數據有較好的擬合,同時對未知數據有很好的分類準確率。

發生過擬合的根本原因是分類模型過於複雜,可能的原因如下:

  • 訓練數據集中有噪音樣本點,對訓練數據擬合的同時也對噪音進行擬合,從而影響了分類的效果;
  • 決策樹的葉子節點中缺乏有分類價值的樣本記錄,也就是說此葉子節點應被剪掉。



=======================================================================================================

http://www.cnblogs.com/en-heng/p/5035945.html


分類與迴歸樹(Classification and Regression Trees, CART)是由四人幫Leo Breiman, Jerome Friedman, Richard Olshen與Charles Stone於1984年提出,既可用於分類也可用於迴歸。本文將主要介紹用於分類的CART。CART被稱爲數據挖掘領域內里程碑式的算法。

CART對特徵屬性進行二元分裂。特別地,當特徵屬性爲標量或連續時,可選擇如下方式分裂:

An instance goes left if CONDITION, and goes right otherwise

即樣本記錄滿足CONDITION則分裂給左子樹,否則則分裂給右子樹。

標量屬性

進行分裂的CONDITION可置爲不等於屬性的某值;比如,標量屬性Car Type取值空間爲{Sports, Family, Luxury},二元分裂與多路分裂如下:


連續屬性

CONDITION可置爲不大於 ε ;比如,連續屬性Annual Incomeε 取屬性相鄰值的平均值,其二元分裂結果如下:



===================================================================================================

http://www.jianshu.com/p/005a4e6ac775


 GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認爲是泛化能力較強的算法。
  GBDT中的樹是迴歸樹(不是分類樹),GBDT用來做迴歸預測,調整後也可以用於分類。

Boosting Decision Tree:提升樹算法

  提升樹是迭代多棵迴歸樹來共同決策。當採用平方誤差損失函數時,每一棵迴歸樹學習的是之前所有樹的結論和殘差,擬合得到一個當前的殘差迴歸樹,殘差的意義如公式:殘差 = 真實值 - 預測值 。提升樹即是整個迭代過程生成的迴歸樹的累加。


訓練一個提升樹模型來預測年齡:
  訓練集是4個人,A,B,C,D年齡分別是14,16,24,26。樣本中有購物金額、上網時長、經常到百度知道提問等特徵。提升樹的過程如下:




  該例子很直觀的能看到,預測值等於所有樹值得累加,如A的預測值 = 樹1左節點 值 15 + 樹2左節點 -1 = 14。
  因此,給定當前模型 fm-1(x),只需要簡單的擬合當前模型的殘差。

Gradient Boosting Decision Tree:梯度提升決策樹

  提升樹利用加法模型和前向分步算法實現學習的優化過程。當損失函數是平方損失和指數損失函數時,每一步的優化很簡單,如平方損失函數學習殘差迴歸樹。


 但對於一般的損失函數,往往每一步優化沒那麼容易,如上圖中的絕對值損失函數和Huber損失函數。針對這一問題,Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用損失函數的負梯度在當前模型的值,作爲迴歸問題中提升樹算法的殘差的近似值,擬合一個迴歸樹。

        隨機森林(random forest)和GBDT都是屬於集成學習(ensemble learning)的範疇。集成學習下有兩個重要的策略Bagging和Boosting。
  Bagging算法是這樣做的:每個分類器都隨機從原樣本中做有放回的採樣,然後分別在這些採樣後的樣本上訓練分類器,然後再把這些分類器組合起來。簡單的多數投票一般就可以。其代表算法是隨機森林。Boosting的意思是這樣,他通過迭代地訓練一系列的分類器,每個分類器採用的樣本分佈都和上一輪的學習結果有關。其代表算法是AdaBoost, GBDT。

  對於Bagging算法來說,由於我們會並行地訓練很多不同的分類器的目的就是降低這個方差(variance) ,因爲採用了相互獨立的基分類器多了以後,h的值自然就會靠近.所以對於每個基分類器來說,目標就是如何降低這個偏差(bias),所以我們會採用深度很深甚至不剪枝的決策樹。
  對於Boosting來說,每一步我們都會在上一輪的基礎上更加擬合原數據,所以可以保證偏差(bias),所以對於每個基分類器來說,問題就在於如何選擇variance更小的分類器,即更簡單的分類器,所以我們選擇了深度很淺的決策樹。





===================================================================================================================

xgboost是Gradient Boosting的一種高效系統實現,並不是一種單一算法。xgboost裏面的基學習器除了用tree(gbtree),也可用線性分類器(gblinear)。而GBDT則特指梯度提升決策樹算法。
xgboost相對於普通gbm的實現,可能具有以下的一些優勢:
  1. 顯式地將樹模型的複雜度作爲正則項加在優化目標
  2. 公式推導裏用到了二階導數信息,而普通的GBDT只用到一階
  3. 允許使用column(feature) sampling來防止過擬合,借鑑了Random Forest的思想,sklearn裏的gbm好像也有類似實現。

4.實現了一種分裂節點尋找的近似算法,用於加速和減小內存消耗。
5.節點分裂算法能自動利用特徵的稀疏性。
6.data事先排好序並以block的形式存儲,利於並行計算
7.cache-aware, out-of-core computation,這個我不太懂。。
8.支持分佈式計算可以運行在MPI,YARN上,得益於底層支持容錯的分佈式通信框架rabit。


鏈接:https://www.zhihu.com/question/41354392/answer/91371364


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