Introducción

Este notebook es muy cortito y simplemente quiere mostrar dos ejemplos de implementación desde cero de un train test split y de validación cruzada:

library(MASS)
library(tidyverse)
data(Boston)
df <- Boston
rm(Boston)

Implementación simple de train_test split

1. Definimos el tamaño del test set

test_size <- 0.3 

2. Generamos un vector de índices

set.seed(10)
test_index <- sample(x=1:nrow(df), size=round(test_size*nrow(df),0))

3. Usamos el vector de índices test_index para dividir en dos el dataset

test <- df %>%
        slice(test_index)
train <- df %>%
        slice(-test_index)

4. Comprobamos el tamaño

print(nrow(test))
[1] 152
print(nrow(train))
[1] 354

5. Podemos, entonces, entrenar una regresión en train y evaluarla en test

m1 <- lm(medv ~ ., data=train)
preds <- predict(m1, test)

# ECM
paste0('Error cuadrático medio: ', mean((preds - test$medv)**2))
[1] "Error cuadrático medio: 32.4845791308044"

Implementación simple de cross-validation

1. Mezclamos los casos

# Shuffle de casos
shuff <- sample(x=1:nrow(df), size=nrow(df), replace=FALSE)
df <- df %>%
        slice(shuff)
rm(shuff)

2. Definimos la cantidad de grupos k y generamos un vector de índices index para hacer la validación cruzada

k <- 5
set.seed(12)
index <- rep(1:k,length.out=nrow(df))

3. Generamos un loop en el que vamos iterando sobre el vector de índices index; en cada iteración dividimos en train y test y entrenamos el modelo en train y predecimos en test

for (i in 1:k){
        train <- df %>%
                filter(!(index %in% i)) # Acá iltramos los del grupo u
        test <- df %>%
                filter(index %in% i)
        print(nrow(train))
        print(nrow(test))
        #model[[i]]<-lm(medv ~. , data = train)
        #preds[[i]]<-predict(model[[i]], test)
}
[1] 404
[1] 102
[1] 405
[1] 101
[1] 405
[1] 101
[1] 405
[1] 101
[1] 405
[1] 101

4. Tenemos una lista preds con todas las predicciones. ¿Cómo calcularían el error cross validado del modelo?

model <- list()
preds <- list()
errores <- NA # Agrego vector para recolectar los errores en cada iteración
for (i in 1:k){
        train <- df %>%
                filter(!(index %in% i)) # Acá iltramos los del grupo u
        test <- df %>%
                filter(index %in% i)
       
        model[[i]] <- lm(medv ~. , data = train)
        preds[[i]] <- predict(model[[i]], test)
        errores[i] <- mean((preds[[i]] - test$medv)**2) # Calcular el error de cada iteración
}
mean(errores)
[1] 24.19639
LS0tCnRpdGxlOiAiRWplbXBsb3MgaWx1c3RyYXRpdm9zIGRlIHRyYWluLXRlc3Qgc3BsaXQgeSBjcm9zcy12YWxpZGF0aW9uIGRlc2RlIGNlcm8iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEludHJvZHVjY2nDs24KRXN0ZSBub3RlYm9vayBlcyBtdXkgY29ydGl0byB5IHNpbXBsZW1lbnRlIHF1aWVyZSBtb3N0cmFyIGRvcyBlamVtcGxvcyBkZSBpbXBsZW1lbnRhY2nDs24gZGVzZGUgY2VybyBkZSB1biB0cmFpbiB0ZXN0IHNwbGl0IHkgZGUgdmFsaWRhY2nDs24gY3J1emFkYToKYGBge3J9CmxpYnJhcnkoTUFTUykKbGlicmFyeSh0aWR5dmVyc2UpCmRhdGEoQm9zdG9uKQpkZiA8LSBCb3N0b24Kcm0oQm9zdG9uKQpgYGAKCgojIyBJbXBsZW1lbnRhY2nDs24gc2ltcGxlIGRlIHRyYWluX3Rlc3Qgc3BsaXQKIyMjIyAxLiBEZWZpbmltb3MgZWwgdGFtYcOxbyBkZWwgdGVzdCBzZXQgCmBgYHtyfQp0ZXN0X3NpemUgPC0gMC4zIApgYGAKCiMjIyMgMi4gR2VuZXJhbW9zIHVuIHZlY3RvciBkZSDDrW5kaWNlcwpgYGB7cn0Kc2V0LnNlZWQoMTApCnRlc3RfaW5kZXggPC0gc2FtcGxlKHg9MTpucm93KGRmKSwgc2l6ZT1yb3VuZCh0ZXN0X3NpemUqbnJvdyhkZiksMCkpCmBgYAoKIyMjIyAzLiBVc2Ftb3MgZWwgdmVjdG9yIGRlIMOtbmRpY2VzIGB0ZXN0X2luZGV4YCBwYXJhIGRpdmlkaXIgZW4gZG9zIGVsIGRhdGFzZXQKYGBge3J9CnRlc3QgPC0gZGYgJT4lCiAgICAgICAgc2xpY2UodGVzdF9pbmRleCkKdHJhaW4gPC0gZGYgJT4lCiAgICAgICAgc2xpY2UoLXRlc3RfaW5kZXgpCmBgYAoKIyMjIyA0LiBDb21wcm9iYW1vcyBlbCB0YW1hw7FvCmBgYHtyfQpwcmludChucm93KHRlc3QpKQpwcmludChucm93KHRyYWluKSkKYGBgCiMjIyMgNS4gUG9kZW1vcywgZW50b25jZXMsIGVudHJlbmFyIHVuYSByZWdyZXNpw7NuIGVuIGB0cmFpbmAgeSBldmFsdWFybGEgZW4gYHRlc3RgCmBgYHtyfQptMSA8LSBsbShtZWR2IH4gLiwgZGF0YT10cmFpbikKcHJlZHMgPC0gcHJlZGljdChtMSwgdGVzdCkKCiMgRUNNCnBhc3RlMCgnRXJyb3IgY3VhZHLDoXRpY28gbWVkaW86ICcsIG1lYW4oKHByZWRzIC0gdGVzdCRtZWR2KSoqMikpCmBgYAoKCiMjIyBJbXBsZW1lbnRhY2nDs24gc2ltcGxlIGRlIGNyb3NzLXZhbGlkYXRpb24KIyMjIyAxLiBNZXpjbGFtb3MgbG9zIGNhc29zCmBgYHtyfQojIFNodWZmbGUgZGUgY2Fzb3MKc2h1ZmYgPC0gc2FtcGxlKHg9MTpucm93KGRmKSwgc2l6ZT1ucm93KGRmKSwgcmVwbGFjZT1GQUxTRSkKZGYgPC0gZGYgJT4lCiAgICAgICAgc2xpY2Uoc2h1ZmYpCnJtKHNodWZmKQpgYGAKCiMjIyMgMi4gRGVmaW5pbW9zIGxhIGNhbnRpZGFkIGRlIGdydXBvcyBga2AgeSBnZW5lcmFtb3MgdW4gdmVjdG9yIGRlIMOtbmRpY2VzIGBpbmRleGAgcGFyYSBoYWNlciBsYSB2YWxpZGFjacOzbiBjcnV6YWRhCmBgYHtyfSAKayA8LSA1CnNldC5zZWVkKDEyKQppbmRleCA8LSByZXAoMTprLGxlbmd0aC5vdXQ9bnJvdyhkZikpCmBgYAoKIyMjIyAzLiBHZW5lcmFtb3MgdW4gbG9vcCBlbiBlbCBxdWUgdmFtb3MgaXRlcmFuZG8gc29icmUgZWwgdmVjdG9yIGRlIMOtbmRpY2VzIGBpbmRleGA7IGVuIGNhZGEgaXRlcmFjacOzbiBkaXZpZGltb3MgZW4gdHJhaW4geSB0ZXN0IHkgZW50cmVuYW1vcyBlbCBtb2RlbG8gZW4gYHRyYWluYCB5IHByZWRlY2ltb3MgZW4gYHRlc3RgCmBgYHtyfQptb2RlbCA8LSBsaXN0KCkKcHJlZHMgPC0gbGlzdCgpCmZvciAoaSBpbiAxOmspewogICAgICAgIHRyYWluIDwtIGRmICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKCEoaW5kZXggJWluJSBpKSkgIyBBY8OhIGlsdHJhbW9zIGxvcyBkZWwgZ3J1cG8gdQogICAgICAgIHRlc3QgPC0gZGYgJT4lCiAgICAgICAgICAgICAgICBmaWx0ZXIoaW5kZXggJWluJSBpKQogICAgICAgCiAgICAgICAgbW9kZWxbW2ldXSA8LSBsbShtZWR2IH4uICwgZGF0YSA9IHRyYWluKQogICAgICAgIHByZWRzW1tpXV0gPC0gcHJlZGljdChtb2RlbFtbaV1dLCB0ZXN0KQogICAgICAgIAogICAgICAgICMgQ2FsY3VsYXIgZWwgZXJyb3IgZGUgY2FkYSBpdGVyYWNpw7NuCn0KIyBDYWxjdWxhciBlbCBlcnJvciB0b3RhbCBjcm9zIHZhbGlkYWRvCmBgYAoKIyMjIyA0LiBUZW5lbW9zIHVuYSBsaXN0YSBgcHJlZHNgIGNvbiB0b2RhcyBsYXMgcHJlZGljY2lvbmVzLiDCv0PDs21vIGNhbGN1bGFyw61hbiBlbCBlcnJvciBjcm9zcyB2YWxpZGFkbyBkZWwgbW9kZWxvPwpgYGB7cn0KbW9kZWwgPC0gbGlzdCgpCnByZWRzIDwtIGxpc3QoKQplcnJvcmVzIDwtIE5BICMgQWdyZWdvIHZlY3RvciBwYXJhIHJlY29sZWN0YXIgbG9zIGVycm9yZXMgZW4gY2FkYSBpdGVyYWNpw7NuCmZvciAoaSBpbiAxOmspewogICAgICAgIHRyYWluIDwtIGRmICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKCEoaW5kZXggJWluJSBpKSkgIyBBY8OhIGlsdHJhbW9zIGxvcyBkZWwgZ3J1cG8gdQogICAgICAgIHRlc3QgPC0gZGYgJT4lCiAgICAgICAgICAgICAgICBmaWx0ZXIoaW5kZXggJWluJSBpKQogICAgICAgCiAgICAgICAgbW9kZWxbW2ldXSA8LSBsbShtZWR2IH4uICwgZGF0YSA9IHRyYWluKQogICAgICAgIHByZWRzW1tpXV0gPC0gcHJlZGljdChtb2RlbFtbaV1dLCB0ZXN0KQogICAgICAgIGVycm9yZXNbaV0gPC0gbWVhbigocHJlZHNbW2ldXSAtIHRlc3QkbWVkdikqKjIpICMgQ2FsY3VsYXIgZWwgZXJyb3IgZGUgY2FkYSBpdGVyYWNpw7NuCn0KYGBgCgpgYGB7cn0KbWVhbihlcnJvcmVzKQpgYGAKCg==