引言
神經網路模型,特別是深度神經網路模型,自AlexNet在Imagenet Challenge 2012上的一鳴驚人,無疑是Machine Learning Research上最靚的仔,各種進展和突破層出不窮,科學家工程師人人都愛它。
機器學習研究發展至今,除了神經網路模型這種方法路徑外,還存在許多大相徑庭的方法路徑,比如說貝葉斯演算法、遺傳演算法、支援向量機等,這些經典演算法在許多場景上也一直沿用。本文介紹的樹模型,也是一種非常經典的機器學習演算法,在推薦系統上經常能看到它的身影。
那這個樹模型是怎樣構建和實現的,其核心idea是什麼?樹模型效果不夠好,又可以用什麼樣的思路和辦法改進呢?本文主要包含以下三個方面的內容:
1.決策樹
2.整合學習
3.隨機森林與梯度提升決策樹
決策樹
決策樹(Decision Tree)是樹模型中最簡單的一個模型,也是後面將要介紹到的隨機深林與梯度提升決策樹兩個模型的基礎。利用決策樹演算法,在歷史約會資料集上,我們可以畫出這樣一個樹,這顆樹上的葉子節點表示結論,非葉子節點表示依據。一個樣本根據自身特徵,從根節點開始,根據不同依據決策,拆分成子節點,直到只包含一種類別(即一種結論)的葉子節點為止。
假設有如上面表格的一個資料集,基於這樣資料可以構建成這樣的一顆決策樹,如下圖所示。
資訊熵與基尼不純度
可以看出構建決策樹的關鍵是"分裂",不斷地分裂成子節點,一直到葉子節點(不能分裂)為止。那麼這個關鍵分裂的標準和方法是什麼、怎麼分才是最好最恰當的呢?顯然,能把正負樣本完全劃分開,一邊正一邊負,兩邊集合都是很“確定的”最好。在這裡確定性是指一個事件只出現一個結果的可能性,那如何量化“確定性”這個指標呢,一般有兩種方法:資訊熵和基尼不純度。
資訊熵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)可理解為模型預測值自身的變化幅度。下圖形象地了描述這兩個概念。
整合學習演算法思考的問題就是:多個誤差大效果差的個體模型,能不能以某種形式整合起來,變成一個誤差變小效果變好的總體模型呢?這個答案肯定是顯然的,我們都知道人民群眾力量大。其背後的思想就是即使有個別模型預測錯誤,那麼還有其他模型可以糾正回來,正所謂三個臭皮匠勝過一個諸葛亮。
從整合形式上看,主要可以分成兩類,一類模型並行整合的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),不定時推送文章: