神經網絡模型,特別是深度神經網絡模型,自AlexNet在Imagenet Challenge 2012上的一舉成名,無疑是Machine Learning Research上最靚的仔,各類進展和突破層出不窮,科學家工程師人人都愛它。
機器學習研究發展至今,除了神經網絡模型這種方法路徑外,還存在許多截然不同的方法路徑,好比說貝葉斯算法、遺傳算法、支持向量機等,這些經典算法在許多場景上也一直沿用。本文介紹的樹模型,也是一種很是經典的機器學習算法,在推薦系統上常常能看到它的身影。
那這個樹模型是怎樣構建和實現的,其核心idea是什麼?樹模型效果不夠好,又能夠用什麼樣的思路和辦法改進呢?本文主要包含如下三個方面的內容:算法
1.決策樹
2.集成學習
3.隨機森林與梯度提高決策樹
複製代碼
決策樹(Decision Tree)是樹模型中最簡單的一個模型,也是後面將要介紹到的隨機深林與梯度提高決策樹兩個模型的基礎。利用決策樹算法,在歷史約會數據集上,咱們能夠畫出這樣一個樹,這顆樹上的葉子節點表示結論,非葉子節點表示依據。一個樣本根據自身特徵,從根節點開始,根據不一樣依據決策,拆分紅子節點,直到只包含一種類別(即一種結論)的葉子節點爲止。markdown
假設有如上面表格的一個數據集,基於這樣數據能夠構建成這樣的一顆決策樹,以下圖所示。 網絡
能夠看出構建決策樹的關鍵是"分裂",不斷地分裂成子節點,一直到葉子節點(不能分裂)爲止。那麼這個關鍵分裂的標準和方法是什麼、怎麼分纔是最好最恰當的呢?顯然,能把正負樣本徹底劃分開,一邊正一邊負,兩邊集合都是很「肯定的」最好。在這裏肯定性是指一個事件只出現一個結果的可能性,那如何量化「肯定性」這個指標呢,通常有兩種方法:信息熵和基尼不純度。
信息熵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爲止。dom
決策樹用於迴歸問題,思路與用分類問題的思路是同樣的。只是將分裂好壞的評價方法,又信息熵改爲平方偏差函數,也就是把增益函數改爲平方偏差增益便可。
假設訓練集中第j個特徵變量 和它的取值s,做爲切分變量和切分點,並定義兩個區域、爲找出最優的j和s,對下式求解
機器學習
在構建決策樹的過程當中,咱們能看到只要樣本不衝突(樣本既是正樣本,又是負樣本),是必定能收斂的,代價就是在決策樹上添加更多(覆蓋樣本少的)葉子節點。可是這樣的決策樹,是徹底沒用概括總結數據的規律,只是至關於把訓練集用樹的形式給背了下來,對於未訓練的數據樣本可能徹底不是一回事,這學到的模型其實是沒有意義的。
決策樹比較容易過擬合,所以須要樹的結構進行約束。利用剪枝等方法來砍掉冗餘的分支,使得樹結構儘可能簡單,以提升樹模型在未訓練數據上的預測表現(也就是泛化能力)。除此以外,集成學習(Ensemble Learning),橫向地增長多個樹,並利用多個樹模型結果綜合判斷,也是個能提升模型性能經常使用方法。常常用在機器學習領域上的各類比賽和競賽上,是個經典的刷榜套路。ide
咱們知道模型都不是完美的,而是有偏差的。而模型的偏差能夠分紅兩種,一種是誤差(Bias)可理解爲與模型預測均值與樣本真值的偏差,一種是方差(Variance)可理解爲模型預測值自身的變化幅度。下圖形象地了描述這兩個概念。
集成學習算法思考的問題就是:多個偏差大效果差的個體模型,能不能以某種形式集成起來,變成一個偏差變小效果變好的整體模型呢?這個答案確定是顯然的,咱們都知道人民羣衆力量大。其背後的思想就是即便有個別模型預測錯誤,那麼還有其餘模型能夠糾正回來,正所謂三個臭皮匠賽過一個諸葛亮。
從集成形式上看,主要能夠分紅兩類,一類模型並行集成的bagging方法,一類模型串行集成的boosting方法。至於爲何能經過這樣形式的集成就能提性能,其理論依據是什麼?這可由模型整體指望和方差,與個體模型方差和誤差之間關係,得出嚴格的數學推導和證實,這裏就不展開了。函數
隨機森林(Random Forrest),一個基於bagging方法,把多個決策樹集成到一塊兒的模型算法。其核心的算法思想就是,經過多個(低誤差高方差)個體模型的均值,來方式下降整體方差的學習方法。隨機森林算法框架以下圖所示。
隨機森林構建流程以下:oop
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
【機器學習】決策樹(中)zhuanlan.zhihu.com/p/86263786