据我所知,k折叠交叉验证是将训练数据集划分为k个相等的子集,每个子集是不同的。来自R-bloggers的k-fold验证的R代码如下。这个数据有506个障碍物。和14个变量。根据代码,他们使用了10倍。 我的问题是,如果每个折叠具有不同的子集或每个折叠中有一些重复的数据点。我想确保测试每个数据点而不重复,所以我的目标是让每个折叠都有不同数据点。
set.seed(450)
cv.error <- NULL
k <- 10
library(plyr)
pbar <- create_progress_bar('text')
pbar$init(k)
for(i in 1:k){
index <- sample(1:nrow(data),round(0.9*nrow(data)))
train.cv <- scaled[index,]
test.cv <- scaled[-index,]
nn <- neuralnet(f,data=train.cv,hidden=c(5,2),linear.output=T)
pr.nn <- compute(nn,test.cv[,1:13])
pr.nn <- pr.nn$net.result*(max(data$medv)-min(data$medv))+min(data$medv)
test.cv.r <- (test.cv$medv)*(max(data$medv)-min(data$medv))+min(data$medv)
cv.error[i] <- sum((test.cv.r - pr.nn)^2)/nrow(test.cv)
pbar$step()
}
答案 0 :(得分:1)
你可以从循环外部改变整个人口。 以下代码可能会为您提供解决问题的建议。
set.seed(450)
cv.error <- NULL
k <- 10
library(plyr)
pbar <- create_progress_bar('text')
pbar$init(k)
total_index<-sample(1:nrows(data),nrows(data))
## shuffle the whole index of samples
for(i in 1:k){
index<-total_index[(i*(k-1)+1):(i*(k-1)+k)]
## pick the k samples from (i*(k-1)+1) to (i*(k-1)+k).
## so you can avoid of picking overlapping data point in other validation set
train.cv <- scaled[-index,] ## pick the samples not in the index(-validation)
test.cv <- scaled[index,] ## pick the k samples for validation.
nn <- neuralnet(f,data=train.cv,hidden=c(5,2),linear.output=T)
pr.nn <- compute(nn,test.cv[,1:13])
pr.nn <- pr.nn$net.result*(max(data$medv)-min(data$medv))+min(data$medv)
test.cv.r <- (test.cv$medv)*(max(data$medv)-min(data$medv))+min(data$medv)
cv.error[i] <- sum((test.cv.r - pr.nn)^2)/nrow(test.cv)
pbar$step()
}
答案 1 :(得分:0)
这不是K折交叉验证;对于每个折叠,选择一个新的随机样本,而不是将样本分配到前面的K折叠然后循环,依次为测试集分配每个折叠。
set.seed(450)
cv.error <- NULL
k <- 10
library(plyr)
pbar <- create_progress_bar('text')
pbar$init(k)
## Assign samples to K folds initially
index <- sample(letters[seq_len(k)], nrow(data), replace=TRUE)
for(i in seq_len(k)) {
## Make all samples assigned current letter the test set
test_ind <- index == letters[[k]]
test.cv <- scaled[test_ind, ]
## All other samples are assigned to the training set
train.cv <- scaled[!test_ind, ]
## It is bad practice to use T instead of TRUE,
## since T is not a reserved variable, and can be overwritten
nn <- neuralnet(f,data=train.cv,hidden=c(5,2),linear.output=TRUE)
pr.nn <- compute(nn,test.cv[,1:13])
pr.nn <- pr.nn$net.result*(max(data$medv)-min(data$medv))+min(data$medv)
test.cv.r <- (test.cv$medv) * (max(data$medv) - min(data$medv)) + min(data$medv)
cv.error[i] <- sum((test.cv.r - pr.nn) ^ 2) / nrow(test.cv)
pbar$step()
}
然后,为了产生具有较小方差的误差估计,我将多次重复该过程并且在重复测定中可视化交叉验证误差的分布。我认为你最好使用一个包来完成这样的任务,比如优秀的caret。