隨機森林原理-R語言簡單實例

隨機森林是基於決策樹的組合模型,若因變量爲分類變量則建立分類判別模型,若爲連續變量則建立非線性迴歸分析模型。隨機森林在分類中返回得票數最多的分類選項,在迴歸中返回所有決策樹輸出的平均值。隨機森林是由多個迴歸樹組合而成的模型,廣泛用於分類研究,隨機森林迴歸能夠有效的分析非線性、具有共線性和交互作用的數據,效果要優於多元線性迴歸,並且不需要預先給定模型的形式假定,迴歸效果比迴歸樹更好。隨機森林在實際應用中在分類中效果要優於迴歸,隨機森林不能夠作出超越訓練集數據範圍的預測,這可能導致在對某些還有特定噪聲的數據進行建模時出現過度擬合。

隨機森林迴歸算法流程
隨機森林使用bootstrap重複抽樣方法,也稱自助法,是一種從給定數據集中有放回均勻抽樣,小樣本時效果較好。實際操作從原始樣本中抽取一定數量樣本,允許重複抽樣;根據抽出的樣本計算給定的統計量;重複上述步驟多次,得到多個計算的統計量結果;由統計量結果得到統計量方差。
1、假設原始樣本含量爲N,應用bootstrap有放回隨機抽取b個自助樣本集(一般樣本集中樣本量越大回歸效果越好),並由此構建b顆迴歸樹,同時未抽取到的數據即袋外數據(OOB)作爲隨機森林的測試樣本;
2、設原始數據變量個數爲p,則在每一個迴歸樹的每個節點處隨機抽取m0 個變量(m0 < p )作爲備選分枝變量,一般取m0 =p/3,然後再其中根據分枝優度準則選取最優分枝(同迴歸樹模型建立);其中分枝優度準則是基於離均差平方和,假設有p個自變量X=(X1X2 ,…,Xp )和連續型因變量Y。對於樹的某一節點t的樣本爲{..xn,yn},改節點樣本量爲N(t),由此可知該節點的的離均差平方和。假定該階段t內所有可能的分枝集合(含變量和相應的切點)爲A,分枝s將節點t分裂爲兩個子節點tltr ,其中最佳分枝既爲使得t節點的離均差平方和與分裂後的兩個子節點對應的離均差平方和之和差距最大的分枝,即分裂後效果優於分裂前,使得各子節點內的變異最小。
3、每棵樹開始自頂向下遞歸分枝,設定葉節點最小尺寸爲5,並以此作爲迴歸樹生長的終止條件,即當葉節點數目小於5時,停止分枝;
4、將生成的b顆迴歸樹組成隨機森林迴歸模型,迴歸的效果評價採用帶袋外數據(OOB)預測殘差均方MSE及擬合優度 R2

隨機森林迴歸變量重要性評分

在進行迴歸的過程中,可對變量進行打分,獲取變量重要性得分,增加了模型的可解釋性,其使用permulation隨機置換的方式,通過殘差均方誤差減少量衡量。
隨機置換屬於非參數檢驗的一種,通常用在小樣本情況下,具體來說,總體有m+n個,從中抽取n個作爲樣本A,剩下m個作爲樣本B,比較A、B兩組差異,重複該過程多次。
具體過程如下:
1、每一個自助樣本建立一個迴歸樹,產生袋外數據b個,同時使用該模型對對應的袋外數據OOB進行預測,得到袋外數據的殘差均方及標準誤差(SE);殘差均方記爲MSE1,MSE2,MSE3....MSEB
2、遍歷擬合迴歸樹所用到的變量Xi ,形成新的OOB測試樣本(既只採用Xi 剔除其他變量),然後用已建立的隨機森林對新的OOB進行預測,並獲取置換後的OOB殘差均方,結果矩陣如下

MSE11MSE21...MSEp1MSE12MSE22...MSEp2............MSE1bMSE2b...MSEpb

3、使用MSE1MSE2 ,…,MSEb 與矩陣中i行向量相減後平均最後除以標準誤差SE獲取變量Xi 的重要性評分。

scorei=(bj=1MSEjMSEij)/bSE(1ip)

R簡單實例代碼

數據說明
數據文件內容部分截圖如下,以index作爲因變量,index1~index6爲自變量,有數據可知,因變量爲連續性變量,採用隨機森林的方法進行迴歸擬合(若爲分類變量則進行分類)。
這裏寫圖片描述

R代碼

library(randomForest)#加載R包

randomForestOut<-function(formula,data,pre_num,outFile){
  works<-unique(data$Ipname)
  for(i in 1:length(works)){
    namestr=paste("^",works[i],"$",sep="")
    data_single<-data[grep(namestr,data$Ipname),]#獲取每一部作品的時序數據
    num1=(nrow(data_single)-pre_num)
    train_data<-data_single[1:num1,]#獲取模型訓練數據
    test_data<-data_single[nrow(data_single)-pre_num+1:nrow(data_single),][1:pre_num,]#獲取測試數據
    test_result<-randomRession(train_data,test_data,formula)#調用自定義函數randomRession,獲取測試集結果
    out=data.frame(test_data,test_result)#將原文件數據與迴歸結果輸出
    outPut(out,outFile,i)#調用自定義函數outPut,將結果輸出到外部文件outFile中
  }
}

randomRession<-function(train_data,test_data,formula){
  Randommodel<-randomForest(formula,data=train_data,importance=TRUE,proximity = FALSE)#擬合隨機森林,也可輸出指標的重要性得分imporimportance=TRUE即表示,這裏就不輸出了,可單獨調用這一行,查看
  test_result<-predict(Randommodel,test_data)#獲取擬合隨機森林模型的測試集結果
  return(test_result)
}

outPut<-function(output,outFile,num){
  if(num==1){
    write.table(output,outFile,append=TRUE,sep=",",row.names = FALSE)#第一行輸出保存列名
  }else{
    write.table(output,outFile,append=TRUE,sep=",",row.names = FALSE,col.names = FALSE)#其他行輸出保存不保留列名
  }
}

####調用方法,獲取結果####
data<-read.csv("F://data//indextotal.csv",header = T,as.is = F)#從csv文件中獲取數據
outFile="F://data//result.csv"#指定數據輸出文件
pre_num=4#指定迴歸預測個數
formula=index~index1+index2+index3+index4+index5+index6
randomForestOut(formula,data,pre_num,outFile)#調用方法,並導出結果

備註:R代碼部分參考即可,訓練集和測試集代碼裏面的劃分並不合理,且功能劃分不是很清晰,大致用法就是這樣。

參考論文

參考論文http://www.doc88.com/p-3911030547146.html

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