Buscar este blog

jueves, 2 de octubre de 2014

Clustering, algoritmo K-means

Bueno en esta entrega brindaré un poco de teoria acerca del clustering y mostraré el algoritmo K-means, ya en otras entregas manejarè un algoritmo por cada tipo de clustering.

Bien primero ¿Qué es el clustering?,pues bien, este es un análisis que se realiza sobre los datos con el objetivo de obtener agrupaciones que nos puedan brindar información acerca de los mismos.

El objetivo principal es poder determinar la similitud o diferencia de los elementos que conforman nuestra información y en base a esto podemos tomar decisiones.

En muchas ocasiones la noción de los cluster en nuestra información no está bien definida, veamos un ejemplo, tomando en cuenta la siguiente imagen:






Si quisieramos agrupar los circulos en la misma podriamos tener los siguientes resultados (entre muchos otros):


o bien



uno mas


 

Como podemos apreciar, depende mucho de la interpretación que deseemos darle a nuestra información. Usualmente una buena idea es conocer los datos antes siquiera de intentar agruparlos, posterior a ello se deben de probar diversos algoritmos de agrupamiento para asi poder determinar cual es el mas indicado.

Otra peculiaridad es como queremos que se formen los grupos, usualmente existen 3 formas:

Particionales: Los grupos se definen perfectamente, de tal manera que un elemento solo puede pertenecer a un grupo (Las imágenes de arriba detallan este ejemplo)

Jerarquico: Los elementos estan agrupados en jerarquias, de tal manera que un elemento pertenece a un grupo, pero puede al mismo tiempo pertenecer a un subgrupo. La imagen siguiente muestra un ejemplo de este caso:



Este tipo de clustering son de los mas utilizados debido a que suelen ser muy representativos y nos dan usualmente un buen punto de partida para entender nuestra información, veamos la siguiente imagen de un cluster jerarquico real:



Difusos: Estos definen que un elemento puede tener cierto grado de pertenecia aun grupo u otro, por ejemplo, digamos que tenemos dos grupos, uno donde se definen a los delgados y otro que define a los obesos, supongamos que nos llega una persona que tiene 3 kilos de sobrepeso, podriamos ponerla con un 40% de pertenecia al grupo de delgados y un 60% al grupo de obesos.


Pues bien, una vez que hayamos definido el tipo de cluster que deseamos utilizar, nos queda por elegir la metodología con la cual crearemos los grupos, a continuación muestro diversas formas (abordaré un algoritmo por tema en futuras entregas):

Grupos bien separados ó definidos: No existe mucho que decir aquí, en estos casos los grupos estan como su nombre lo dice bien definidos , usualmente con determinadas características que los hacen particulares y dificiles de confundir, por ejemplo, podemos tener dos grupos uno para aves y otro para reptiles.


Basados en prototipos: En estos algoritmos se suele determinar la pertenencia a un grupo en base a alguna medida de distancia. Como punto de partida es comun usar algun dato muy representativo de cada grupo o alguna medida estadística como la media o la mediana.(cabe mencionar que este tipo de metodologías es necesario le proporcionemos cuantos grupos queremos crear).


Basados en conexiones: Aqui los elementos estan conectados de alguna manera con su grupo particular y desconectados de los otros grupos. Estos algoritmos son utiles para encontrar grupos con formas no comunes. La imagen siguiente muestra un ejemplo de estas agrupaciones:



Basados en densidad: Estos grupos se forman organizando los elementos en base a regiones pobladas, usualmente aquellos elementos que se encuentran fuera de estas regiones son ignorados o se consideran que no forman parte del grupo:


Basados en forma: En este tipo de clusters se conocen bien los datos y usualmente se definen fórmulas que representan a los grupos. La siguiente imagen muestra a dos grupos definidos, uno por tener una forma triangular y otro una rectangular:




Bien ahora que ya tenemos la teoria, veamos el algortimo K-means, este es un cluster basado en prototipos, veamos su algoritmo:

  • Paso 1 : Establece un grupo K como centroides en el espacio representado
  • Paso 2 : Calcula la distancia de cada objeto con cada uno de los centroides de K y asígnalo al centroide del cual su distancia sea menor.
  • Paso 3: Cuando todos los objetos sean asignados, entonces recalcula la posición de los centroides.
  • Paso 4: Repite los pasos 2 y 3 hasta que los centroides no se muevan mas.

Para el paso 1 usualmente se suele tomar alguna medida estadística como la media o la mediana, algun dato que represente perfectamente a cada grupo o bien se utilizan datos aleatorios. Dependiendo del número de grupos que demos serán los cluster que obtendremos.

Para el paso 2 se puede utilizar cualquier fórmula de distancia. Cada objeto será comparado con todos los centroides y se asignará al centroide que haya tenido una distancia menor.

Para el paso 3, usualmente se utiliza alguna heurístca personalizada para determinar como modificar los centroides, aunque en la práctica se suele calcular la media o mediana de sus objetos y movilizar los centroides a esa posición

Para el paso 4, de la misma manera se suele utilizar una heurística que nos permita determinar alguna condición de paro, estas van desde correr el proceso un número determinado de ocasiones, sumar las distancias mas cortas del paso 2 y si se obtiene una suma inferior continuar con el proceso (siendo esta la mas usada y en algunos casos considerada obligatoria) o bien determinar un mecanismo personalizado para el problema en cuestión.

Como vemos es en realidad un algoritmo sencillo de implementar “” , las siguientes imagenes muestran un ejemplo del algoritmo K-means con la base de datos de iris. Para poder representarla en 2D simplemente utilice el algoritmo PCA (Lo explicaré en otra entrada) para obtener 2 dimensiones.

Veamos como evoluciona el algoritmo Kmeans cuando movemos los centroides hacia su media(como punto de partida inicial se tomo un objeto aleatorio dentro del grupo):







La condición de paro se tomó cuando su medición no pudiese descender, en este caso el algoritmo convergió en su cuarta corrida, ya que de hecho su medición fue mayor, tomando a la imagen 3 como el mejor cluster que logró clasificar

Veamos ahora el mismo algoritmo pero esta vez moviendo a los centroides con la mediana:











Como vemos funcionó mejor la mediana ya que su medición menor se encuentra en 77 mientras que para la media fue de 79, claro que necesitó de mas pasos para converger.

domingo, 4 de mayo de 2014

Reglas de asociación, algoritmo apriori

Las reglas de asociación son una de las formas mas interesantes del data mining, esto claro a mi simple parecer, y ello debido al tipo de información que arrojan y a que su uso es directo, esto es, podemos generar reglas y sin mucho mas análisis entregarlas a los departamentos correspondientes para que realicen estrategias en base a las mismas.

Bien, pero ¿Qué es una regla de asociación?, bueno, sin tanta profundidad se trata de reglas que indican cierta relación entre sus conjuntos, sin que esto implique causalidad, por ejemplo, supongamos que tenemos una base de datos transaccional de alguna tienda departamental y obtenemos la siguiente regla

{pañales, leche, huevo } => {cerveza, cigarros}

la misma quiere decir que aquellos clientes que compraron pañales, leche y huevos también adquirieron cerveza y cigarros.

En general no es difícil extraer las reglas a partir de las bases de datos, el detalle (y aquí esta el problema) es que es muy costoso computacionalmente, tanto que pudiese ser imposible de generarlas para una base de datos con muchísimos productos, sin mas detalle, imaginemos que tenemos una base de datos con solo 10 productos (tomemos en cuenta que una departamental como walmart debe de tener miles en su inventario), entonces para extraer las reglas debemos hacer combinaciones de estos productos, a decir, para 10 productos tendremos 1024 posibles reglas (estas son las posibles combinaciones entre 10 productos de diversos tamaños) ahora si tuviésemos 20 entonces seria 1,048,576 posibles combinaciones, y esto es el problema de los algoritmos con complejidad exponencial.

La siguiente imagen [1] muestra a mayor detalle lo que intento explicar para cinco productos a decir :{a,b,c,d,e}





Es por ello que se usa la regla anti monotona para la poda, que nos dice en pocas palabras: si un conjunto es infrecuente, entonces todos los conjuntos en donde este último se encuentre tambien seran infrecuentes,es decir, si tenemos al conjunto {A,B} y este es infrecuente, entonces {A,B,C} , {A,B,E}, {A,D,B,E} tambien seran infrecuentes por contener a A y B en ellos. Entonces ignoraremos a todos estos, la imagen siguiente[1] muestra un ejemplo visual:



Bien pero vayamos poco a poco.

La forma de generar las reglas de asociación consta de dos pasos:

  • Generación de combinaciones frecuentes: cuyo objetivo es encontrar aquellos conjuntos que sean frecuentes en la base de datos. Para determinar la frecuencia se establece cierto umbral.
  • Generación de reglas: A partir de los conjuntos frecuentes no encargamos de generar las reglas, igual se parte de un indice.


El indice para la generación de combinaciones se llama soporte y el indice para la generación de reglas se llama confidencia.

Bien ahora entendiendo esto pues manos a la obra, tomemos el siguiente ejemplo

Pan, leche, pañales
Pan, pañales, cerveza, huevos
Leche, pañales, cerveza, refresco, café
Pan,leche,pañales,cerveza
Pan,refresco,leche,pañales


Bien el primer paso es generar las combinaciones frecuentes, entonces, digamos que queremos un soporte superior al 50%.

Entonces busquemos dichos items, primero se parte de lo individual, es decir, para cada articulo se cuenta su frecuencia:

Cerveza 3
Pan 4
Refresco 2
Pañales 5
Leche 4
Huevos 1
Café 1


Para calcular el soporte, simplemente se utiliza la siguiente fórmula :
(Cantidad de repeticiones del producto) / (Cantidad de transacciones)

Para nuestro ejemplo tenemos 5 transacciones, entonces tenemos que para cerveza su soporte es:
Soporte Cerveza = 3 / 5 = 0.6, es decir, 60% , bien calculando los demás productos tendremos la siguiente información:



Cerveza 60.00%
Pan 80.00%
Refresco 40.00%
Pañales 100.00%
Leche 80.00%
Huevos 20.00%
Café 20.00%


Como queremos un soporte mayor al 50% entonces podemos eliminar a refresco, huevos y café,

Bien ahora lo interesante, generemos combinaciones con los siguientes productos, iremos iterando, primero combinaciones de dos y calcularemos su soporte, luego con tres, cuatro etc.

Entonces para dos tenemos:

Conjuntos Frecuencia Soporte
Cerveza,Pan 2 40.00%
Cerveza,Pañales 3 60.00%
Cerveza,Leche 2 40.00%
Pan, Pañales 4 80.00%
Pan, Leche 3 60.00%
Pañales, Leche 4 80.00%


Entonces tenemos nuestros primeros conjuntos frecuentes que son (su soporte es superior al 50%):

Cerveza,Pañales
Pan,Pañales
Pan, Leche
Pañales, Leche


Ahora, generaremos item de tres conjuntos, a partir de los conjuntos generados anteriormente y tenemos

Cerveza, Pañales, Pan
Cerveza, Pañales, Leche
Pan,Pañales,leche
Pan,Leche,cerveza


Y ahora calculamos la frecuencia y el soporte

Conjuntos Frecuencia Soporte
Cerveza, Pañales, Pan 2 40.00%
Cerveza, Pañales, Leche 2 40.00%
Pan,Pañales,leche 3 60.00%
Pan,Leche,cerveza 1 20.00%

Bien ahora procederíamos a generar los items de cuatro a decir solo seria Pan,Pañales,Leche Cerveza y como tiene un soporte del 20% entonces aquí terminamos de generar nuestros conjuntos frecuentes y obtuvimos:

Pan,Pañales,leche
Cerveza,Pañales
Pan, Pañales
Pan, Leche
Pañales, Leche


Entonces a partir de estos conjuntos obtendremos las reglas de asociación, supongamos que tambien queremos un indice superior al 50%

para calcular la confidencia se utiliza la siguiente formula: (Repetición de las observaciones del conjunto) / (repeticiones de la regla)

tomemos el primer conjunto (Pan , Pañales, Leche)

las reglas posibles son:

Pan => Pañales, Leche
Pañales => Pan , Leche
Leche = > Pan,Pañales
Pan,Pañales => Leche
Pan,Leche => Pañales
Leche,Pañales => Pan

tomemos a Pan,Pañales => Leche y tenemos 3 / 4 que da una confianza del 75% en donde 3 = (repeticiones de pan,pañales, leche) y 4 = (repeticiones de pan, pañales)

y procederemos con calcular todas las reglas y aquellas que pasen serán las que tomaremos.

Bien este es el proceso de generación de reglas con poda, comunmente conocido como algoritmo apriori. Espero les haya gustado.

[1]Addison Wesley,Introduction to data mining, Pang-Ning Tan

domingo, 20 de abril de 2014

clasificadores : Árboles de decisión, ID3

En esta entrada hablaré de mi clasificador preferido, este es el árbol de decisión, y ello es debido a que a diferencia de los demás clasificadores, los árboles de decisión nos entregan un modelo visual, es decir, algo que podemos entender sin ninguna ecuación, incluso sin conocer matemáticas,esto último es bueno, por que, a decir, podemos mostrar el modelo a otros departamentos, ellos lo entenderían y pueden seguirlo incluso sin un ordenador, amen de que es fácil implementarlo, no es costoso computacionalmente crear el modelo, además, es muy rápido al momento de ponerlo en el campo de acción.

A continuación muestro un ejemplo de un árbol de decisión[1]:


Dentro de las bondades con que cuentan estos algoritmos están:
  • Determinan aquellos atributos que aportan información relevante al sistema
  • Establece jerarquías de importancia entre los atributos
  • Rápido clasificando nuevos elementos
  • No tiene gran coste computacional la creación del modelo
  • El modelo puede ser modificable o pulido por un experto una vez creado (como en las redes bayesianas)
  • Entendible e interpretable fácilmente
  • El modelo se puede entender como un conjunto de reglas si , no, entonces


Siendo sus desventajas
  • Suele favorecer a aquellos atributos con muchos valores
  • Débil contra información ruidosa o que genere conflictos en la base de datos
  • Usualmente es necesario discretizar los atributos continuos
  • Puede crear árboles muy grandes que intentan explicar incluso el ruido y las partes aisladas(outliers o casos raros que sin embargo son correctos)

A grandes rasgos este clasificador es especialmente útil cuando los ejemplos a partir de los que se desea aprender se puedan representar mediante atributos y valores, así como cuando se desea tener un modelo gráfico que clasifique la información, sin embargo, no resultan adecuados cuando la estructura de los ejemplos es variable, es decir, cuando no conocemos todos los valores posibles o límites máximos y mínimos de los atributos. También presentan inconvenientes con información incompleta.


Existen diversas y variadas formas de construirlos, la tendencia general es utilizar una fórmula que nos indique que atributo desplegar, como tal, las fórmulas mas utilizadas son las siguientes:

Entropia[2] : Describe la tendencia al orden en un sistema (también conocida como medida de incertidumbre). Básicamente determina en base a una situación, la probabilidad de que ocurra cada uno de los casos subsecuentes posibles.Va de 0 a 1, en donde 0 es el orden total y 1 el desorden total. Usualmente para los árboles de decisión suele utilizarse su forma binaria (al menos una forma de expresarla):


GINI[3]: Representa la medida de desigualdad de un sistema, una forma de medirlo es con la siguiente fórmula:

Y el algoritmo mas común es el siguiente[4]:


Pues bien, manos a la obra, vamos a crear un árbol de decisión utilizando la fórmula de entropia arriba descrita, y la  conocida base de datos de jugar golf:

Día Temperatura Humedad Viento Jugar
Soleado caliente alta débil no
Soleado caliente alta fuerte no
nublado caliente alta débil si
lluvioso templada alta débil si
lluvioso fría normal débil si
lluvioso fría normal fuerte no
nublado fría normal fuerte si
Soleado templada alta débil no
Soleado fría normal débil si
lluvioso templada normal débil si
Soleado templada normal fuerte si
nublado templada alta fuerte si
nublado caliente normal débil si
lluvioso templada alta fuerte no

Bien, la clase es “Jugar”, entonces comencemos a determinar cual será nuestro nodo raíz,para eso aplicaremos la formula de la entropia a cada uno de los atributos (día, temperatura, humedad, viento) y utilizaremos la siguiente fórmula que nos va a expresar nuestra ganancia de información:


Cabe mencionar que existen muchas fórmulas para calcular la ganancia de la información con respecto a la entropia, simplemente utilicé la mas sencilla.

Pues bien, al trabajo, comencemos con el atributo de día, entonces construimos la siguiente subtabla:

Día Jugar (si) Jugar (no)
soleado 2 3
nublado 4 0
lluvioso 3 2


Básicamente , esta tabla nos indica que el atributo día tiene tres estados (soleado, nublado y lluvioso)
y que cada uno de dichos estados aparece distribuido un número x de veces para cada valor de la clase, ejemplo : soleado aparece enlazado 2 veces a la clase “Jugar:Si” y 3 veces a la clase “jugar:No”.

Bien ahora calculemos la entropia para día(soleado=>si):


y para día(soleado => no):
entonces día(soleado) = 0.5287 + 0.44217 = 0.9709

Ahora debemos calcular los demás estados de día (nublado y lluvioso) de la misma manera y obtendremos la siguiente tabla:

Día Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
soleado 2 3 5 0.528771238 0.4421793565 0.9709505945
nublado 4 0 4 -0 0 0
lluvioso 3 2 5 0.4421793565 0.528771238 0.9709505945





Ganancia 0.6935

Recordando que ganancia la obtenemos de (0.9709 + 0 + 0.97095)/14 en donde 14 es el número total de casos.

Bien entonces tenemos que el atributo de Día nos da una ganancia de 0.6935. Ahora solo nos resta calcular los demás atributos y obtendremos las siguientes tablas:

Temperatura Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
caliente 2 2 4 0.5 0.5 1
fría 3 1 4 0.3112781245 0.5 0.8112781245
templada 4 2 6 0.3899750005 0.5283208336 0.9182958341





Ganancia 0.911063393



Humedad Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
alta 3 4 7 0.5238824663 0.4613456697 0.985228136
normal 6 1 7 0.1906220754 0.4010507032 0.5916727786





Ganancia 0.788450457


Viento Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
no 6 2 8 0.3112781245 0.5 0.8112781245
si 3 3 6 0.5 0.5 1





Ganancia 0.892158928

Y como podemos observar nuestro atributo ganador es “día” debido a que presentó el número mas pequeño y recordando en entropìa mientras mas cercano al cero sea mas tendencia al orden tenemos y es lo que buscamos, entonces ya podemos construir las primeras ramas del árbol y quedaría de la siguiente manera:


Ahora bien, como observamos en nublado la entropia marco 0, esto quiere decir que no necesitamos mas información, si el día es nublado se jugará sin importar los demás atributos y sus valores, sin embargo, no ocurre lo mismo para soleado y lluvioso, ahora deberemos determinar para cada estado del día (a excepción de nublado) cual sera el atributo que sigue.

Tomemos a soleado como nuestro punto a seguir, tenemos la siguiente subtabla:

Día Temperatura Humedad Viento Jugar
Soleado caliente alta débil no
Soleado caliente alta fuerte no
Soleado templada alta débil no
Soleado fría normal débil si
Soleado templada normal fuerte si

que es básicamente aquellos datos que correspondan a día=>soleado, ahora repetiremos los pasos, obviamente solo necesitamos calcular los atributos que no son día(temperatura, humedad y viento)

Tenemos entonces que para Temperatura =>caliente:



ahora computamos todos los valores de la clase y obtenemos la siguiente tabla:

Temperatura Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
caliente 0 2 2 0 0 0
templada 1 1 2 0.5 0.5 1
fría 1 0 1 0 0 0





Ganancia 0.4

Y ahora haremos lo mismo para los demás atributos:

Humedad Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
alta 0 3 3 0 0 0
normal 2 0 2 0 0 0





Ganancia 0

Viento Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
débil 1 2 3 0.5283208336 0.3899750005 0.9182958341
fuerte 1 1 2 0.5 0.5 1





Ganancia 0.9509775
Y bueno, aquí tenemos un ganador claro, en este caso es Humedad, ya que su entropia es cero, es decir, es orden total, entonces ahora construimos una rama mas del árbol y no queda de la siguiente manera:


Una vez que terminamos soleado nos enfocaremos en la rama de día(lluvioso), como tal tenemos la siguiente subtabla:

Día Temperatura Humedad Viento Clase
lluvioso templada alta débil si
lluvioso fría normal débil si
lluvioso fría normal fuerte no
lluvioso templada normal débil si
lluvioso templada alta fuerte no


y al igual que en soleado calculamos la entropia para cada atributo, entonces obtendremos las siguientes tablas:

Temperatura Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
caliente 0 0 0 0 0 0
templada 2 1 3 0.3899750005 0.5283208336 0.9182958341
fría 1 1 2 0.5 0 0.5





Ganancia 0.7509775

Humedad Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
alta 1 1 2 0 0.5 0.5
normal 2 1 3 0.3899750005 0 0.3899750005





Ganancia 0.433985
Viento Jugar (si) Jugar (no) Total casos Entropia jugar(si) Entropia jugar(no) Entropia
débil 3 0 3 -0 0 0
fuerte 0 2 2 0 -0 0





Ganancia 0
Y ahora tenemos como claro ganador a viento, entonces podemos concluir nuestro árbol:


Como podemos observar el atributo de temperatura no es requerido en el modelo, eso significa que no aporta nada en términos de orden al modelo de clasificación y es aquí en donde se visualiza una de las grandes ventajas de este clasificador.

Como comente en un principio existen muchas formas de generar un árbol, inclusive existe métodos aposteriori que intentar brindarle una mayor calidad al modelo, un ejemplo es la poda, que intenta eliminar ramificaciones duplicadas,la siguiente imagen muestra un ejemplo de ello[5]:



Incluso existen algoritmos para meter ramificaciones con decisiones[5]:



Pero bueno es un tema realmente extenso, prometo abordar árboles mas complejos en futuras entregas, por lo pronto espero les haya gustado esta.

[2]http://en.wikipedia.org/wiki/Entropy, consultado el 19/04/2014
[4]http://es.wikipedia.org/wiki/Algoritmo_ID3, consultado el 19/04/2014
[5]Addison Wesley,Introduction to data mining, Pang-Ning Tan