分類分析--隨機森林
隨機森林(random forest)是一種組成式的有監督學習方法。在隨機森林中,我們同時生成多個預測模型,並將模型的結果匯總以提升分類准確率。隨機森林的算法涉及對樣本單元和變量進行抽樣,從而生成大量決策樹。對每個樣本單元來說,所有決策樹依次對其進行分類。所有決策樹預測類別中的眾數類別即為隨機森林所預測的這一樣本單元的類別。
假設訓練集中共有N個樣本單元,M個變量,則隨機森林算法如下。
(1) 從訓練集中隨機有放回地抽取N個樣本單元,生成大量決策樹。
(2) 在每一個節點隨機抽取m<M個變量,將其作為分割該節點的候選變量。每一個節點處的變量數應一致。
(3) 完整生成所有決策樹,無需剪枝(最小節點為1)。
(4) 終端節點的所屬類別由節點對應的眾數類別決定。
(5) 對於新的觀測點,用所有的樹對其進行分類,其類別由多數決定原則生成。
生成樹時沒有用到的樣本點所對應的類別可由生成的樹估計,與其真實類別比較即可得到袋外預測(out-of-bag,OOB)誤差。
1 基於傳統決策樹生成隨機森林
randomForest包中的randomForest()函數可用於生成隨機森林。函數默認生成500棵樹,並且默認在每個節點處抽取sqrt(M)個變量,最小節點為1。如下代碼給出了用隨機森林算法對乳腺癌數據預測惡性類的代碼和結果。
(1)隨機森林
library(randomForest)
set.seed(1234)
fit.forest <- randomForest(class~., data=df.train, na.action=na.roughfix, importance=TRUE)
#生成隨機森林,na.action=na.roughfix參數可將數值變量中的缺失值替換成對應列的中位數,類別變量中的缺失值替換成對應列的眾數類(若有多個眾數則隨機選一個)。隨機森林可度量變量重要性,通過設置information=TRUE參數得到。
fit.forest
結果分析:randomForest()函數從訓練集中有放回地隨機抽取489個觀測點,在每棵樹的每個節點隨機抽取3個變量,從而生成了500棵傳統決策樹。
importance(fit.forest, type=2) #給出變量重要性
結果分析:由type=2參數得到的變量相對重要性就是分割該變量時節點不純度(異質性)的下降總量對所有樹取平均。節點不純度由Gini系數定義。結果顯示,sizeUniformity是最重要的變量,mitosis是最不重要的變量。
forest.pred <- predict(fit.forest, df.validate)
#predict()函數用來對對訓練集外樣本點分類
forest.perf1 <- table(df.validate$class, forest.pred,dnn=c("Actual", "Predicted"))
#生成實際類別與預測類別的交叉表
forest.perf1
結果分析:整體來看,驗證集中的准確率達到了(128+68)/210=93%
2 基於條件推斷樹的隨機森林
randomForest包根據傳統決策樹生成隨機森林,而party包中的cforest()函數則可基於條件推斷樹生成隨機森林。當預測變量間高度相關時,基於條件推斷樹的隨機森林可能效果更好。
library(party)
set.seed(1234)
fit.forest <- cforest(class~., data=df.train) #生成森林
fit.forest
forest.pred <- predict(fit.forest, df.validate) #對訓練集外的樣本分類
forest.perf2 <- table(df.validate$class, forest.pred,dnn=c("Actual", "Predicted"))
forest.perf2
結果分析:整體來看,驗證集中的准確率達到了(131+71)/210=96%