k折交叉驗證概述-附R語言實現

因需要拿出部分數據作爲測試,故總有部分數據不能用於構建模型,一種更好選擇是交叉驗證(簡稱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))
}

 

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