隨機森林是基於決策樹的組合模型,若因變量爲分類變量則建立分類判別模型,若爲連續變量則建立非線性迴歸分析模型。隨機森林在分類中返回得票數最多的分類選項,在迴歸中返回所有決策樹輸出的平均值。隨機森林是由多個迴歸樹組合而成的模型,廣泛用於分類研究,隨機森林迴歸能夠有效的分析非線性、具有共線性和交互作用的數據,效果要優於多元線性迴歸,並且不需要預先給定模型的形式假定,迴歸效果比迴歸樹更好。隨機森林在實際應用中在分類中效果要優於迴歸,隨機森林不能夠作出超越訓練集數據範圍的預測,這可能導致在對某些還有特定噪聲的數據進行建模時出現過度擬合。
隨機森林迴歸算法流程
隨機森林使用bootstrap重複抽樣方法,也稱自助法,是一種從給定數據集中有放回均勻抽樣,小樣本時效果較好。實際操作從原始樣本中抽取一定數量樣本,允許重複抽樣;根據抽出的樣本計算給定的統計量;重複上述步驟多次,得到多個計算的統計量結果;由統計量結果得到統計量方差。
1、假設原始樣本含量爲N,應用bootstrap有放回隨機抽取b個自助樣本集(一般樣本集中樣本量越大回歸效果越好),並由此構建b顆迴歸樹,同時未抽取到的數據即袋外數據(OOB)作爲隨機森林的測試樣本;
2、設原始數據變量個數爲p,則在每一個迴歸樹的每個節點處隨機抽取
3、每棵樹開始自頂向下遞歸分枝,設定葉節點最小尺寸爲5,並以此作爲迴歸樹生長的終止條件,即當葉節點數目小於5時,停止分枝;
4、將生成的b顆迴歸樹組成隨機森林迴歸模型,迴歸的效果評價採用帶袋外數據(OOB)預測殘差均方MSE及擬合優度
隨機森林迴歸變量重要性評分
在進行迴歸的過程中,可對變量進行打分,獲取變量重要性得分,增加了模型的可解釋性,其使用permulation隨機置換的方式,通過殘差均方誤差減少量衡量。
隨機置換屬於非參數檢驗的一種,通常用在小樣本情況下,具體來說,總體有m+n個,從中抽取n個作爲樣本A,剩下m個作爲樣本B,比較A、B兩組差異,重複該過程多次。
具體過程如下:
1、每一個自助樣本建立一個迴歸樹,產生袋外數據b個,同時使用該模型對對應的袋外數據OOB進行預測,得到袋外數據的殘差均方及標準誤差(SE);殘差均方記爲
2、遍歷擬合迴歸樹所用到的變量
3、使用
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代碼部分參考即可,訓練集和測試集代碼裏面的劃分並不合理,且功能劃分不是很清晰,大致用法就是這樣。
參考論文