test - validacion cruzada en r studio
Cómo dividir datos en conjuntos de entrenamiento/prueba usando la función de muestra (13)
Debajo de una función que crea una list
de submuestras del mismo tamaño que no es exactamente lo que quería, pero podría ser útil para otros. En mi caso, para crear múltiples árboles de clasificación en muestras más pequeñas para probar el sobreajuste:
df_split <- function (df, number){
sizedf <- length(df[,1])
bound <- sizedf/number
list <- list()
for (i in 1:number){
list[i] <- list(df[((i*bound+1)-bound):(i*bound),])
}
return(list)
}
Ejemplo:
x <- matrix(c(1:10), ncol=1)
x
# [,1]
# [1,] 1
# [2,] 2
# [3,] 3
# [4,] 4
# [5,] 5
# [6,] 6
# [7,] 7
# [8,] 8
# [9,] 9
#[10,] 10
x.split <- df_split(x,5)
x.split
# [[1]]
# [1] 1 2
# [[2]]
# [1] 3 4
# [[3]]
# [1] 5 6
# [[4]]
# [1] 7 8
# [[5]]
# [1] 9 10
Acabo de empezar a usar R y no estoy seguro de cómo incorporar mi conjunto de datos con el siguiente código de muestra:
sample(x, size, replace = FALSE, prob = NULL)
Tengo un conjunto de datos que tengo que poner en un conjunto de entrenamiento (75%) y pruebas (25%). No estoy seguro de qué información debo poner en la x y el tamaño? ¿Es x el archivo del conjunto de datos y el tamaño de la cantidad de muestras que tengo?
El paquete de uso de caTools en el código de muestra R será el siguiente:
data
split = sample.split(data$DependentcoloumnName, SplitRatio = 0.6)
training_set = subset(data, split == TRUE)
test_set = subset(data, split == FALSE)
Este es casi el mismo código, pero en un aspecto más agradable
bound <- floor((nrow(df)/4)*3) #define % of training and test set
df <- df[sample(nrow(df)), ] #sample rows
df.train <- df[1:bound, ] #get training set
df.test <- df[(bound+1):nrow(df), ] #get test set
Existen numerosos enfoques para lograr la partición de datos. Para un enfoque más completo, eche un vistazo a la función createDataPartition
en el paquete caret
.
Aquí hay un ejemplo simple:
data(mtcars)
## 75% of the sample size
smp_size <- floor(0.75 * nrow(mtcars))
## set the seed to make your partition reproducible
set.seed(123)
train_ind <- sample(seq_len(nrow(mtcars)), size = smp_size)
train <- mtcars[train_ind, ]
test <- mtcars[-train_ind, ]
Mi solución es básicamente la misma que dickoa pero un poco más fácil de interpretar:
data(mtcars)
n = nrow(mtcars)
trainIndex = sample(1:n, size = round(0.7*n), replace=FALSE)
train = mtcars[trainIndex ,]
test = mtcars[-trainIndex ,]
Se puede hacer fácilmente por:
set.seed(101) # Set Seed so that same sample can be reproduced in future also
# Now Selecting 75% of data as sample from total ''n'' rows of the data
sample <- sample.int(n = nrow(data), size = floor(.75*nrow(data)), replace = F)
train <- data[sample, ]
test <- data[-sample, ]
Al usar el paquete caTools :
require(caTools)
set.seed(101)
sample = sample.split(data$anycolumn, SplitRatio = .75)
train = subset(data, sample == TRUE)
test = subset(data, sample == FALSE)
Si escribe:
?sample
Si se abrirá un menú de ayuda para explicar qué significan los parámetros de la función de muestra.
No soy un experto, pero aquí hay un código que tengo:
data <- data.frame(matrix(rnorm(400), nrow=100))<br>
splitdata <- split(data[1:nrow(data),],sample(rep(1:4,as.integer(nrow(data)/4))))<br>
test <- splitdata[[1]]<br>
train <- rbind(splitdata[[1]],splitdata[[2]],splitdata[[3]])<br>
Esto le dará un 75% de tren y un 25% de prueba.
Solo una manera más breve y simple usando la increíble biblioteca dplyr :
library(dplyr)
set.seed(275) #to get repeatable data
data.train <- sample_frac(Default, 0.7)
train_index <- as.numeric(rownames(data.train))
data.test <- Default[-train.index, ]
Use base R. Function runif
genera valores uniformemente distribuidos de 0 a 1. Al variar el valor de corte (tamaño de tren en el ejemplo a continuación), siempre tendrá aproximadamente el mismo porcentaje de registros aleatorios por debajo del valor de corte.
data(mtcars)
set.seed(123)
#desired proportion of records in training set
train.size<-.7
#true/false vector of values above/below the cutoff above
train.ind<-runif(nrow(mtcars))<train.size
#train
train.df<-mtcars[train.ind,]
#test
test.df<-mtcars[!train.ind,]
Voy a dividir ''a'' en tren (70%) y probar (30%)
a # original data frame
library(dplyr)
train<-sample_frac(a, 0.7)
sid<-as.numeric(rownames(train)) # because rownames() returns character
test<-a[-sid,]
hecho
dplyr
para esto, lo hace super simple. Requiere una variable de identificación en su conjunto de datos, que es una buena idea de todos modos, no solo para la creación de conjuntos, sino también para la trazabilidad durante su proyecto. Agréguelo si ya no lo contiene.
mtcars$id <- 1:nrow(mtcars)
train <- mtcars %>% dplyr::sample_frac(.75)
test <- dplyr::anti_join(mtcars, train, by = ''id'')
library(caret)
intrain<-createDataPartition(y=sub_train$classe,p=0.7,list=FALSE)
training<-m_train[intrain,]
testing<-m_train[-intrain,]
require(caTools)
set.seed(101) #This is used to create same samples everytime
split1=sample.split(data$anycol,SplitRatio=2/3)
train=subset(data,split1==TRUE)
test=subset(data,split1==FALSE)
La función sample.split()
agregará una columna adicional ''split1'' a dataframe y 2/3 de las filas tendrán este valor como TRUE y otras como FALSE. Ahora las filas donde split1 es TRUE se copiarán en trenes y otras filas se copiará para probar el marco de datos.