隨機森林模型詳解

1.定義

決策樹+bagging=隨機森林,隨機森林是一種比較新的機器學習模型(非線性基於樹的模型)集成學習方法。上世紀八十年代Breiman等人發明分類樹算法,通過反覆二分數據進行分類或迴歸,計算量大大降低,2001年Breiman把分類樹組合成隨機森林,即在變量(列)的使用和數據(行)的使用上進行隨機化,生成很多分類樹,再彙總分類樹結果。隨機森林在運算量沒有顯著提高前提下提高了預測精度,隨機森林對多元共線性不敏感,結果對缺失數據和非平衡數據比較穩健,可以很好地預測多達幾千個解釋變量的作用,被譽爲當前最好算法之一

隨機森林是集羣分類模型中的一種,隨機森林是用隨機的方式建立一個森林,森林由很多的決策樹組成,且每一棵決策樹之間是沒有關聯的。得到隨機森林模型後,當新樣本進入時隨機森林中的每一棵決策樹分別進行判斷,bagging集合策略比較簡單,對於分類問題通常使用投票法,得到最多票數類別或者類別之一爲最終模型輸出。對於迴歸通常使用簡單平均法,T個弱學習器得到的迴歸結果進行算術平均即最終模型輸出

隨機森林使用CART決策樹作爲弱學習器

2.優缺點

優點:

a.在數據集上表現良好,兩個隨機性的引入使隨機森林不容易陷入過擬合

b.在當前很多數據集上,相對其他算法有很大優勢,兩個隨機性的引入使得隨機森林具有很好的抗噪聲能力

c.能處理高維度(feature很多)數據,且不用做特徵選擇,對數據集適應能力強:既能處理離散型數據,也能處理連續型數據,數據集無需規範化

d.可生成一個Proximities=pij矩陣,用於度量樣本間相似性: pij=aij/N, aij表示樣本i和j出現在隨機森林中同一個葉結點的次數,N隨機森林樹的顆數

e.創建隨機森林時,對generlization error使用的是無偏估計

f.訓練速度快,可得到變量重要性排序

g.在訓練過程中,能夠檢測到feature間的互相影響

h.容易做成並行化方法,針對大樣本訓練速度有優勢

i.實現比較簡單

缺點:

a.在某些噪音比較大的樣本集上,RF模型容易陷入過擬合

b.取值劃分比較多的特徵容易對RF決策產生更大的影響,從而影響擬合模型效果

3.應用範圍

隨機森林主要應用於迴歸和分類。隨機森林進行bootstrap抽樣,但它與bagging區別是:生成每棵樹時每個節點變量都僅在隨機選出的少數變量中產生。因此不但樣本是隨機的,連每個節點變量(Features)的產生都是隨機的

許多研究表明組合分類器比單一分類器的分類效果好,隨機森林是一種利用多個分類樹對數據進行判別與分類的方法,它在對數據進行分類的同時,還可以給出各個變量重要性評分,評估各個變量在分類中所起的作用

4.基本原理

隨機森林通過自助法(bootstrap)重採樣技術,從原始訓練樣本集N中有放回地重複隨機抽取k個樣本(k一般和N相同)生成新的訓練樣本集,然後根據自助樣本集生成n個分類樹組成隨機森林。其實質是對決策樹算法的一種改進,將多個決策樹合併在一起,每棵樹的建立依賴於一個獨立抽取的樣本集

特徵選擇採用隨機方法,然後比較不同情況下產生的誤差,能檢測到內在估計誤差、分類能力和相關性決定選擇特徵的數目。單棵樹分類能力可能很小,但在隨機產生大量決策樹後,一個測試樣品可通過每一棵樹的分類結果經統計後選擇最可能的分類

假設輸入的樣本量爲N個,那麼採樣樣本量也爲N個。這樣使在訓練時每棵樹的輸入樣本都不是全部樣本,相對不容易出現over-fitting。然後進行列採樣從M個feature中選擇m個(m << M)。之後是對採樣後的數據使用完全分裂方式建立出決策樹,這樣決策樹某一葉子節點要麼是無法繼續分裂的,要麼裏面所有樣本都是指向的同一個分類。一般很多決策樹算法都一個重要步驟—剪枝,但這裏不這樣幹,由於兩個隨機採樣過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting

5.實現過程

隨機森林模型的OOB統計,當隨機森林模型利用Bootstrap抽樣法抽取樣本時,以N表示訓練集中樣本個數,當N足夠大時,依據極限推導訓練集中每個樣本未被抽中的概率爲(1-1/N)^{N}將收斂於36.8%,即原始數據中有接近37%的樣本不會出現在Bootstrap樣本中,這些數據成爲袋外數據,可以用來對模型泛化誤差進行估計

1.從原始訓練數據集中,應用bootstrap方法有放回地隨機抽取k個新自助樣本集,並由此構建k棵決策樹,每次未被抽到的樣本組成K個袋外數據。2.設有n 個特徵,在每一棵樹的每個節點處隨機抽取mtry 個特徵,通過計算每個特徵的蘊含信息量,在特徵中選擇一個最具分類能力的特徵進行節點分裂。3.每棵樹最大限度生長不做任何剪裁。4.將生成的多棵樹組成隨機森林,用隨機森林對新數據進行分類,分類結果按樹分類器投票多少而定

5.1.數據隨機選取

首先從原始數據集中採取有放回抽樣,構造子數據集,子數據集數據量是與原始數據集相同的,不同子數據集的元素可以重複,同一子數據集中的元素也可重複。第二利用子數據集構建子決策樹,將這個數據放到子決策樹中,每個子決策樹輸出一個結果。最後如果有新數據需要通過隨機森林得到分類結果,就可通過對子決策樹的判斷結果投票,得到隨機森林輸出結果。假設隨機森林中有3棵子決策樹,2棵子樹分類結果是A類,1棵子樹分類結果是B類,那麼隨機森林的分類結果就是A類

5.2.待選特徵隨機選取

與數據集隨機選取類似,隨機森林子決策樹的每一分裂過程(即每一枝節點處)並未用到所有待選特徵,而是從所有待選特徵中隨機選取一定數量特徵(三分之一,值越小模型越健壯,無放回抽取),之後再在隨機選取特徵中選取最優特徵。這樣能使隨機森林中的決策樹都能彼此不同,提升系統多樣性從而提升分類性能

下圖藍色方塊代表所有可被選擇的特徵,也就是目前待選特徵。黃色方塊是分裂特徵。左邊是一棵決策樹的特徵選取過程,通過在待選特徵中選取最優分裂特徵完成分裂。右邊是一顆隨機森林子樹的特徵選取過程

分枝優度準則是基於離均差平方和,假設有p個自變量X=(X1,X2,…,Xp)和連續型因變量Y。對於樹某一節點t的樣本量爲N(t),可計算該節點的離均差平方和。假定該階段t內所有可能的分枝集合(含變量和相應切點)爲A,分枝s將節點t分裂爲兩個子節點tl與tr,最佳分枝即使t節點離均差平方和與分裂後兩個子節點對應離均差平方和之和差距最大的分枝,即分裂後效果優於分裂前,使得各子節點內的變異最小

將生成的b顆迴歸樹組成隨機森林迴歸模型,迴歸效果評價採用袋外數據預測均方殘差MSE及擬合優度 R2

5.3.重要性評分

定義爲袋外數據自變量值發生輕微擾動後的分類正確率與擾動前分類正確率的平均減少量,OOB誤差

1.對於每棵決策樹,利用袋外數據進行預測,將袋外數據的預測誤差記錄下來。每棵樹誤差爲:vote1,vote2,...,voteb

2.隨機變換每個預測變量,從而形成新的袋外數據,再利用袋外數據進行驗證,其每個變量的誤差是:vote11,vote12,...,vote1b

3.對於某預測變量,計算其重要性是變換後的預測誤差與原來相比差的均值

 6.party包

與randomForest包不同之處在於party可處理缺失值。party包中的隨機森林建模函數爲cforest(ctree函數建立決策樹),mtry表示在每棵樹的每個節點處隨機抽取mtry 個特徵,通過計算每個特徵的蘊含信息量,在特徵中選擇一個最具分類能力的特徵進行節點分裂。varimp代表重要性函數

ctree()不能很好地處理缺失值,含有缺失值的觀測有時被劃分到左子樹,有時劃到右子樹,這是由缺失值的替代規則決定的

library(party)
set.seed(42)
crf<-cforest(carb~.,control=cforest_unbiased(mtry=2,ntree=50),data=mtcars) 
print(crf)
varimpt<-data.frame(varimp(crf))

 

7.randomForest包

使用randomForest存在兩個限制,一是該函數不能處理帶有缺失值的數據,要事先對缺失值進行處理。二是分類屬性水平劃分最大值爲32,大於32的分類屬性需要事先轉換,party包中的cforest沒有限定分類屬性水平劃分數

library(randomForest)
data(iris)
set.seed(100)
ind=sample(2,nrow(iris),replace=TRUE,prob=c(0.8,0.2))

#ntree生成決策樹數目
#mtry選擇分裂屬性個數
#importance=TRUE是否輸出分裂屬性重要性
#proximity=TRUE表示生成臨近矩陣(樣本間相似性)
#nperm計算importance重複次數
iris.rf=randomForest(Species~.,iris[ind==1,],ntree=50,nPerm=10,mtry=3,proximity=TRUE,importance=TRUE)
print(iris.rf)
iris.pred=predict(iris.rf,iris[ind==2,])
table(observed=iris[ind==2,"Species"],predicted=iris.pred)

#預測概率即衆數的那一類佔當前樣本集的比例
iris.pred=predict(iris.rf,iris[ind==2,],type="prob");
#type="class"預測分類結果


#重要性繪圖函數
varlmpPlot(iris.rf)
#調用plot函數繪製隨機森林對象均方差,即繪製誤差率
plot(iris.rf)
隨機森林默認決策樹數目500,分別計算不同數目下誤差率
n=500
nerr_train=nerr_test<-rep(0,n)
for(i in 1:n){
	fit<-randomForest(是否流失~.,data=train_data,mtry=6,ntree=i)
	train<-predict(fit,train_data,type="class")
	test<-predict(fit,test_data,type="class")
	nerr_train[i]<-sum(train_data$是否流失!=train)/nrow(train_data)
	nerr_test[i]<-sum(test_data$是否流失!=test)/nrow(test_data)
}
plot(1:n,nerr_train,type="l",ylim=c(min(nerr_train,nerr_test),max(nerr_train,nerr_test)),xlab="數的數目",ylab="誤差率",lty=1,col=1)
lines(1:n,nerr_test,lty=2,col=2)
legend("right",lty=1:2,col=1:2,legend =c("訓練集","測試集"),bty="n",cex=0.8)

圖形給出隨機森林ntree取不同數值時,訓練集與測試集的誤差大小,隨着取值不斷增大訓練集誤差在0處穩定,測試集誤差波動幅度不斷減小,在0.075左右上下波動。可見隨機森林對結果的預測並非過擬合

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