【问题标题】:Select sample from train data based on fold from k-fold cross-validation根据 k-fold 交叉验证中的 fold 从训练数据中选择样本
【发布时间】:2019-07-18 10:59:34
【问题描述】:

我已经根据这里How to split a data set to do 10-fold cross validation using no packages进行了无包的k-fold交叉验证

我需要从训练数据的每一折中选择 30% 的样本。这是我的功能:

samples = 300
r = 0.83

library('MASS')

df = data.frame(mvrnorm(n=samples, mu=c(0, 0), Sigma=matrix(c(1, r, r, 1), nrow=2), empirical=TRUE))
w = df[sample(nrow(df)),]
w = data.frame(w)
kcv = 10
folds <- cut(seq(from = 1,to = nrow(w)),breaks=kcv,labels=FALSE)
kfolddata<-cbind(w,folds)


for(i in 1:kcv){ #i=1
  testIndexes <- which(kfolddata[,ncol(kfolddata)]==i,arr.ind=TRUE)
  testData <- w[testIndexes, ]
  trainData <- w[-testIndexes, ]
  trainIndexes <- kfolddata[-testIndexes,]

  if(i==1) {
    set.seed=1234
    SubInd = sample(nrow(trainData) , size = round(0.3 * 
                                (nrow(trainData))),replace=F)
  } else {
     SubInd = rbind(SubInd,sample(nrow(trainData) , size = round(0.3 *
                                 nrow(trainData))),replace=F))}}
  }
}

结果将仅显示所选子集的 ID。如何获取 SubInt 的所选 ID 的信息(变量)?

使用rbind 是正确的方法吗?因为我需要从 SubInt 进行另一个循环。

【问题讨论】:

  • 而不是nrow(trainData),如果你有trainIndexes,然后在最后使用w[SubInd, ]。如果你有一个合适的例子,那么给出更好的答案会更容易。
  • @suren 我确实有 trainindex。让我编辑我的帖子

标签: r k-fold


【解决方案1】:

如果您的唯一目标是为每次折叠随机抽取 30% 的训练数据,那么您可以尝试使用 lapply() 而不是 for 循环。结合filter()sample_frac()。 1000个原始案例,第一折的训练数据有900个案例,所以在30%采样时返回270个。

# create df
df <- data.frame(x=runif(1000))

#Randomly shuffle the data
df <- df[sample(nrow(df)),]; df <- data.frame(x=df)

#Create 10 equally size folds
folds <- cut(seq(1,nrow(df)),breaks=10,labels=FALSE)
df$folds <- folds

df1 <- lapply(1:10,function(i){
  train <- df %>% filter(folds!=i) %>% sample_frac(.3)
})

lapply(df1,dim)

d <- df1[[1]]; d %>% count(folds) # check no test data, fold==1
d <- df1[[2]]; d %>% count(folds) # check no test data, fold==2

【讨论】:

    【解决方案2】:

    由于测试折叠的大小不同,使用c 更容易组合结果向量。

    我不知道这是否是你所追求的。我猜是all_0.3trainunique_0.3_train

    for (i in 1 : kcv) { 
    
      trainIndexes <- which(kfolddata[, ncol(kfolddata)] !=i, arr.ind=TRUE)
      testData <- w[-trainIndexes, ]
      trainData <- w[trainIndexes, ]
    
      if (i == 1) {
    
        set.seed(1234)
        SubInd = sample(trainIndexes , size = round(0.3 * 
                                                    nrow(trainData)), replace=F)
      } else {
    
        SubInd = c(trainIndexes, sample(trainIndexes , size = round(0.3 *
                                                      nrow(trainData)), replace=F))
      }
    }
    
    all_0.3train <- w[SubInd, ]
    unique_0.3_train <- w[unique(SubInd), ] 
    

    【讨论】:

    • 谢谢@Suren。不错的输出。
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2019-02-19
    • 2020-10-25
    • 2011-10-01
    • 2020-07-30
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多