因需要拿出部分数据作为测试,故总有部分数据不能用于构建模型,一种更好选择是交叉验证(简称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))
}