Método K-Means Codo y análisis de silueta con Yellowbrick y Scikit-Learn

En esta breve guía, aprenda a realizar el método del codo y el análisis de silueta para la identificación de conglomerados de K-Means, utilizando Yellowbrick y Scikit-Learn, con Python.

Introducción

K-Means es uno de los algoritmos de agrupamiento más populares. Al tener puntos centrales para un clúster, agrupa otros puntos en función de su distancia a ese punto central.

Una desventaja de K-Means es tener que elegir el número de grupos, K, antes de ejecutar el algoritmo que agrupa los puntos.

Si quieres leer una guía detallada de K-Means Clustering, echa un vistazo a ["Clustering de K-Means con Scikit-Learn"](/k-significa-agrupacion-con-scikit -aprender/).

Método de codo y análisis de silueta

Las técnicas más utilizadas para elegir el número de Ks son el Método del Codo y el Análisis de la Silueta.

Para facilitar la elección de K, la biblioteca Yellowbrick envuelve el código con bucles for y un gráfico que normalmente escribiríamos en 4 líneas de código.

Para instalar Yellowbrick directamente desde un cuaderno Jupyter, ejecute:

1
! pip install yellowbrick

Veamos cómo funciona para un conjunto de datos familiar que ya forma parte de Scikit-learn, el conjunto de datos Iris.

El primer paso es importar el conjunto de datos, las bibliotecas KMeans y yellowbrick, y cargar los datos:

1
2
3
4
5
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer, SilhouetteVisualizer

iris = load_iris()

Observe aquí, importamos KElbowVisualizer y SilhouetteVisualizer de yellowbrick.cluster, ¡esos son los módulos que usaremos para visualizar los resultados de Elbow y Silhouette!

Después de cargar el conjunto de datos, en la clave data del grupo (un tipo de datos que es una extensión de un diccionario) están los valores de los puntos que queremos agrupar. Si quiere saber qué representan los números, eche un vistazo a iris['feature_names'].

Se sabe que el conjunto de datos Iris contiene tres tipos de iris: 'versicolor', 'virginica' y 'setosa'. También puede inspeccionar las clases en iris['target_names'] para verificar.

Entonces, tenemos 4 características para agrupar y deben separarse en 3 grupos diferentes de acuerdo con lo que ya sabemos. Veamos si nuestros resultados con el método del codo y el análisis de la silueta lo corroboran.

Primero, seleccionaremos los valores de las características:

1
2
3
4
print(iris['feature_names']) # displays ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
print(iris['target_names']) # displays array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

X = iris['data']

Luego, podemos crear un modelo KMeans, una instancia KElbowVisualizer() que recibirá ese modelo junto con el número de ks para los que se calculará una métrica, en este caso de 2 a 11 Ks.

Después de eso, ajustamos el visualizador con los datos usando fit() y mostramos el gráfico con show(). Si no se especifica una métrica, el visualizador usa la métrica distorsión, que calcula la suma de las distancias al cuadrado desde cada punto hasta su centro asignado:

1
2
3
4
5
model = KMeans(random_state=42)

elb_visualizer = KElbowVisualizer(model, k=(2,11))
elb_visualizer.fit(X)    
elb_visualizer.show()  

elbow method for k means clustering

Ahora, ya tenemos un gráfico Distortion Score Elbow for KMeans Clustering con una línea vertical que marca el mejor número de ks, en este caso, 4.

Parece que el método Elbow con una métrica de distorsión no era la mejor opción si no sabíamos el número real de grupos. ¿Silueta también indicará que hay 4 grupos? Para responder eso, solo necesitamos repetir el último código con un modelo con 4 clústeres y un objeto visualizador diferente:

1
2
3
4
5
model_4clust = KMeans(n_clusters = 4, random_state=42)

sil_visualizer = SilhouetteVisualizer(model_4clust)
sil_visualizer.fit(X)    
sil_visualizer.show()

puntuación de silueta para k significa clúster usando el método del codo

El código muestra un Gráfico de silueta de agrupamiento de KMeans para 150 muestras en 4 centros. Para analizar estos clústeres, debemos observar el valor del coeficiente de silueta (o puntaje), su mejor valor está más cerca de 1. El valor promedio que tenemos es 0.5, marcado por la línea vertical, y no tan bueno.

También debemos observar la distribución entre grupos: una buena parcela tiene tamaños similares de áreas agrupadas o puntos bien distribuidos. En este gráfico, hay 3 grupos más pequeños (número 3, 2, 1) y un grupo más grande (número 0), que no es el resultado que esperábamos.

Repitamos el mismo gráfico para 3 grupos para ver qué sucede:

1
2
3
4
5
model_3clust = KMeans(n_clusters = 3, random_state=42)

sil_visualizer = SilhouetteVisualizer(model_3clust)
sil_visualizer.fit(X)    
sil_visualizer.show()

silhouette for kmeans clusters

Al cambiar el número de grupos, la puntuación de la silueta aumentó “0,05” y los grupos están más equilibrados. Si no supiéramos el número real de grupos, al experimentar y combinar ambas técnicas, habríamos elegido “3” en lugar de “2” como el número de Ks.

Este es un ejemplo de cómo combinar y comparar diferentes métricas, visualizar datos y experimentar con diferentes valores de clústeres es importante para conducir el resultado en la dirección correcta. Y también, ¡cómo tener una biblioteca que facilite ese análisis puede ayudar en ese proceso!