淺談樹模型與集成學習-從決策樹到GBDT

引言

  神經網絡模型,特別是深度神經網絡模型,自AlexNet在Imagenet Challenge 2012上的一鳴驚人,無疑是Machine Learning Research上最靚的仔,各種進展和突破層出不窮,科學家工程師人人都愛它。
  機器學習研究發展至今,除了神經網絡模型這種方法路徑外,還存在許多大相徑庭的方法路徑,比如說貝葉斯算法、遺傳算法、支持向量機等,這些經典算法在許多場景上也一直沿用。本文介紹的樹模型,也是一種非常經典的機器學習算法,在推薦系統上經常能看到它的身影。
  那這個樹模型是怎樣構建和實現的,其核心idea是什麼?樹模型效果不夠好,又可以用什麼樣的思路和辦法改進呢?本文主要包含以下三個方面的內容:

1.決策樹  
2.集成學習  
3.隨機森林與梯度提升決策樹

決策樹

  決策樹(Decision Tree)是樹模型中最簡單的一個模型,也是後面將要介紹到的隨機深林與梯度提升決策樹兩個模型的基礎。利用決策樹算法,在歷史約會數據集上,我們可以畫出這樣一個樹,這顆樹上的葉子節點表示結論,非葉子節點表示依據。一個樣本根據自身特徵,從根節點開始,根據不同依據決策,拆分成子節點,直到只包含一種類別(即一種結論)的葉子節點爲止。

圖片

假設有如上面表格的一個數據集,基於這樣數據可以構建成這樣的一顆決策樹,如下圖所示。 圖片

信息熵與基尼不純度

  可以看出構建決策樹的關鍵是"分裂",不斷地分裂成子節點,一直到葉子節點(不能分裂)爲止。<font color='red'>那麼這個關鍵分裂的標準和方法是什麼、怎麼分纔是最好最恰當的呢?顯然,能把正負樣本完全劃分開,一邊正一邊負,兩邊集合都是很“確定的”最好</font>。在這裏確定性是指一個事件只出現一個結果的可能性,那如何量化“確定性”這個指標呢,一般有兩種方法:信息熵和基尼不純度。
  信息熵Entropy,是用來衡量信息的不確定性的指標,其計算方式如下: 圖片
  其中P(X=i)爲隨機變量X取值爲i的概率。
  基尼不純度,實際上是對信息熵的一種近似的簡化計算,因爲對圖片進行泰勒展開後,由於圖片,所以高階項近似爲0可忽略,僅保留一階項1-P(X=i)
圖片
  其中圖片表示選中樣本爲第k類的概率。從公式上看,基尼不純度可理解爲,從數據集D中隨機抽取兩個樣本,這兩個樣本剛好不同類的概率。
  信息熵和基尼不純度都能客觀而具體地量化出“不確定性”,這兩個指標越大反映事物不確定性的程度越高。 圖片
  比如有三個硬幣,第一個硬幣其正背面質量完全均衡,拋出正背面概率相同,第二個硬幣正面質量大於背面,其拋出正面概率遠大於背面,第三個硬幣則一定會拋出正面。這三個硬幣裏面,第三個硬幣的不確定性的程度最低,因爲其沒有任何的不確定性,拋出正面是個必然事件;第一個硬幣不確定性的程度最高,沒辦法確定拋出的正面還是背面;第二個硬幣不確定性程度次之,因爲其有比較大概率是能拋出正面,能相對確定一些。

構建分類樹

  有了對"不確定性"的量化方法,我們利用這些指標,來指導我們應該選擇那個特徵、特徵怎麼分叉,保證每一步“分裂”都是最優的,一直迭代到葉子節點爲止。顯然這個決策樹的構建算法就是個貪心算法。考慮到算法實現的問題,這個決策樹最好是二叉的而不是多叉,所以我們一般用二叉的CART(Classification And Regression Tree)算法構建決策樹。
  以約會數據集D爲例,Gini(D) = 0.5,劃分成兩個集合d1, d2,標籤0和1表示否和是。基尼增益圖片,如下表格所示我們利用基尼增益選特徵,並確認其最佳分叉點。
圖片
  可見,基於氣溫特徵在分叉點爲26.5的情況下,將數據集D劃分成<d1, d2>兩個集合,其獲得基尼增益最大。重複這個步驟,將d1和d2繼續拆分下去,直到集合無法再分,或基尼增益小於或等於0爲止。

構建迴歸樹

  決策樹用於迴歸問題,思路與用分類問題的思路是一樣的。只是將分裂好壞的評價方法,又信息熵改成平方誤差函數,也就是把增益函數改成平方誤差增益即可。
  假設訓練集中第j個特徵變量圖片 和它的取值s,作爲切分變量和切分點,並定義兩個區域圖片圖片爲找出最優的j和s,對下式求解
圖片

提高樹模型的性能

  在構建決策樹的過程中,我們能看到只要樣本不衝突(樣本既是正樣本,又是負樣本),是一定能收斂的,代價就是在決策樹上添加更多(覆蓋樣本少的)葉子節點。但是這樣的決策樹,是完全沒用歸納總結數據的規律,只是相當於把訓練集用樹的形式給背了下來,對於未訓練的數據樣本可能完全不是一回事,這學到的模型實際上是沒有意義的。
  決策樹比較容易過擬合,因此需要樹的結構進行約束。利用剪枝等方法來砍掉冗餘的分支,使得樹結構儘量簡單,以提高樹模型在未訓練數據上的預測表現(也就是泛化能力)。除此之外,集成學習(Ensemble Learning),橫向地增加多個樹,並利用多個樹模型結果綜合判斷,也是個能提高模型性能常用方法。經常用在機器學習領域上的各種比賽和競賽上,是個經典的刷榜套路。

集成學習

  我們知道模型都不是完美的,而是有誤差的。而模型的誤差可以分成兩種,一種是偏差(Bias)可理解爲與模型預測均值與樣本真值的誤差,一種是方差(Variance)可理解爲模型預測值自身的變化幅度。下圖形象地了描述這兩個概念。
圖片
  集成學習算法思考的問題就是:<font color='red'>多個誤差大效果差的個體模型,能不能以某種形式集成起來,變成一個誤差變小效果變好的總體模型呢?</font>這個答案肯定是顯然的,我們都知道人民羣衆力量大。其背後的思想就是即使有個別模型預測錯誤,那麼還有其他模型可以糾正回來,正所謂三個臭皮匠勝過一個諸葛亮。
  從集成形式上看,主要可以分成兩類,一類模型並行集成的bagging方法,一類模型串行集成的boosting方法。至於爲什麼能通過這樣形式的集成就能提性能,其理論依據是什麼?這可由模型總體期望和方差,與個體模型方差和偏差之間關係,得出嚴格的數學推導和證明,這裏就不展開了。

隨機森林

  隨機森林(Random Forrest),一個基於bagging方法,把多個決策樹集成到一起的模型算法。其核心的算法思想就是,通過多個(低偏差高方差)個體模型的均值,來方式降低總體方差的學習方法。隨機森林算法框架如下圖所示。
圖片
  隨機森林構建流程如下:

1. 把原始集上隨機只採樣N份樣本數據集,且每份樣本數據集隨機只採樣M個特徵,得到若干份數據集
2. 在每個數據集上獨立構建一顆決策樹,得到N顆決策樹   

  隨機森林使用流程如下:

1. 把待預測的樣本數據,輸入到N個決策數,得到N個預測結果   
2. 對這些預測結果,以投票(分類)或平均(迴歸)的計算方式最終結果

  可見,在隨機森林裏面,每一顆決策樹的構建(訓練)都獨立的,他們之間是並行的沒有依賴。只是在最後使用(預測)時,要把森林上所有樹的結果都過一遍,通過大家投票或平均的方式給出一個final decision。

梯度提升決策樹

  簡稱GBDT(Gradient Boosting Decision Tree),一個基於boosting把多顆決策樹串聯集成一起訓練學習的算法,其核心的算法思想是基於殘差的學習,通過多個(低方差高偏差的)個體模型的疊加求和,來降低總體偏差的學習方法。
  假設樣本X的真值爲30,模型1預測結果與真值的殘差爲10。爲了修補這個殘差,需要把樣本X再送到模型2,但此時模型2訓練的目標,並不是樣本本身的真值30,而是當前的殘差10。此時模型1和模型2相加後,殘差已經從10減小4了。以相同的方式再訓練模型3和模型4,總體的殘差會越來越小,總體結果就是所有模型輸出相加之和,如下爲GBDT的訓練過程示意圖。
圖片
  可見,這與bagging的隨機森林方法完全不一樣。前者模型之間相互獨立,只要把子模型一一單獨訓練完就好了。而後者模型前後之間有依賴的關係,必須是練好上一顆樹好後,根據殘差再練下一顆,one by one的方式來訓練。那如何實現這樣的學習算法呢?GBDT就是這樣的學習算法,其框架圖如下: 圖片

目標函數構建

  我們知道對於邏輯迴歸模型的學習問題,其優化目標就是最小化交叉熵(CrossEntropy)損失函數: 圖片
  由於這函數是個凸函數的,所以這個最小值的求解問題比較簡單。只要通過梯度下降法,迭代參數W逼近極值,就能使得交叉熵損失函數取到最小值。那麼對於boosting這樣加法模型的學習問題,其優化目標或者說損失函數,這個函數應該是長什麼樣子的,又是如何構建的呢?
  要確定損失函數,首先第一步得確定模型是怎麼輸出預測值的。假定有已經訓練了K顆樹,則對於第i個樣本的當前預測值爲:
圖片
  那麼目標函數則就可以這樣構建:
圖片
  表達式右邊的爲正則項,用來控制模型結構的複雜程度,在決策樹模型中,常用樹的葉節點數量、葉子節點的值、以及樹的深度來定義之。重點來關注左邊的損失函數,應該怎麼求解其最小值呢。進一步拆解損失函數,實現損失函數參數化:假定現有K顆樹,前面的K-1顆樹已經訓練好,當前需要訓練第K顆樹。對於輸入樣本圖片,如下圖所示:
圖片
圖片
  則目標函數可簡化爲
圖片
  當訓練第K顆樹時,前K-1顆樹已經確定下來,所以圖片可作常數看待,圖片與第K顆樹無關,故此時目標函數爲:
圖片
  目標函數仍難以優化,利用泰勒級數來近似
圖片
  泰勒展開只保留前二階,此時目標函數可寫成:
圖片
  現在最優化的目標參數是圖片,所以與圖片無關的項都可以去掉。令圖片圖片圖片關於圖片的一二階導數,因爲前K-1顆樹已訓練,所以這兩個值可算出,可認爲是已知的。
圖片
  故目標函數再簡化爲:
圖片

最優化樹參數的求解

  決策樹的輸出函數f的,可以這樣定義:圖片,其中q(x)是位置函數,表示樣本x會落到樹的那個位置(第幾個葉子節點),圖片表示第j個葉子的值。而樹結構約束函數圖片,與葉子的值W和葉子的個數T有關,分別由兩個超參數來控制:
圖片
  故此時目標函數再簡化爲:
圖片
  在樹形態確定情形下,遍歷樣本組織形式,可葉子上樣本集合劃分,逐個集合形式來遍歷,比如下圖先葉子節點1上的{1,2}樣本,再葉子接上2上{3,5},如下圖:
圖片
  表示葉子節點j上的樣本集合圖片, 則的目標函數寫成下形式爲:
圖片
  再令圖片,在樹形狀確定已知時,這兩個都是常數。此時就只剩下W一個參數了,而此時的目標函數就成了一個最簡單的一元二次函數,這個函數極值點可以直接用通解公式就可以算出來。
圖片

最優化樹形態的求解

   訓練數據有限,而樹的形態是無限的。有無限多種形態的樹,都能把這些訓練放入到其葉子節點上。在這裏尋找一個最優的,其實就是個典型NP-hard問題,很難直接優化。而且樹的形態,也很難定義成一個連續的函數,沒有條件用梯度下降來求解。那麼如何求解之?跟決策樹的構建算法一樣,沿用貪心算法思路,遍歷所有特徵,找當前最優的特徵劃分方法F,確定最優樹形態。
圖片
   如上圖,假定當前已經決策樹已經分成了兩個葉子點(框線內),此時應該不應該通過特徵F繼續分裂,選擇那種劃分方式最好?
圖片
  故通過特徵劃分方法F所形成的樹形,使得圖片最大化,就是當前最優的樹形狀。爲了算法實現的便利,我們限制了特徵劃分的形式,對於每一步葉子節點劃分操作,都只能分裂左右兩個葉子節點,以確保樹是二叉的。所以最終有:
圖片

引用

XGBoost:A Scalable Tree Boosting System. KDD 2016 ChenTianqi
【機器學習】決策樹(中)https://zhuanlan.zhihu.com/p/86263786


歡迎關注凹凸實驗室博客:aotu.io

或者關注凹凸實驗室公衆號(AOTULabs),不定時推送文章。

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