14 votos

Cómo dividir un conjunto de datos 10 veces cruzar validación

Ahora tengo un R estructura de datos (en formación), alguien puede decirme ¿cómo dividir al azar este conjunto de datos 10 veces cruzar la validación?

22voto

Craig Walker Puntos 13478

carettiene una función para esto:

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

Entonces cada elemento de flds es una lista de índices para cada conjunto de datos. Si el conjunto de datos se llama dat , entonces dat[flds$train,] se obtiene el conjunto de entrenamiento, dat[ flds[[2]], ] obtiene el doblez del segundo set, etc..

12voto

Thelonious Puntos 1038

Aquí está una manera simple de realizar 10 veces con ningún paquete:

#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...
}

2voto

Sai Puntos 1

Probablemente no la mejor manera, pero aquí es una manera de hacerlo. Estoy bastante seguro de que cuando escribí este código había prestado un truco de otra respuesta aquí, pero no pude encontrarlo para vincular a.

# 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

1voto

Alex Puntos 6580

a continuación encontrará algunos otros códigos que utilizo (tomado y adaptado de otra fuente). Copiado directamente de un guión que apenas usé yo mismo, en la rutina rpart. La parte probablemente más de interés son las líneas en la creación de los pliegues. Alternativamente - puede utilizar la función crossval del paquete del arranque.

#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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X