domingo, 14 de diciembre de 2014

Bagging para mejorar un modelo predictivo

Una forma de mejorar un modelo predictivo es usando la técnica creada por Leo Breiman que denominó Bagging (o Bootstrap Aggregating). Esta técnica consiste en crear diferentes modelos usando muestras aleatorias con reemplazo y luego combinar o ensamblar los resultados.

La técnica de Bagging sigue estos pasos:
1. Divide el set de Entrenamiento en distintos sub set de datos, obteniendo como resultado diferentes muestras aleatorias con las siguientes características:
   - Muestra uniforme (misma cantidad de individuos en cada set)
   - Muestras con reemplazo (los individuos pueden repetirse en el mismo set de datos).
   - El tamaño de la muestra es igual al tamaño del set de entrenamiento, pero no contiene a todos los individuos ya que algunos se repiten.
   - Si se usan muestras sin reemplazo, suele elegirse el 50% de los datos como tamaño de muestra
2. Luego se crea un modelo predictivo con cada set, obteniendo modelos diferentes
3. Luego se construye o ensambla un único modelo predictivo, que es el promedio de todos los modelos.



Conceptos sobre Bagging:
Disminuye la varianza de un data set al realizar remuestreo con reemplazo..
• Si no existe varianza en el data set, la tecnica de Baggin no mejora significativamente el modelo.
• Es recomendable en modelos de alta inestabilidad (data set con mucha varianza). Ejemplo de inestabilidad: el % de error de la predicción de fraudes de enero , es muy diferente al de febrero.
• Mientras más inestable es un modelo, mejor será la predicción al usar Bagging.
• Se reduce el overfetting o sobre entrenamiento de modelos. Esto porque los modelos no pueden sobreaprender o memorizar ya que ninguno tiene todos los datos de entrenamiento.
• Mejora la predicción, ya que lo que no detecta un modelo lo detectan los otros.
• Reduce el ruido de los outliers, ya los outliers no pueden estar presenten en todos los modelos.
• No mejora significativamente las funciones lineales, ya que el ensamble de una función lineal da como resultado otra función linear.
• Una técnica mejorada del Bagging es el Random Forest (ver ejemplo publicado AQUI), que ademas de elegir un grupo aleatorio de individuos, también elige un grupo aleatorio de variables.
• Los diferentes modelos creados con la técnica Bagging pueden considerarse como algoritmos que buscan  respuestas (o hipótesis) en un data set (o espacio h). Como cada algoritmo tiene un set de datos diferentes, cada uno creará una hipótesis diferentes sobre la realidad.


Conceptualmente la técnica Bagging sería así:







El siguiente script crea un Arbol de Decisión (sin aplicar bagging), y acierta en un 62% en la predicción de la desafiliacion de clientes:

library(rpart);suppressMessages(library(C50));data(churn);
Entrenamiento  <- churnTrain
Test           <- churnTest
 
Modelo_Arbol   <- rpart(churn~., data=Entrenamiento)
Prediccion     <- predict(Modelo_Arbol,Test,type="class")
MC             <- table(Test[, "churn"],Prediccion);MC
Aciertos       <- MC[1,1]/(MC[1,1]+MC[1,2]);Aciertos



Con el siguiente script se aplica Bagging al modelo anterior, obteniendo un  68% de aciertos en la predicción de la desafiliacion. Utiliza el package adabag que aplica el concepto de bagging:

# Ejemplo de Bagging
library(adabag);library(rpart);library(C50);data(churn);
Entrenamiento  <- churnTrain
Test           <- churnTest
set.seed(110
Modelo_AdaBag  <- bagging(churn~., 
                         data=Entrenamiento, 
                         mfinal=9,
                         control=rpart.control(cp = 0.001, minsplit=7))
 
Prediccion     <- predict(Modelo_AdaBag,Test,type="class")$class
MC             <-table(Test[, "churn"],Prediccion);MC
Aciertos       <-MC[1,2]/(MC[1,1]+MC[1,2]);Aciertos





REFERENCIAS:
Documentos
Conceptos sobre Bagging (ppt)
http://www.asepelt.org/ficheros/File/Anales/2003%20-%20Almeria/asepeltPDF/128.pdf
http://webdelprofesor.ula.ve/ingenieria/hhoeger/simulacion/EJEMPLO_BOOTSTRAP.pdf
http://www.unt.edu/rss/class/mike/6810/articles/ResamplingMethods.pdf
videos
 https://www.youtube.com/watch?v=goY0CCLgvdQ
https://www.youtube.com/watch?v=Rm6s6gmLTdg




3 comentarios:

  1. > Prediccion <- predict(Modelo_AdaBag,Test,type="class")$class
    > MC <-table(Test[, "churn"],Prediccion);MC
    Prediccion
    no yes
    yes 90 134
    no 1427 16
    > Aciertos <-MC[1,2]/(MC[1,1]+MC[1,2]);Aciertos
    [1] 0.5982143

    ResponderEliminar
  2. > library(rpart);suppressMessages(library(C50));data(churn);

    > Entrenamiento <- churnTrain

    > Test <- churnTest

    > Modelo_Arbol <- rpart(churn~., data=Entrenamiento)

    > Prediccion <- predict(Modelo_Arbol,Test,type="class")

    > MC <- table(Test[, "churn"],Prediccion);MC
    Prediccion
    yes no
    yes 141 83
    no 34 1409

    > Aciertos <- MC[1,1]/(MC[1,1]+MC[1,2]);Aciertos
    [1] 0.6294643

    ResponderEliminar
  3. And
    > Prediccion <- predict(Modelo_AdaBag,Test,type="class")$class
    > MC <-table(Test[, "churn"],Prediccion);MC
    Prediccion
    no yes
    yes 73 151
    no 1421 22
    > Aciertos <-MC[1,2]/(MC[1,1]+MC[1,2]);Aciertos
    [1] 0.6741071

    ResponderEliminar