Thursday, August 16, 2012

Sobre árboles, específicamente j48.


Los árboles de decisiones son utilizados frecuentemente.

- Permiten hacer búsqueda no exhaustivas, en un espacio de versiones.

- Reciben en sus atributos parametros nominales y continuos. Pero siempre es recomendado discretizar los parametros continuos, para que tenga mejor desempeño, y el porcentaje de correctitud sea mejor.

- Dependiendo de los parámetros de entrada, -c en weka varía la confianza y tomando en cuenta si el conjunto de datos pasó por un preprocesamiento de datos (discretizar, filtrar, limpiar datos, manejo de missing values) el porcentaje de correctitud mejorará.

- Para visualizar el sobreajuste que realizan los árboles de decisiones se realizó un experimento, donde se variaba la confianza desde 0.01 hasta 0.5 en 0.01 los resultados obtenidos en cuanto a correctitud y profundidad del árbol fueron graficados. y se pudo observar que existe un pto en el cual el porcentaje de correctitud con el conjunto de datos de prueba llega a estar cerca del porcentaje de correctitud con el conjunto de datos de entrenamiento. Siendo este punto el mejor arbol ya que no se sobreajusta a la data de entrenamiento, sino más bien por su generalidad  al momento de utilizar la data de prueba permite mantener de forma cercana los porcentajes de correctitud.

- Es un algoritmo robusto, en cuando a factores de ruido (falsos positivos) y atributos con sin valores (missing values)

Los scripts utilizados están en: git hub

No es la mejor forma de realizarlo, se usó de todo, por el poco tiempo y como es necesaria la entrega de resultados. Se terminó así. :)

Los conceptos son tomados de libro Machine learning , Mitchell

Wednesday, August 15, 2012

Utilizando algoritmo apriori. con R


En síntesis:

cuando nos entregan la data, (tablas) 

- Limpiar, strings, colocar todo en minuscula, establecer formato de fechas iguales, ordenar, eliminar o analizar datos que pudiesen ser outlier, establecer formato de precios iguales, establecer formato de cantidades, limpiar los string que contienen ubicaciones, y comentarios.

- Discretizar los valores continuos, se dice de los valores continuos la edad, precios, cantidades ya que "Apriori" sólo trabaja con valores nominales. Se utilizó el algoritmo de clusters k-means para agrupar los valores en rangos. ver clustering.r

- Establecer un archivo con las uniones de las tablas, este archivo próximamente será una matriz de transacciónes, donde las columnas corresponden al producto y cada fila es una transacción. Realmente se realizaron varios archivos y se crearon columnas nuevas conforme requeriamos conocer más sobre el comportamiento de las compras del cliente.

- Para obtener los formatos se utilizó un script muy muy básico en python, requiere mejoras.. xD pero es funcional a nuestra data.

- Se instalaron los paquetes arules, arulessecuences, y "arulesViz" para graficar las reglas.

- Ejecutar script arules.r cambiando los parametros de entrada, por ejemplo el archivo que va a leer, este archivo tiene que tener formato basket también admite single. En weka el formato es arff, por ende tiene que ser preprocesado, el csv tiene un formato tabular. En el modeler recibe el formato single, y basket no difuso.

- Ejeutar script arulessecuences.r para ver que productos implican una compra a futuro. es decir por ejemplo si alguién compra una pizarra acrílica entonces próximamente necesitará nuevos marcadores..


scripts en R y alguno en python

acá u post en inglés un poco más largo: algoritmo Apriori R

Cosas para recordar sobre reglas de asociación.



Las reglas de asociación nos permiten establecer relaciones entre diferentes elementos que conforman un conjunto de transacciones, la clásica historia para plantear un ejemplo de la utilidad de reglas de asociaciones, son los supermercados, ellos manejan altos volumenes de transacciones y muchísimos productos. Entonces si queremos visualizar que productos son llevados en conjunto con frecuencia, necesitamos utilizar reglas de asociación.

Un caso muy comentado en google, es el caso de la regla que asociaba los pañales con la cerveza, para más información acá: Pañales y Cerveza datamining).  No es una regla muy explicita, sin embargo se obtiene con las frecuencias, siendo esto un hecho, y de acuerdo a esto se establecieron promociones, ubicación de artículos en el supermercado, entre otras acciones para mejorar las ventas de sus productos.

Actualmente existen muchos programas para utilizar reglas de asociación, probé varios, el que decidas usar depende de la cantidad de data.

- orange, tiene una interfaz qt  que es linda, pero con muchos artículos (muchas columnas en la transacción) la velocidad de respuesta es lenta, más si tienes una máquina bastante pobre como  la mía. Sin embargo orange lo puedes usar desde scripts sin interfaz gráfica, importando las librerías. Está bueno si sabes programar en python :) 

- weka, puede ser usado sin interfaz gráfica, ya que también es pesado y su tiempo de respuesta puede ser muy lento a medida que tiene más productos las transacciones, además puede configurar que utilice mayor cantidad de memoria RAM, más ram para weka  esto mejora un poco, pero igual con grandes cantidades de datos, luego tienes leer las salidas. Es buena opción. 
sería bash e invocaciónes al jar de weka.

- R ,  paquete arules, y arules secuences, son muy útiles, para buscar reglas de asociación, y patrones de secuencia.  me pareció sencillo de implementar para el caso, y bastante rápido, incluso más rápido que weka.

- Rapid miner, tiene reglas de asociación (invoca la api de weka :-s), el detalle es que es Java y su interfaz gráfica es pesada (mucha memoria ram), por lo que al tener muchas transacciones y columnas (productos) tarda en devolver las reglas, y secuencias. Se puede añadir más memoria ram, sin embargo este sería el más lento de los mencionados. 

- Modeler, es privativo, y no tengo licencia, pero igual lo usé en el laboratorio. y no es tan rápido como R.

Métricas, de esta comparación, no las guardé en un archivo, ya que el objetivo del post no es comparar, sino recordarme algunos tópicos de las reglas de asociación que tuve que realizar para el trabajo práctico. Otro día será..

Formatos para reglas de asociación.

Formatos para obtener reglas de asociación.
Single:

IDtransaccion1, Producto1
IDtransaccion1, Producto2
IDtransaccion1, Producto3
IDtransaccion1, Producto4

Basket:

IDtransaccion1, Producto1, Producto2, Producto3, Producto4
IDtransaccion2, Producto1, Producto6, 
IDtransaccion3, Producto1, Producto2, Producto3, Producto4, Producto5,  Producto6

Basket no difuso:

IDtransaccion1, Producto1, Producto2, Producto3, Producto4
IDtransaccion2, Producto1, Producto2, Producto3, Producto4
IDtransaccion3, Producto1, Producto2, Producto3, Producto4
IDtransaccion4, Producto1, Producto2, Producto3, Producto4
IDtransaccion5, Producto1, Producto2, Producto3, Producto4

En Modeler, Transacional es el formato single. Y Tabular es el formato basket no difuso, es decir sus columnas siempre son iguales , y sus valores tienen ausencia o presencia de productos.

weka puede recibir un archivo csv, sin embargo requiere ser transformado a su formato natico arff, y recibe el formato basket difuso y no difuso.

En orange, recibe el formato basket, difuso y no difuso, pero separado con tabs.

R lee formato basket (difuso o no) y single.

La tetera me recuerda a kettle, que sirve para organizar, y preprocesar la data antes de ejecutar cualquier algoritmo.

Sunday, August 12, 2012

Hacer un logs de todas las acciones realizadas en la línea de comando, terminal, consola.


A menudo me pasa que estoy haciendo alguna instalación  de un programa y quiero replicarlo en la computadora de algún compañer@ de clases, quizás por no tener la misma estructura de directorios, permisología de algunos archivos, o los archivos que leia el script en la computadora del compañer@ estaban vacíos. Pasan errores de capa 8 muy a menudo y supones que son tan tontos que no deberían pasar pero pasan.. :-|

El comando script permite grabar todo lo que ejecuten en la consola (terminal, línea de comando o como lo digan). Entonces cuando te digan que lo ejecutan y no funciona, y  no es algún@ compañer@ que tienes cerca para ver en su computadora, y no imaginas pedir ssh (por alguna razón).  puedes comentarle que ejecute el comando script y luego reproduzca los pasos que realizó para la instalación, ejecución de algún script, o lo que necesites que reproduzca.

user@hostname~ $ script archivodondeguardarlog.txt
user@hostname~ $ls
COPYING         changelogs           remoteExperimentServer.jar  weka.ico
README          data       
user@hostname~ $chroot dir
user@hostname~ $ cd weka

Para finalizar  el comando script
user@hostname~ $ exit

y luego que te envíe el archivo,  archivodondeguardarlog.txt
este archivo si lo revisas con un editor de texto vim, gedit, o kate, tiene caracteres especiales. Para visualizarlo de la misma forma que aparecieron en la terminal, se deben visualizar con cat.

 user@hostname~ $ cat archivodondeguardarlog.txt

Para ejecutar lo que contiene el script, Ojo ojito ojo.. (alguna vez tuve un profesor en la universidad que decía esa frase cuando teníamos que estar pendiente de algo.) En su ejecución deben tener creadas todas las variables, y directorios que estan mencionados en el script:

 user@hostname~ $ script -c archivodondeguardarlog.txt

foto: Yoda, que la fuerza te acompañe..