La tarea de la minería de datos es extraer de manera eficiente patrones útiles de grandes bases de datos. La extracción de reglas de asociación surge con el fin descubrir patrones de compra interesantes minando las transacciones de compra en tiendas al menudeo [@hilderman1999knowledge]. Debido a su principal aplicación también se le conoce como Market Basket Analysis y fue propuesta inicialmente en [@agrawal1993mining]. Las reglas que se extraen tienen que ver con los artículos que se compran en una transacción y tienen una forma de implicación, por ejemplo:
La regla sugiere que las personas que compran Skittles y Donas también compran Diet Coke. Las reglas incluyen un porcentaje de transacciones que cumplen con ella. Este conocimiento puede ser utilizado por los empresarios para la toma de decisiones. Por ejemplo, surtir más un producto, hacer promociones o ver el impacto que tendría descontinuar algún articulo.
El problema se ha definido formalmente por @agrawal1993mining: Sea
También se definen dos restricciones que deben cumplir las reglas, el soporte y la confianza.
-
Soporte el soporte indica la frecuencia en la que las transacciones
$T$ incluyen a cierto ítemset.
-
Confianza indica que tan frecuentemente se cumple cierta regla
$X \implies I$ en$T$
Estas restricciones tienen como objetivo el filtrar aquellas reglas que no sean interesantes o que sean poco comunes. El soporte y la confianza se proporcionan al algoritmo como un umbrales mínimos que deben cumplir las reglas que resulten de la búsqueda.
El proceso de minado de reglas puede resumirse en dos pasos:
-
Encontrar todos los conjuntos de artículos que tengan la frecuencia mínima indicada por el umbral de soporte.
-
A partir de los conjuntos de artículos encontrados en el primer paso, se generan reglas que cumplan con la restricción de confianza mínima.
Las dos tareas se detallan en las siguientes secciones.
Para enumerar todos los posibles ítemsets se emplea una rejilla. Como ejemplo
en la figura se muestra la rejilla para el conjunto de ítems
Para reducir el número de ítemsets candidatos a evaluar, se utiliza el principio Apriori :
Si un ítemset ocurre de manera frecuente, entonces todos sus subconjuntos también son frecuentes Esto se ilustra en la figura, donde suponemos que el ítemset {b, c} es frecuente, también los serán {b} y {c}.
Por otro lado, si el ítemset {a} es infrecuente los super conjuntos también lo serán. Esto permite eliminar de la rejilla aquellos ítemsets bajo el ítemset infrecuente. Por ejemplo en la Figura, si hay evidencia de que el ítemset {a} es infrecuente, también los serán {a, b}, {a, c} y {a, b, c} por lo que no hay necesidad de evaluarlos. El algoritmo de generación de ítemsets Apriori se aprovecha de este principio. Se empieza en la raíz de la rejilla evaluando el soporte de los ítemsets con un solo elemento y solo continúa evaluando los ítemsets que incluyan solo a los ítems con el soporte necesario.
Una vez que tenemos los ítemsets frecuentes, podemos empezar a generar reglas.
Tomemos un itemset
Para calcular la confianza, no es necesario evaluar en todas las transacciones, ya que la función de confianza se calcula utilizando el soporte de los ítemsets y esto ya lo calculamos en el paso anterior.
Con el objetivo práctico de reducir el espacio de almacenamiento, se han propuesto técnicas para representar de una manera compacta a la rejilla de artículos frecuentes. Veamos una técnica basada en el concepto de artículos frecuentes máximos. Un ítemset de frecuencia máximo es aquel que en la rejilla no tiene un superconjunto inmediato superior que también sea frecuente.
En la figura se presenta una rejilla con tres con ítemsets de frecuencia máximos
Uno de los algoritmos más utilizados para el minado de reglas de asociación es el algoritmo FP-Growth [@han2000mining]. El algoritmo aborda el problema de generación de ítemsets de una manera muy distinta a la estrategia utilizada por Apriori. El algoritmo propone el uso de una estructura compacta llamada FP-tree de donde se extraen directamente los ítemsets frecuentes:
-
El algoritmo empieza haciendo un recorrido de la base de datos de transacciones
$Trans$ , copiando a una lista$F$ solo los ítems frecuentes con su soporte. Después se ordena$F$ de mayor a menor soporte y al resultado le llamaremos$L$ la lista de ítems frecuentes. -
Se crea el FP-tree,
$T$ , insertando el nodo raíz el cual se etiqueta como null. -
Se recorre de nuevo
$Trans$ y para cada transacción se hace lo siguiente:- Se ordenan sus ítemsets de acuerdo al orden especificado en
$L$ . - A la lista ordenada de ítems se le considera como
$[p|P]$ , donde$p$ es el primer elemento y$P$ el resto. Hecho esto se llama al método insert_tree($[p|P]$ ,$T$ ). - insert_tree(
$[p|P]$ ,$T$ ) hace lo siguiente. Si el árbol$T$ tiene un nodo hijo$N$ con el mismo nombre que$p$ , se incrementa el contador de$N$ ; en caso contrario se crea un nuevo nodo y se la asigna 1 a su contador. El padre de este nuevo nodo será$T$ . El nodo también se liga a otros nodos con el mismo nombre por medio de una estructura adicional llamada "node-link". Si$P$ no está vacío se llama de forma recursiva insert_tree($P$ ,$N$ ).
- Se ordenan sus ítemsets de acuerdo al orden especificado en
Ejercicio
Siguiendo el algoritmo anterior y utilizando la siguiente base de datos de transacciones, recrea en tu mente los pasos necesarios para crear el árbol de la figura. Ver los detalles en [@han2000mining]:
Tid | Ítems | Ítems frecuentes (ordenados) |
---|---|---|
1 | f, a, c, d, g, i, m, p | f, c, a, m, p |
2 | a, b, c, f, l, m; o | f, c, a, b, m |
3 | b, f, h, j, o, | f, b |
4 | b, c, k, s, p, | c, b, p |
5 | a, f, c, e, l, p, m, n | f, c, a, m, p |
Antes de minar la estructura veamos las operaciones que nos permite la estructura:
-
Seguir el "node_link" (flechas punteadas) desde la "Header Table" cualquier ítem
$a_i$ para saber en que ítemsets participa. Por ejemplo, el ítem "p", aparece tres ítemsets, en dos ítemsets iguales {f, c, a, m, p} y en {c, b, p. -
Siguiendo los valores de soporte desde la raíz podemos ver cuantas veces se ha repetido el ítemset hasta el nodo deseado. Por ejemplo, {f, c, a} tiene un soporte de 3, ya que al final de la ruta en el árbol el último elemento tiene 3 (a:3).
El minado se realiza siguiendo una estrategia bottom-up.
Por ejemplo, empezando con el ítem
Primero vemos en que rutas participa. Siguiendo el "node_link": vemos que en
{f, c, a, m, p} y {c, b, p}. Empezamos por revisar el soporte del ítemset
{$p$}, vemos siguiendo el "node_link" que tiene: "p:2" + "p:1" = 3. Por lo
tanto tiene un soporte adecuado, decimos que es un ítemset frecuente. Siguiendo
la primer ruta, ahora revisaremos { m, p}, {a, p}, {c, p} y {f,p }. Es
importante actualizar el soporte de los ítems de la ruta durante el proceso. Ya
que recordemos que no todos los ítemsets registrados más arriba incluyen a
El algoritmo FP-Growth, es un buen ejemplo de el uso de estructuras de datos para mejorar los algoritmos y atacar los problemas con un nuevo enfoque. Incluso en algunos casos FP-Growth mejora el desempeño de Apriori por varios órdenes de magnitud.