Validación cruzada en R

Validación cruzada en R
Información sobre la plantilla

Validación cruzada en R: Esta técnica consiste en dividir los datos en varios conjuntos de datos y luego elegir uno de los conjuntos para medir la precisión de la predicción "test" y el resto para entrenar.

Introducción

Un problema recurrente en el ajuste de modelos es el sobreajuste, que implica que el modelo se ajusta muy bien a nuestro conjunto de datos pero puede no ser útil en el ajuste de otros datos, es decir, es menos generalizable. Una forma de validar el modelo es comprobar si el modelo predice correctamente un nuevo conjunto de datos. Una alternativa, si se disponen de las suficientes observaciones es dividir la muestra en dos submuestras, de forma que una se utilice para ajustar el modelo y la otra para evaluación del mismo. La validación cruzada parte de esta última alternativa, considerando dos variantes. En la primera, la llamada K-Fold cross-validation, se divide la muestra en K submuestras, de forma que se utilizan K-1 para estimar el modelo y la restante como submuestra de evaluación, este proceso se repite K veces, de forma que cada submuestra es utilizada una vez para evaluar el modelo y K-1 veces para el ajuste. A la segunda aproximación se la conoce como leave-one-out cross-validation (LOOCV) y consiste en tomar K igual al número de observaciones, este método exige un mayor coste computacional, debido a que hay que ajustar tantos modelos como observaciones.

Funciones en R

En R podemos programar la validación cruzada o utilizar funciones que vienen incluidas en algunas paquetes: rpart, randomForest.

Ejemplo con library(rpart), (Santana, 2014)

VALIDACION CRUZADA

PACKAGE Y DATA SET
library(C50)
library(rpart)
data(churn)
Variables <- c(4, 7, 16, 19, 17, 20)
datos <- churnTrain[, Variables]
datos <- rbind(datos, churnTest[, Variables])

set.seed(1)
Folds <- 10
datos$kfold <- sample(1:Folds, nrow(datos), replace = T)

MODELOS
Iter <- data.frame(iteracion = NULL, aciertos = NULL)
for (i in 1:Folds)
{
Test <- subset(datos, kfold == i)
Entrenamiento <- subset(datos, !kfold == i)
Modelo <- rpart(churn ~ .,data = Entrenamiento)
Prediccion <- predict(Modelo, Test, type = "class")
MC <- table(Test[, "churn"],Prediccion)
Aciertos <- MC[1, 1] / (MC[1, 1] + MC[2, 1])
Iter <- rbind(Iter, data.frame(Iter = i, acierto = Aciertos))
}

GRAFICO
promedio <- format(mean(Iter$acierto, na.rm=TRUE)*100,digits = 4)
plot(Iter,type = "b", main = "% Prediccion en Cada Iteracion",
cex.axis = .7,cex.lab = .7,cex.main = .8,
xlab ="No. de Iteraciones", ylab="% Prediccion")
abline(h = mean(Iter$acierto), col = "blue", lty = 2)
legend("topright", legend = paste("Eficiencia de Prediccion =", promedio, "%"),
col = "blue", lty = 2, lwd = 1, cex=.7, bg=NULL)


Aplicación

La validación cruzada es muy útil para comparar los resultados de diferentes procedimientos de clasificación y determinar cuál es el más preciso.

Fuentes