我已根据此处How to split a data set to do 10-fold cross validation using no packages
进行了不带包装的k倍交叉验证我需要从训练数据的每个折叠中选择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做另一个循环。
答案 0 :(得分:0)
如果您的唯一目标是为每一叠随机抽取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
答案 1 :(得分:0)
由于测试折叠的大小不同,因此使用c
可以更容易地合并结果向量。
我不确定这是否是您要的。我猜是all_0.3train
或unique_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), ]