k折交叉验证概述-附R语言实现

16 篇文章 1 订阅

因需要拿出部分数据作为测试,故总有部分数据不能用于构建模型,一种更好选择是交叉验证(简称CV)。k折交叉验证是交叉验证方法中的一种(是进行模型比较的有效方法),将整体数据集分为k份(每份近似相等),其中k-1份作为训练数据,另外一份作为验证数据集,并计算预测误差平方和。用验证集来验证所得分类器或模型的错误率,循环以上实验k次,直到所有k份数据都被选择一遍为止。选择小一点的k容易高方差,大一点的k容易高偏差,通常k=10

计算这r个验证集预测误差平方和的平均值,平均值最小的模型是最优模型。待最优模型选定后,仍然需要基于全体训练样本集估计模型参数。交叉验证存在着划分方式的不同情况,因此可采用不同划分方式重复进行交叉验证。如利用不同划分方式划分数据5次,每次均划分10折,即称之为5次10折交叉验证

交叉验证还有一种特殊情况称为留一交叉验证(leave one Out)。令样本划分次数k等于数据集合D的样本数量n,即每份子集只包含一个样本。优点是每次训练集都与原始数据集接近,且也能做到训练集与测试集对立,可保证得到结果相对比较准确。相对而言采取这种方式意味着计算开销会大大增加

交叉验证同样需要先进行分层,再组合构造成k份近似相等的样本集,这样训练集和测试集的数据分布均与原数据大体相同

#交叉检验前需要对数据分组,要符合随机且平均	
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))
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值