本文由網上多篇博客拼湊而成。
決策樹這種算法有着很多良好的特性,比如說訓練時間復雜度較低,預測的過程比較快速,模型容易展示(容易將得到的決策樹做成圖片展示出來)等。但是同時,單決策樹又有一些不好的地方,比如說容易over-fitting,雖然有一些方法,如剪枝可以減少這種情況,但是還是不夠的。
模型組合(比如說有Boosting,Bagging等)與決策樹相關的算法比較多,這些算法最終的結果是生成N(可能會有幾百棵以上)棵樹,這樣可以大大的減少單決策樹帶來的毛病,有點類似於三個臭皮匠等於一個諸葛亮的做法,雖然這幾百棵決策樹中的每一棵都很簡單(相對於C4.5這種單決策樹來說),但是他們組合起來確是很強大。
隨機森林的優點:
- 在數據集上表現良好
- 在當前的很多數據集上,相對其他算法有着很大的優勢
- 它能夠處理很高維度(feature很多)的數據,並且不用做特征選擇
- 在訓練完后,它能夠給出哪些feature比較重要
- 在創建隨機森林的時候,對generlization error使用的是無偏估計
- 訓練速度快
- 在訓練過程中,能夠檢測到feature間的互相影響
- 容易做成並行化方法
- 實現比較簡單
隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之后,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類算法),然后看看哪一類被選擇最多,就預測這個樣本為那一類。
random forest對輸入的數據要進行行、列的采樣。對於行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復的樣本。假設輸入樣本為N個,那么采樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。然后進行列采樣,從M個feature中,選擇m個(m << M)。之后就是對采樣之后的數據使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要么是無法繼續分裂的,要么里面的所有樣本的都是指向的同一個分類。一般很多的決策樹算法都一個重要的步驟 - 剪枝,但是這里不這樣干,由於之前的兩個隨機采樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。
原始的Boost算法是在算法開始的時候,為每一個樣本賦上一個權重值,初始的時候,大家都是一樣重要的。在每一步訓練中得到的模型,會使得數據點的估計有對有錯,我們就在每一步結束后,增加分錯的點的權重,減少分對的點的權重。等進行了N次迭代(由用戶指定),將會得到N個簡單的分類器(basic learner),然后我們將它們組合起來(比如說可以對它們進行加權、或者讓它們進行投票等),得到一個最終的模型。
而Gradient Boost與傳統的Boost的區別是,每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boost中,每個新的模型的簡歷是為了使得之前模型的殘差往梯度方向減少,與傳統Boost對正確、錯誤的樣本進行加權有着很大的區別。Gradient Boost其實是一個框架,里面可以套入很多不同的算法。
GBDT如何做回歸和分類,可以參見我之前的slides。