因需要拿出部分數據作爲測試,故總有部分數據不能用於構建模型,一種更好選擇是交叉驗證(簡稱CV)。k折交叉驗證是交叉驗證方法中的一種(是進行模型比較的有效方法),將整體數據集分爲k份(每份近似相等),其中k-1份作爲訓練數據,另外一份作爲驗證數據集,並計算預測誤差平方和。用驗證集來驗證所得分類器或模型的錯誤率,循環以上實驗k次,直到所有k份數據都被選擇一遍爲止。選擇小一點的k容易高方差,大一點的k容易高偏差,通常k=10
計算這r個驗證集預測誤差平方和的平均值,平均值最小的模型是最優模型。待最優模型選定後,仍然需要基於全體訓練樣本集估計模型參數
#交叉檢驗前需要對數據分組,要符合隨機且平均
CVgroup<-function(k,datasize,seed){
cvlist<-list()
set.seed(seed)
n<-rep(1:k,ceiling(datasize/k))[1:datasize] #向上取整
temp<-sample(n,datasize) #無放回抽樣將n打亂
x<-1:k
dataseq<-1:datasize
#dataseq中隨機生成k個隨機有序數據列
cvlist<-lapply(x,function(x) dataseq[temp==x])
return(cvlist)
}
#k折交叉驗證實現隨機森林
data<-iris
k=10
cvlist=CVgroup(k,nrow(data),seed=23)
library(plyr)
library(randomForest)
j<-seq(10,1000,by=20) #隨機森林決策樹數量,間隔過小無實際意義
i<-1:k
i<-rep(i,times=length(j))
j<-rep(j,each=k)
x<-cbind(i,j) #在循環更換驗證集條件下,都用10個決策樹建立隨機森林
cvtest<-function(i,j){
train<-data[-cvlist[[i]],]
test<-data[cvlist[[i]],]
model<-randomForest(Sepal.Length~.,data=train,ntree=j)
prediction<-predict(model,subset(test,select=-Sepal.Length))
temp<-data.frame(cbind(subset(test,select=Sepal.Length),prediction))
}