miércoles, 26 de noviembre de 2014

Ejemplo de Random Forest

Random Forest es un algoritmo predictivo que usa la técnica de Bagging para combinar diferentes arboles, donde cada árbol es construido con observaciones y variables aleatorias.

En forma resumida sigue este proceso:
  1. Selecciona individuos al azar (usando muestreo con reemplazo) para crear diferentes set de datos.
  2. Crea un árbol de decisión con cada set de datos, obteniendo diferentes arboles, ya que cada set contiene diferentes individuos y diferentes variables en cada nodo.
  3. Al crear los arboles se eligen variables al azar en cada nodo del arbol, dejando crecer el arbol en profundidad (es decir, sin podar).
  4. Predice los nuevos datos usando el "voto mayoritario", donde clasificará como "positivo" si la mayoría de los arboles predicen la observación como positiva.

Conceptualmente sería así:







sábado, 22 de noviembre de 2014

Paralelizacion de Validacion Cruzada


Si se quiere saber qué tan eficiente es la predicción de un algoritmo, una forma es usar la tecnica de Validacion Cruzada (ver ejemplo AQUI). Esta técnica consiste en hacer varios modelos de forma iterada, usando diferentes arreglos del set de Entrenamiento y del set de Test en cada iteracion.

Cuando se tienen muchos datos, la Validación Cruzada puede tardar mucho tiempo de ejecución, y una forma de mejorar esto es paralelizando las iteraciones.

Conceptualmente seria algo como lo siguiente:



domingo, 16 de noviembre de 2014

Asignar un Cluster a Datos Nuevos

Si se tiene una segmentacion realizada con kmean que divide a los clientes en tres gurpos, y se quiere identificar a qué grupo pertenecen los clientes nuevos, sin ejecutar nuevamente el algoritmo (es decir, sin reentrenar) puede usarse el package flexclust que permite identificar a qué grupo o cluster son mas parecidos los cliente nuevo.

El resultado conceptual seria el siguiente:









jueves, 13 de noviembre de 2014

Paralelizando Iteraciones de K-Means

Si se hace una segmentacion con k-means en un set de datos muy grande, pueden obtenerse resultados significativamente diferentes en cada ejecucion. Una forma de obtener el mejor resultado es usando el parametro nstart para indicar cuantos set de datos se van a considerar al inicio del algoritmo para luego quedarse con el mejor.

Si al usar nstart se hace mas lenta la ejecución de k-means, puede paralelizarse este proceso y distribuir la tarea entre varios procesadores.

El siguiente scrip es una ejecución de k-means con nstart = 100. Tiene un tiempo de ejecucion de 1 minuto en un procesador i7

#-----------------------------------------------------------------------------
suppressWarnings(library(C50)); library(rpart); data(churn);
Datos<-churnTrain[,c(2,6:19)]
for (i in 1:4) Datos<-rbind(Datos,Datos)  aumenta dataset duplicandolo
system.time(Madelo<-kmeans(Datos, centers = 5, iter.max = 100, nstart = 100))
#-----------------------------------------------------------------------------


lunes, 10 de noviembre de 2014

Paralelizar una Optimizacion de K-Means

Si se quiere comparar las diferentes variaciones de k-means para luego usar el mejor (ver ejemplo con detalle publicado AQUI) , es posible que el tiempo de ejecución sea muy alto si existen muchos datos. Una de las causas de esto es que R no hace ejecución en paralelo por defecto.

Una forma de mejorar los tiempos de ejecución es "Paralelizando los Procesos", donde se asigna a cada núcleo del procesador una tarea distinta y luego se unen los diferentes resultado de cada proceso.

El siguiente script paraleliza 4 ejecuciones de k-means que corresponden a sus 4 variaciones (Hartigan-Wong, Lloyd, Forgy y MacQueen). Si se ejecuta este proceso sin paralelizar en un procesador i7, el tiempo aproximado es de 1 minuto. Luego de paralelizar, se el tiempo de ejecución es de 5 segundos.

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: