R中的K折叠交叉验证

时间:2018-03-20 21:07:27

标签: r neural-network cross-validation

据我所知,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()
}

2 个答案:

答案 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