domingo, 2 de noviembre de 2014

Validación Cruzada

Si se tiene un modelo predictivo (como un "Árbol de Decisión" por ejemplo) que predice la desafiliación de clientes (o cualquier otra cosa), y se quiere saber qué tan buena será la predicción con datos futuros, una forma de lograrlo es usar la técnica de Validación Cruzada con K Iteraciones (también llamado "k fold cross validation". Ver referencia No.1 y 2 para detalle).

Esta técnica consiste en dividir los datos en varios set de datos y luego elegir uno de los set para "testear" y el resto para entrenar el Árbol de Decisión. Esto se hace de forma repetida hasta "testear" con cada set de datos, guardando el resultado de cada iteración en una tabla para luego analizar la eficiencia de la predicción. Este método viene del concepto Leave One Out. (ver Referencia No.2)


Conceptualmente sería algo como lo siguiente:










































Al realizar 10 iteraciones y tener % de predicción en cada iteración en una tabla, puede graficarse el resultado y obtener un promedio de la eficiencia general del modelo predictivo:



















NOTA: 
Si la variación entre los fold es muy alta, indica que el modelo no se ajusta correctamente a los datos.
Para paralelizar validacion cruzada ver nota publicada AQUI.


# 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]) 
 
 
# FOLDS
# ------------------------------------------------------------------------------- 
set.seed(1)
Folds         <- 10            
datos$kfold   <- sample(1:Folds, nrow(datos), replace = T)
 
 
# ITERACION MODELOS + PREDICCION
# -------------------------------------------------------------------------------- 
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)

2. http://es.wikipedia.org/wiki/Validaci%C3%B3n_cruzada




3 comentarios:

  1. En este caso entonces... cual seria el mejor modelo o arbol para el set de datos?

    Saludos

    ResponderEliminar
  2. Buenas tardes, me gusto mucho esta publicación, tengo una pregunta ¿por qué escoge justamente esas variables (4,7,16,17,19,20)? ¿qué proceso de selección uso?

    ResponderEliminar
  3. Hola! porque se usan 10 interacciones? hay alguna razón en especial?

    Saludos

    ResponderEliminar