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))
}

 

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