martes, 30 de junio de 2015

Random Forest usando rpart


  • 1. Selección de variables al azar en cada arbol, considerando la raíz cuadrada del total de variables como el tamaño de variables a remuestrear en cada iteracion. (el método original remuestrea variables en cada nodo del arbol).
  • 2. Muestras con reemplazo en Iteraciones, y tamaño de muestra es igual al Train-Dataset
  • 3. Arboles sin podar, dejando crecer (en reglas) el algoritmo en cada iteracion.

















Y los arboles creados en cada iteración quedan así (solo para ilustrar la profundidad en reglas de cada árbol):


























# ---------------------------------------------------
# Carga package, datos y defina cantidad de iteraciones
library(rpart);library(foreach); library(C50); data(churn)
Test         <- churnTest
Train        <- churnTrain
Iteraciones  <-10 # Cantidad de arboles
 
#------------------------------------------------------------------
# Crea el modelo con multiples arboles de decision
# Cada arbol tiene variables y observaciones diferentes en cada iteracion
modeloRF.rpart<- foreach(i=1:Iteraciones) %do% {  
  # seleccion de variables y formula -----------------------
  m.try           <- ceiling(sqrt(length((Train)))) # raiz cuadrada de total de variables
  clase           <- 'churn'                        # identifica variable a predecir
  variables       <- names(Train)[-which(names(Train)==clase)] # vector con variables predictoras
  set.mtry        <- sample(length(variables),m.try+1) # seleccion aleatoria de variables predictoras
  set.variables   <- paste(variables[set.mtry],collapse="+") # label de variables preidctors elegidas
  formula.rpart   <- paste(clase,'~',set.variables) # formula con variable a predecir y predictoras
 
  # modelo rpart -------------------------------------------  
  rpart(formula.rpart,
               Train[sample(nrow(Train), # total de registros en Train
                            nrow(Train), # elige muestra con cantidad igual a Train original
                            replace = T),], # muestras con reemplazo, los registros se repiten
                control=rpart.control(cp = 0) # arboles sin podar
        )
}  
 
 
#----------------------------------------------------------------- 
# Hace prediccion usando el modelo ya creado previamente
# Luego Acumula la prediccion de cada arbol en un data.frame
Prediccion <-as.data.frame(
  foreach(i=1:Iteraciones,.combine=cbind) %do% 
  {as.character(predict(modeloRF.rpart[[i]], Test,type = "class"))}
  )
 
#----------------------------------------------------------------- 
# Calcula la prediccion final usando tecnica de Voto Mayoritario
Prediccion$Cantidad_yes    <- rowSums(Prediccion [, 1:Iteraciones] == "yes")
Prediccion$Cantidad_no     <- rowSums(Prediccion [, 1:Iteraciones] == "no")
Prediccion$Prediccion      <- with(Prediccion,(ifelse(Cantidad_yes>Cantidad_no,"yes","no")))
MC                         <- table(Test[, "churn"],Prediccion[,"Prediccion"]);
Efectividad                <- MC["yes","yes"]/(MC["yes","yes"]+MC["no","yes"]);
Captado                    <- MC["yes","yes"]/(MC["yes","yes"]+MC["yes","no"])
print(MC)
print(Efectividad)
print(Captado)

No hay comentarios:

Publicar un comentario