【问题标题】:K fold cross validation in RR中的K折交叉验证
【发布时间】:2018-08-29 20:26:50
【问题描述】:

据我所知,k折交叉验证是将训练数据集划分为k个相等的子集,每个子​​集都不相同。来自 R-bloggers 的用于 k-fold 验证的 R 代码附在下面。该数据有 506 个 obs。和 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()
}

【问题讨论】:

    标签: r neural-network cross-validation


    【解决方案1】:

    那不是 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

    【讨论】:

      【解决方案2】:

      您可以从循环外部对整个人口进行洗牌。 下面的代码可能会给你一个解决问题的思路。

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

      【讨论】:

      • 感谢您的帮助。我想确保 i=k,对吗?如果我想做 Leave-one-out 交叉验证,我是否只需将 k 的值更改为 506?
      • 洗牌?您还需要对结果变量进行洗牌。我也没有看到简单地预先分配折叠的优势。编辑:我的第二点是有争议的,没有太多的批评。对不起
      • @aocall 是的,结果应该以同样的方式洗牌。我认为这个问题询问了避免验证集中样本重叠的方法。
      猜你喜欢
      • 2016-11-15
      • 2019-12-18
      • 2016-01-15
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多