随机森林模型详解
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足夠大時,依據極限推導訓練集中每個樣本未被抽中的概率為將收斂于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左右上下波動??梢婋S機森林對結果的預測并非過擬合
總結
- 上一篇: vuex随记
- 下一篇: 【libjpeg-turbo】安装指南[