決策樹與隨機森林與GBDT

本節簡單介紹下隨機森林。前面花了兩節詳細介紹過決策樹的核心內容,這對於理解隨機森林算法很重要。

隨機森林與SVM應該來說被視爲傳統機器學習效果最好的兩大算法,是值得每個機器學習從業者深入瞭解的,從最底層的原理到上層的應用,內部的每個核心細節等等。關於SVM的每個細節,先前的文章有介紹,文末也有參考鏈接。

迴歸正題,說完決策樹,說說隨機森林,我們知道決策樹是單獨的一棵樹,是根據所有訓練樣本的所有特徵維度通過重要性屬性依次選擇構造起來的一個樹,通常還是二叉樹,也就是一個節點只有左右兩個分支。那麼隨機森林呢,也是有樹結構,不同點在於,隨機森林是由好多樹相互獨立並將結果組合起來的一種分類方法。

你可能會問,一組訓練樣本如果能產生很多決策樹,那每個決策樹不是一樣的嗎?如果說用同樣的訓練樣本,同樣的特徵,理論上確實出來的決策樹就是一樣的,因此爲了保證決策樹不一樣,隨機森林想了個辦法,大的原則就是保證進入訓練的單棵決策樹的樣本不一樣(包括樣本數量,樣本的特徵維度,以及其他都可以影響訓練模型不一樣的因素)。

(1)從特徵維度上不一樣。如果用於訓練的所有樣本特徵維度是一樣的,通常得到的樹結構就比較像,既然如此,弄成不一樣的不就好了,具體操作上,對於不同的樹,對原始樣本隨機選擇一定的特徵維度當成新的訓練樣本維度,其他的沒被選擇在這一棵樹訓練階段丟掉。比如樣本有0-9這10個不同維度的特徵。那麼決策樹1隨機選擇5個維度,比如恰好選到了(0,1,4,5,7),而決策樹2也隨機選擇5個,比如恰好是(2,3,7,8,9),依次類推決策樹3,4,5等等。可想而之,因爲屬性維度的不同,構造出來的決策樹不可能一樣,從而保證了他們的差異性。

(2)從樣本數量上的選擇。同樣,假設總共有100個訓練樣本,對於決策樹1,隨機挑50個樣本去訓練,決策樹2也隨機挑50個。因爲訓練樣本的不同,那麼即使你的特徵屬性相同,得到的決策樹也不可能相同。爲什麼呢?想想我們上節談到決策樹構造的過程,樣本數量決定着樣本佔比的概率,決定着信息熵的計算結果,自然決定着最終每個節點被選擇的屬性。更何況,他們的屬性因爲(1)的選擇還不一樣。

這是兩類最廣的構造隨機森林的策略。上面我們說過,其實核心就是針對不同決策樹構造訓練樣本的差異就好了,所以符合這個原則的都可以。

當很多決策樹被構造出來以後,作爲分類算法,那麼一個樣本的最終分類結果可以是這些很多決策樹預測結果的平均值,或者投票值等等。對於迴歸算法,也是一樣,可以是所有樹的平均值。

這麼來看,就可以理解隨機森林爲什麼又是集成學習的典型算法,也是一種由弱分類器組合形成的強分類器的方法。單棵樹不強,但是多棵樹就非常強。單棵樹只能覆蓋部分屬性,但是多棵樹相互補充,就能覆蓋全部特徵,而且能有效避免單棵樹用所有特徵存在的過擬合問題。

集成學習裏面還有一種弱分類器組合強分類器的方法,就是Boosting。相對於Boosting,隨機森林的這種是Bagging。

Boosting是怎麼做的呢?也是先用樣本構造一個決策樹1,然後用同一組樣本繼續訓練,但是要注意,對於這一組樣本的權重需要變一下,怎麼變,由於我們得到決策樹1,我們就可以計算出哪些樣本被分類錯了,把這些錯的挑出來,加大他們訓練的懲罰權重去訓練決策樹2,這樣這些樣本在決策樹2種可能就不會被分錯,但是有個問題,那就是在決策樹1種分對的樣本,因爲權重的調整導致在決策樹2中被分錯,那麼在決策樹2上繼續調整權重訓練決策樹3,依次類推。最終也能得到決策樹1-n,然後把結果並起來作爲最終的預測結果。

對比可以發現,都是集成學習,但是思路幾乎完全不一樣。

主要區別有:

(1)Bagging的樹之間是完全獨立訓練的,無聯繫;Boosting樹之間是有前後關係的,訓練有聯繫;

(2)Bagging的樣本可以隨機選,Boosting不可以,自始自終固定,因爲你要是隨機選了,樣本權重就沒了,你把樣本整沒了還談什麼權重。

(3)訓練的機制導致Bagging是並行化的,而Boosting是串行的。那麼也許你也會想到,Bagging訓練的速度就快些,而且對於大規模分佈式訓練來說,Bagging的優勢就更大了。

Bagging與Boosting幾乎是面試必考題,給大家一個思考題,這是以前面試的時候碰到的,請問這兩者的訓練機制誰是在調整方差,誰又是在調整偏差訓練的?

回答這個問題首先理解下什麼是方差,所謂方差,就是樣本的平均值與所有樣本之間的誤差平方和這樣的一個東西吧。而偏差呢?就是預測樣本與實際樣本的之間的誤差吧,偏嘛,偏多少,偏差。所以你再來回答一下這個問題。

Bagging對應的是方差,Boosting對應的是偏差。Bagging在使得整體的分類偏差最小化,Boosting每次都在調整權重使得這一次的預測結果儘可能與實際接近,是偏差。

最後來總結一下,不同的方法碰到決策樹以後就是不同的算法:

1)Bagging + 決策樹 = 隨機森林

2)Boosting + 決策樹 = 提升樹(adaboost等)

3)Gradient Boosting + 決策樹 = GBDT

4)Gradient Boosting優化改進 + 決策樹 = xgboost

關於adaboost算法,以前精講過,參見更多閱讀。

再簡單介紹下Gradient Boosting,翻譯就是梯度提升。所謂梯度,可以形象的理解爲上面的樣本權重,提升就是每次這個權重都在針對性的變,後面一個樹結構一定是改進前一個決策樹不能完成的分類樣本的。

其實這麼來看,就可以看到其實Boosting的針對性更強,因爲它就是針對弱點進行改進的,改完了還有弱點繼續改進,一直到幾乎沒有弱點。而Bagging,典型的隨機森林,全是隨機的,除了靠拼樹的數量,沒有其他辦法了。從這個角度似乎解釋了爲什麼牛逼的比賽,kaggle比賽,天池比賽等等,很多模型上的都是GBDT和xgboost,效果一定是比隨機森林要好纔會被使用的,但是性能嘛,像xgboost應該是優化了很多性能的,速度應該也還可以。但是依然可以預測,在數以億計的海量數據面前,單從性能來講,給你足夠的機器,基於分佈式的隨機森林速度訓練肯定是要比xgboost快的,這是他們的底層原理決定的。

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