Parte 4 Clustering

4.1 Clustering con K-Means

4.1.1 Intuición del Clustering con K-Means

Exercise 4.1

¿Dónde podemos aplicar el algoritmo de agrupación por clústeres en la vida real?

Puede aplicarse para diferentes propósitos:

  • Segmentación de mercado,
  • Medicina con, por ejemplo, detección de tumores,
  • Detección de fraudes,
  • Simplemente para identificar algunos grupos de clientes en la empresa o negocio.

Exercise 4.2

¿Cómo funciona el truco de la línea perpendicular cuando \(k \ge 3\)?

Este truco se usa principalmente solo en espacios 2D o 3D. Por lo general, la distancia euclidiana se utiliza en todos los puntos de dimensiones altas para realizar la agrupación. En datos de muy alta dimensión, podríamos hacer un truco, que es una “esfera envolvente”, es decir, comenzar en cada centroide (\(k\) esferas en total), comenzar a hacer crecer un espacio esférico (círculo en 2D, esfera en 3D, etc.), radialmente hacia afuera . Hasta que las esferas se crucen, todo lo que la esfera engulle pertenece al mismo cluster. Todos los demás puntos pueden asignarse a grupos calculando la distancia perpendicular entre los centroides.

Exercise 4.3

¿Cómo funciona el método del codo cuando están involucradas más de 2 variables?

Es lo mismo pero usamos la distancia euclidiana en \(n\) dimensiones para calcular el WCSS (\(p\) y \(q\) son dos observaciones, y sus coordenadas \(p_1, ..., p_n, q_1, ..., q_n\) son las características que se describen en estos puntos de observación):

\[d(p,q) = \sqrt[]{(p_1-q_1)^2 + (p_2-q_2)^2 + ... + (p_n-q_n)^2}\]

Exercise 4.4

¿Existe una forma alternativa al método del codo para encontrar el número máximo de clusters?

Claro, una forma alternativa sería a través del ajuste de parámetros con búsqueda por cuadrícula, que se verá en la Parte 10 - Selección de modelos.

4.1.2 Clustering de K-Means en Python

Exercise 4.5

¿Para qué sirve exactamente el parámetro max_iter en la clase KMeans ()?

Cuando aplicamos k-means, volvemos al paso anterior muchas veces (ver las clases de intuición en el curso). Cada vez que hacemos eso, es una iteración. Y el valor max_iter es el número máximo de estas iteraciones que se deben hacer.

Exercise 4.6

¿Por qué no consideramos la edad como parámetro?

No consideramos la edad por dos razones:

  1. Habíamos verificado previamente que no tenía impacto en la variable dependiente.
  2. Quería tener dos variables independientes al final, para que podamos visualizar los resultados en dos dimensiones (ya que una variable independiente corresponde a una dimensión).

Exercise 4.7

¿Cómo obtener estadísticas para cada uno de los clústeres?

La forma más sencilla de obtener información estadística de los clústeres es utilizar el atributo cluster_centers_ de la clase KMeans. Nos dará una matriz con las coordenadas de cada cluster, que es la media de cada columna de características de cada grupo. Luego, también podemos obtener información sobre los puntos de observación utilizando el atributo labels_.

Podemos solicitar estos atributos de la siguiente manera:

kmeans.cluster_centers_ 
kmeans.labels_

Luego, podríamos obtener algunos valores útiles como el número de elementos en cada grupo, la media de los salarios o puntuaciones de gasto en cada clustr, etc. La mejor manera de hacer esto es poner los cinco grupos en 5 variables de esta manera:

Cluster_0 = X[y_kmeans == 0]
Cluster_1 = X[y_kmeans == 1]
Cluster_2 = X[y_kmeans == 2]
Cluster_3 = X[y_kmeans == 3]
Cluster_4 = X[y_kmeans == 4]

Entonces se obtiene lo que queramos con estas variables que son exactamente los clústeres.

Por ejemplo, si estamos interesados en tener el recuento de observaciones para cada grupo, bueno, ahora podemos verlo directamente en el Explorador de variables observando el número de filas de cada grupo. O también se puede hacer esto:

len(Cluster_0)
len(Cluster_1)
len(Cluster_2)
len(Cluster_3)
len(Cluster_4)

Luego, se pueden obtener la media y la desviación estándar de cada característica de los clústers de esta manera:

Cluster_0[0].mean()
Cluster_1[0].mean()
Cluster_2[0].mean()
Cluster_3[0].mean()
Cluster_4[0].mean()
Cluster_0[0].std()
Cluster_1[0].std()
Cluster_2[0].std()
Cluster_3[0].std()
Cluster_4[0].std()

También puedes obtener el porcentaje de observaciones mediante los siguientes cálculos simples:

len(Cluster_0) / 200
len(Cluster_1) / 200
len(Cluster_2) / 200
len(Cluster_3) / 200
len(Cluster_4) / 200

Exercise 4.8

Veamos la siguiente línea de código con más detalles:
plt.scatter(kmeans.cluster_centers_[:,0],
            kmeans.cluster_centers_[:, 1],
            s = 300,
            c = 'yellow',
            label = 'Centroids')

En la función scatter() del módulo plt:

  • el primer argumento es la coordenada x de los centros del clúster (los centroides),
  • el segundo argumento es la coordenada y de los centros del grupo (los centroides),
  • el tercer argumento s es el tamaño de los puntos del centroide en la gráfica,
  • el cuarto argumento es el color de los puntos del centroide en la gráfica,
  • el quinto argumento es la etiqueta que aparece en la leyenda correspondiente a los centroides.

4.1.3 Clustering de K-Means en R

Exercise 4.9

¿Cómo no caigo en la trampa de la inicialización aleatoria en R?

R se encarga de evitar caer en una trampa de inicialización aleatoria entre bastidores. Sin embargo, tienes otros paquetes geniales en R donde puedes usar explícitamente k-means++, como el paquete KMeans_rcpp.

Exercise 4.10

¿Por qué no hemos utilizado todas las variables como la edad?

No los hemos utilizado porque heemos verificado previamente que no tenían ningún impacto en la variable dependiente. Además, queríamos tener dos variables independientes para que pudiéramos visualizar los resultados en dos dimensiones (porque una variable independiente corresponde a una dimensión).

Exercise 4.11

¿Cuál es el papel de nstart aquí?

Debido a que la agrupación de K-medias comienza con \(k\) centroides elegidos al azar, se puede obtener una solución diferente cada vez que se invoca la función. El uso de la función set.seed() garantiza que los resultados sean reproducibles. Además, este enfoque de agrupamiento puede ser sensible a la selección inicial de centroides. La función kmeans() tiene una opción nstart que intenta múltiples configuraciones iniciales e informa sobre la mejor. Por ejemplo, agregar nstart = 25 genera 25 configuraciones iniciales. Este enfoque se recomienda a menudo.

Exercise 4.12

¿Cómo puedo representar los resultados sin la escala y con los nombres de los grupos?

Aquí hay una implementación de dicho diagrama:

plot(x = dataset[,1],
     y = dataset[,2],
     col = y_kmeans,
     pch = 19, 
     xlim = c(from=min(dataset[,1]), to=max(dataset[,1]+30)),
     xlab = "Ingreso Anual", ylab="Puntuación de Gasto")
clusters = c("Careless", "Standard", "Sensible", "Target", "Careful")
legend('bottomright', legend=clusters, col=1:5, pch=19, horiz=F)

4.2 Clustering Jerárquico

4.2.1 Intuición del clustering jerárquico

Exercise 4.13

¿Cuál es el punto del clustering jerárquico si siempre conduce a un grupo por punto de observación?

El punto principal de la agrupación jerárquica es hacer el dendrograma, porque necesitamos comenzar con un solo grupo, luego trabajar hacia abajo para ver las diferentes combinaciones de grupos hasta tener un número de grupos igual al número de observaciones. Y es el dendrograma en sí el que permite encontrar la mejor configuración de agrupamiento.

Exercise 4.14

Cuando se compara la distancia entre dos grupos o un grupo y un punto, ¿cómo se mide exactamente? ¿Se toma el centroide en el grupo y se mide la distancia?

Exactamente, la métrica es la distancia euclidiana entre el centroide del primer grupo y el punto (o el centroide del otro grupo para la distancia entre dos grupos).

Exercise 4.15

¿También necesitamos realizar el escalado de características para la agrupación en clústeres jerárquica?

Sí, porque las ecuaciones de los problemas de agrupamiento involucran la Distancia euclidiana. Siempre que las ecuaciones del modelo involucren la distancia euclidiana, debe aplicarse el escalado de características.

4.2.2 Clustering Jerárquico en Python

Exercise 4.16

¿Deberíamos usar el dendrograma o el método del codo para encontrar ese número óptimo de conglomerados?

Es recomendable usar ambos (es más rápido probar ambos de lo que crees gracias a las plantillas del curso), solo para verificar ese número óptimo. Sin embargo, si realmente solo tienes tiempo para uno, te recomendaría el método del codo. El dendrograma no siempre es la forma más fácil de encontrar el número óptimo de agrupaciones. Pero con el método del codo es muy fácil, ya que la mayor parte del tiempo el codo es muy obvio de detectar.

Exercise 4.17

¿Podrías explicar más sobre cómo se forman los clústeres a través del método de clase de Python AgglomerativeClustering()?

La agrupación jerárquica es una familia general de algoritmos de agrupación que construyen agrupaciones anidadas fusionándolos o dividiéndolos sucesivamente. Esta jerarquía de grupos se representa como un árbol (o dendrograma). La raíz del árbol es el grupo único que reúne todas las muestras, siendo las hojas los grupos con una sola muestra. La clase AgglomerativeClustering() realiza un agrupamiento jerárquico utilizando un enfoque de abajo hacia arriba: cada observación comienza en su propio cluster y los grupos se fusionan sucesivamente. El método de clase minimiza la suma de las diferencias cuadradas dentro de todos los grupos. Es un enfoque que minimiza la varianza y, en este sentido, es similar a la función objetivo de k-means, pero se aborda con un enfoque jerárquico aglomerativo.

Exercise 4.18

Pensé que los dendrogramas eran como la memoria del algoritmo HC. Si es así, ¿por qué primero hacemos el dendrograma y luego aplicamos el agrupamiento aglomerativo? ¿Eso significa que ejecutamos dos veces el algoritmo de agrupamiento?

El único propósito de hacer primero el dendrograma es tener una idea del número óptimo de conglomerados. Es como la memoria o la historia del algoritmo HC. Pero a través de ese historial / memoria podemos ver el número óptimo de clústeres. Y eso es lo que hacemos en este paso. Luego, cuando aplicamos agrupaciones aglomerativas, podemos seleccionar el número óptimo de agrupaciones que encontramos gracias al dendrograma.

Exercise 4.19

¿Qué es la ‘afinidad’ en la clase AgglomerativeClustering()?

La ‘afinidad’ se refiere a la distancia utilizada en el algoritmo K-Means, que es la distancia euclidiana (la más clásica, la geométrica). Se refiere a cómo el algoritmo HC define (encuentra) los centroides más cercanos a cada punto. Y luego lo que lo acompaña es el método de Ward utilizado para construir los clústeres, lo que significa que usamos la Suma de cuadrados dentro del clúster como un criterio para reunir y formar nuestros clústeres más homogéneos.

Exercise 4.20

¿Por qué no implementamos simplemente un código para que encuentre automáticamente el número óptimo de clústeres, en lugar de seleccionarlo manualmente o visualmente?

Porque la elección del número óptimo de clústeres también está influenciada por el problema empresarial (objetivos y limitaciones). Por ejemplo, algunos problemas comerciales tienen un número mínimo o máximo de clústeres, o un número mínimo / máximo de elementos por clúster. Tales restricciones requieren que tengamos varias opciones, y la mejor manera de descubrir las mejores opciones es mirando los gráficos (con el dendrograma o el codo).

4.2.3 Clustering Jerárquico en R

Exercise 4.21

¿Por qué no aplicamos el escalado de características en R?

Porque la función que usamos en R se encarga automáticamente de llevar a cabo escalado de características.

Exercise 4.22

¿Cómo puedo visualizar los clústeres con la escala original?

Si desea ver los grupos con escalas originales, puedes usar el siguiente algoritmo:

clusters= 1:5
plot(x=dataset[,1], y=dataset[,2],
     col=y_hc, pch=19, xlim=c(from=min(dataset[,1]), to=max(dataset[,1]+20)))
legend('bottomright', inset=0.01, legend=clusters, col=1:5, pch=19, horiz=F)