Как разделить набор данных, чтобы сделать 10-кратную перекрестную проверку

14

Теперь у меня есть Rфрейм данных (обучение), может кто-нибудь сказать мне, как случайным образом разделить этот набор данных для проведения перекрестной проверки в 10 раз?

user22062
источник
2
Не забудьте повторить весь процесс 100 раз, чтобы достичь удовлетворительной точности.
Фрэнк Харрелл
Обязательно выполните выборку кейса и контрольную выборку отдельно, а затем объедините их для каждого блока.
Shicheng Guo
Если вы используете caret :: train, вам даже не нужно заботиться об этом. Это будет сделано внутри, вы можете выбрать количество сгибов. Если вы настаиваете на том, чтобы делать это «вручную», используйте стратифицированную выборку класса, реализованную в caret :: createFolds.
Марбель
Я заблокировал эту ветку, потому что каждый из множества ответов рассматривает ее как вопрос кодирования, а не как общий статистический интерес.
whuber

Ответы:

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: каретные функции делают стратифицированную выборку, которую вы не делаете. Какой смысл заново изобретать weel, если кто-то сделал все проще для вас?
Марбель
10
Ты издеваешься? Основная цель ответа - выполнить 10 раз без необходимости установки всего пакета каретки. Единственное хорошее замечание, которое вы делаете, это то, что люди должны понимать, что на самом деле делает их код. Молодой кузнечик, стратифицированный отбор проб не всегда лучший подход. Например, это придает большее значение подгруппам с большим количеством данных, что не всегда желательно. (Esp, если вы не знаете, что это происходит). Речь идет об использовании наилучшего подхода к вашим данным. Тролль с осторожностью мой друг :)
Джейк Дрю
@JakeDrew Я понимаю, что это старая статья сейчас, но можно ли попросить некоторые рекомендации о том, как использовать тестовые и обучающие данные, чтобы получить среднюю среднюю ошибку VAR (p) модели для каждой итерации?
прочитали это
@JakeDrew imho оба ответа заслуживают плюса 1. Один с пакетом, другой с кодом ...
natbusa
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. Часть, вероятно, наибольший интерес представляют линии по созданию складок. В качестве альтернативы - вы можете использовать функцию 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
Wouter
источник
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
user1930111
источник
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))
Мистер Цйолдер
источник