如何拆分数据集以进行10倍交叉验证


14

现在我有了一个R数据框(训练),有人可以告诉我如何随机拆分此数据集以进行10倍交叉验证吗?


2
确保重复整个过程100次以达到令人满意的精度。
Frank Harrell 2013年

确保分别对案例和对照样本进行采样,然后将它们组合到每个块中。
Shicheng Guo

如果您使用caret :: train,那么您甚至都不需要在意。这将在内部完成,您可以选择折叠的数量。如果您坚持“手动”执行此操作,请使用在插入符:: createFolds中实现的类的分层抽样。
marbel 2014年

我锁定了该线程,因为许多答案中的每一个都将其视为仅一个编码问题,而不是一般的统计兴趣之一。
ub

Answers:


22

caret 具有以下功能:

require(caret)
flds <- createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
names(flds)[1] <- "train"

然后每个元素 flds是每个数据集的索引列表。如果您的数据集称为dat,那么dat[flds$train,]您将获得训练集,dat[ flds[[2]], ]并获得第二个折叠集,依此类推。


12

这是不使用软件包执行10折的简单方法:

#Randomly shuffle the data
yourData<-yourData[sample(nrow(yourData)),]

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

#Perform 10 fold cross validation
for(i in 1:10){
    #Segement your data by fold using the which() function 
    testIndexes <- which(folds==i,arr.ind=TRUE)
    testData <- yourData[testIndexes, ]
    trainData <- yourData[-testIndexes, ]
    #Use the test and train data partitions however you desire...
}

-1:插入符功能可对您没有进行的分层抽样。如果有人为您简化了工作流程,那么重新发明焊缝又有什么意义呢?
marbel 2014年

10
你在开玩笑吗?答案的全部目的是执行10折,而不必安装整个插入符号包。您提出的唯一好处是,人们应该了解他们的代码实际上是做什么的。年轻的蚱hopper,分层采样并不总是最好的方法。例如,它赋予具有更多数据的子组更多的重要性,这并不总是可取的。(如果您不知道它的发生,则为Esp)。这是关于对数据使用最佳方法。巨魔谨慎地我的朋友:)
杰克·德鲁

@JakeDrew我意识到这是一篇老文章了,但是是否有可能要求一些指导,以了解如何使用测试和训练数据来获取每次迭代的VAR(p)模型的平均平均误差?
youjustreadthis


@JakeDrew imho的两个答案都应加1。一个带有一个程序包,另一个带有代码...
natbusa 16-4-26

2

可能不是最好的方法,但这是一种方法。我很确定当我编写此代码时,是从这里的另一个答案中借来了一个窍门,但我找不到它的链接。

# Generate some test data
x <- runif(100)*10 #Random values between 0 and 10
y <- x+rnorm(100)*.1 #y~x+error
dataset <- data.frame(x,y) #Create data frame
plot(dataset$x,dataset$y) #Plot the data

#install.packages("cvTools")
library(cvTools) #run the above line if you don't have this library

k <- 10 #the number of folds

folds <- cvFolds(NROW(dataset), K=k)
dataset$holdoutpred <- rep(0,nrow(dataset))

for(i in 1:k){
  train <- dataset[folds$subsets[folds$which != i], ] #Set the training set
  validation <- dataset[folds$subsets[folds$which == i], ] #Set the validation set

  newlm <- lm(y~x,data=train) #Get your new linear model (just fit on the train data)
  newpred <- predict(newlm,newdata=validation) #Get the predicitons for the validation set (from the model just fit on the train data)

  dataset[folds$subsets[folds$which == i], ]$holdoutpred <- newpred #Put the hold out prediction in the data set for later use
}

dataset$holdoutpred #do whatever you want with these predictions

1

请在下面找到我使用的其他代码(从其他来源借来并改编)。从我刚用过的脚本直接复制到rpart例程中。可能最感兴趣的部分是褶皱的线条。或者,您可以使用bootstrap包中的crossval函数。

#define error matrix
err <- matrix(NA,nrow=1,ncol=10)
errcv=err

#creation of folds
for(c in 1:10){

n=nrow(df);K=10; sizeblock= n%/%K;alea=runif(n);rang=rank(alea);bloc=(rang-1)%/%sizeblock+1;bloc[bloc==K+1]=K;bloc=factor(bloc); bloc=as.factor(bloc);print(summary(bloc))

for(k in 1:10){

#rpart
fit=rpart(type~., data=df[bloc!=k,],xval=0) ; (predict(fit,df[bloc==k,]))
answers=(predict(fit,df[bloc==k,],type="class")==resp[bloc==k])
err[1,k]=1-(sum(answers)/length(answers))

}

err
errcv[,c]=rowMeans(err, na.rm = FALSE, dims = 1)

}
errcv

1
# Evaluate models uses k-fold cross-validation
install.packages("DAAG")
library("DAAG")

cv.lm(data=dat, form.lm=mod1, m= 10, plotit = F)

只需一行代码即可为您完成所有工作!

?cv.lm for information on input and output

0

因为我不在此列表中,所以我想为不想安装软件包以进行快速交叉验证的人提供另一种选择

# get the data from somewhere and specify number of folds
data <- read.csv('my_data.csv')
nrFolds <- 10

# generate array containing fold-number for each sample (row)
folds <- rep_len(1:nrFolds, nrow(data))

# actual cross validation
for(k in 1:nrFolds) {
    # actual split of the data
    fold <- which(folds == k)
    data.train <- data[-fold,]
    data.test <- data[fold,]

    # train and test your model with data.train and data.test
}

请注意,上面的代码假定数据已经被改组。如果不是这种情况,您可以考虑添加类似

folds <- sample(folds, nrow(data))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.