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?
Respuestas
¿Demasiados anuncios?caret
tiene 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..
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...
}
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
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