Теперь у меня есть Rфрейм данных (обучение), может кто-нибудь сказать мне, как случайным образом разделить этот набор данных для проведения перекрестной проверки в 10 раз?
Теперь у меня есть Rфрейм данных (обучение), может кто-нибудь сказать мне, как случайным образом разделить этот набор данных для проведения перекрестной проверки в 10 раз?
Ответы:
caret имеет функцию для этого:
require(caret)
flds <- createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
names(flds)[1] <- "train"
Тогда каждый элемент fldsпредставляет собой список индексов для каждого набора данных. Если ваш набор данных вызывается dat, то dat[flds$train,]вы получаете тренировочный набор, dat[ flds[[2]], ]второй набор фолдов и т. Д.
Вот простой способ выполнить 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...
}
Возможно, не самый лучший способ, но вот один из способов сделать это. Я почти уверен, что когда я писал этот код, я заимствовал уловку из другого ответа здесь, но я не мог найти его для ссылки.
# 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
Пожалуйста, найдите ниже некоторый другой код, который я использую (заимствованный и адаптированный из другого источника). Скопировал его прямо из сценария, который я сам использовал, оставленный в процедуре 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
# 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
Поскольку в этом списке я не использовал свой подход, я подумал, что могу поделиться другим вариантом для людей, которые не хотят устанавливать пакеты для быстрой перекрестной проверки.
# 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))