Curso
Después de entrenar un modelo de clustering, ¿cómo sabes si los clústeres son realmente buenos?
No hay una respuesta universal. En aprendizaje supervisado, puedes comparar predicciones con etiquetas reales y obtener una precisión. Con clustering eso no es posible. Has elegido k=5, pero ¿sería mejor otro valor de k? Sin etiquetas, no puedes saber si el algoritmo ha captado la estructura o si simplemente ha dividido los datos en grupos aleatorios.
El silhouette score es la métrica que necesitas. Indica lo bien que encaja cada punto en su clúster asignado en relación con el más cercano alternativo. Es una de las métricas más usadas, funciona sin etiquetas y es fácil de interpretar.
En este artículo, veremos la fórmula y cómo leerla, te mostraré un ejemplo en Python con scikit-learn y comentaremos cuándo es (y no es) la mejor opción.
¿Acabas de empezar con el clustering? Lee nuestro tutorial Introducción al clustering k-Means con scikit-learn para entender cómo funciona el algoritmo y cómo usarlo en Python.
¿Qué es el silhouette score?
El silhouette score es un número entre -1 y 1 que te dice lo bien que encaja cada punto en su clúster.
El valor refleja dos cosas:
- Lo cerca que está un punto de los demás puntos de su propio clúster
- Lo lejos que está del clúster más cercano al que no pertenece
Si el punto está bien dentro de su grupo y lejos de los demás, la puntuación es alta. Si está en el borde, más cerca de un clúster vecino que del suyo, la puntuación es baja.
En pocas palabras, el silhouette score refleja el equilibrio entre la compacidad interna de los clústeres y su separación entre sí. Ambas cosas importan. Un clustering que agrupa bien los puntos pero coloca los clústeres unos encima de otros no sirve, igual que uno que separa bien los clústeres pero deja los puntos muy dispersos dentro de cada uno.

Clústeres bien separados frente a clústeres solapados
Cuanto mayor es la puntuación, mejor definidos están los clústeres. Un valor cercano a 1 indica que los puntos están muy agrupados dentro de su clúster y lejos de los demás. Un valor cercano a 0 indica solapamientos o fronteras ambiguas. Un valor negativo significa que el punto está más cerca de otro clúster que del suyo.
¿Cómo funciona el silhouette score?
Cada punto tiene su propio silhouette score, calculado a partir de dos distancias.
La primera es la distancia media del punto al resto de puntos de su clúster asignado. Si es pequeña, el punto está cerca de los demás; si es grande, el punto está poco ligado a su clúster.
La segunda es la distancia media del punto a los puntos del clúster vecino más cercano. Si es grande, el punto está claramente separado de otros clústeres; si es pequeña, el punto está cerca de la frontera.

Distancia de un punto a los clústeres
El valor de silhouette compara estos dos números. Un punto bien dentro de su clúster y lejos de los demás obtiene una puntuación alta. Un punto en el borde (cerca de otro clúster) obtiene una puntuación baja. Si está más cerca de otro clúster que del suyo, la puntuación es negativa.
Recuerda que ninguna de las dos distancias basta por sí sola.
Un clúster muy compacto puede estar pegado a otro. Un clúster muy separado puede estar disperso internamente. Necesitas ambas distancias para confiar en la asignación.
Fórmula del silhouette score
Esta es la fórmula para un punto:

Fórmula del silhouette score
Donde:
-
aes la distancia media del punto al resto de puntos de su mismo clúster -
bes la distancia media del punto a todos los puntos del clúster vecino más cercano
La fórmula divide la diferencia entre b y a por el mayor de los dos.
En general, puedes interpretar la puntuación así:
-
Cuando
bes mucho mayor quea: el punto está lejos de cualquier otro clúster y cerca del suyo. El numerador se aproxima ab, el denominador también esby la puntuación se acerca a 1 -
Cuando
aes mucho mayor queb: el punto está más cerca de otro clúster que del suyo. El numerador es un número negativo grande, próximo a-a, el denominador esay la puntuación se acerca a -1 -
Cuando
aybson similares: el punto está en la frontera entre dos clústeres. El numerador está cerca de 0, y la puntuación también
Más detalles a continuación.
Cómo interpretar el silhouette score
Guía rápida para leer el silhouette score:
- Cerca de 1: los puntos están bien dentro de sus clústeres y lejos de los demás
- En torno a 0,7: buen clustering; grupos diferenciados y puntos cercanos a los de su clúster
- En torno a 0,5: clustering razonable; hay algo de solapamiento, pero siguen siendo distinguibles
- Cerca de 0: los clústeres se solapan o las fronteras no están claras. Puede que la estructura no sea real
- Por debajo de 0: los puntos están más cerca del clúster equivocado. Suele ocurrir al elegir un número incorrecto de clústeres o cuando los datos no se agrupan bien de partida.
Estos umbrales son orientativos. Qué se considera un buen silhouette score depende del conjunto de datos.
Los datos escasos y de alta dimensionalidad suelen producir puntuaciones más bajas incluso cuando los clústeres son buenos. Datos densos y bien separados pueden superar 0,7. Compara puntuaciones entre modelos en el mismo dataset, no contra un umbral universal.
Cómo calcular el silhouette score
Se calcula punto a punto. Así funciona para un único punto:
Paso 1: calcula a, la distancia media del punto a cada uno de los puntos de su clúster. Si el punto está en un clúster con otros 4 puntos y las distancias son 1,2; 1,5; 1,0 y 1,3:

Cálculo del silhouette score (1)
Paso 2: encuentra el clúster vecino más cercano (aquel, distinto al propio, con la menor distancia media desde el punto). Luego calcula b, la distancia media del punto a cada punto de ese clúster. Si el clúster más cercano tiene 5 puntos a distancias 2,4; 2,8; 3,0; 2,6 y 2,7:

Cálculo del silhouette score (2)
Paso 3: introduce a y b en la fórmula:

Cálculo del silhouette score (3)
Paso 4: repite para cada punto del conjunto de datos. El silhouette score global del clustering es la media de todas las puntuaciones individuales.
Ejemplo de silhouette score en Python
Scikit-learn ofrece dos funciones para calcular el silhouette score, ambas en sklearn.metrics:
-
silhouette_score()devuelve la media para todo el clustering -
silhouette_samples()devuelve la puntuación de cada punto individual
Así se usan con KMeans sobre un dataset sintético:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples
# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")
# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")
Al ejecutar el fragmento anterior, obtendrás una salida como esta:

Salida del ejemplo en Python
La puntuación global de 0,791 indica que los cuatro clústeres están bien definidos y separados.
Las puntuaciones por punto te permiten analizar cada dato individual.
Los puntos con valores altos están bien dentro de su clúster. Los puntos con valores bajos o negativos están en el borde o mal asignados, lo que ayuda a detectar outliers o revisar casos límite.
Elegir el número óptimo de clústeres
Uno de los usos más habituales del silhouette score es elegir el k adecuado para KMeans.
El proceso tiene tres pasos:
- Ajusta KMeans para varios valores de k
- Calcula el silhouette score para cada ajuste
- Elige el
kcon la puntuación más alta
El código sería:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
scores.append(silhouette_score(X, labels))
print(f"k={k}: silhouette = {scores[-1]:.3f}")
Esta es la puntuación que verás para cada k:

Silhouette score en distintos valores de k
La puntuación más alta está en k=4. Ese sería el valor a elegir.
Ten en cuenta que el silhouette score no sustituye al conocimiento del negocio. Si tu problema requiere 5 segmentos de clientes y el mejor silhouette es con 4, no elijas 4 automáticamente. La métrica te indica dónde los datos tienen la estructura más limpia, pero a veces el número adecuado de clústeres es el que encaja con algo significativo para tu caso.
Silhouette score frente a otras métricas de clustering
El silhouette score es probablemente la métrica más utilizada para evaluar clustering, pero no es la única. Aquí lo comparamos con alternativas.
Silhouette score vs. método del codo
El método del codo es una técnica visual para elegir k en KMeans. Ajustas modelos para varios valores de k, representas la inercia (suma de cuadrados intra-clúster) frente a k y eliges el valor donde la curva hace un quiebro pronunciado.
El método del codo tiene la ventaja de ser rápido y sencillo. Pero el "codo" no siempre es evidente. Con datos ruidosos, la curva puede verse suave y es difícil detectar el quiebro.
El silhouette score te da un número concreto para cada k, lo que permite comparar con más fundamento. Es más lento de calcular, pero evita dejar la decisión a la interpretación visual.
Usa el método del codo para una comprobación rápida. Usa el silhouette score cuando necesites una respuesta sólida.
Silhouette score vs. índice de Davies-Bouldin
El índice de Davies-Bouldin (DBI) mide la similitud media entre cada clúster y su más similar. Un DBI menor indica mejor clustering, y la puntuación perfecta es 0.
El DBI usa centroides de clúster para calcular similitudes, lo que lo hace más rápido que el silhouette score en datasets grandes. Comparte la misma intuición de premiar clústeres compactos y bien separados.
La pega es que el DBI solo informa sobre el clustering global. El silhouette score también te da una puntuación por punto, útil para detectar casos límite y outliers.
Usa DBI si trabajas con conjuntos muy grandes y la velocidad importa. Usa silhouette si quieres analizar puntos individuales.
Silhouette score vs. índice de Calinski-Harabasz
El índice de Calinski-Harabasz (CH), también llamado criterio de razón de varianzas, es la razón entre la dispersión inter-clúster y la intra-clúster. Valores altos indican mejor clustering, y no tiene límite superior.
CH es rápido y funciona bien en datasets grandes porque solo usa estadísticas a nivel de clúster. Al igual que silhouette y DBI, funciona mejor con clústeres convexos y bien separados.
CH tampoco tiene una escala natural, así que solo puedes comparar sus valores entre modelos en el mismo dataset, no entre datasets distintos.
Usa CH cuando tu dataset es grande y necesitas resultados rápidos. Usa silhouette cuando buscas interpretabilidad y detalle por punto.
Métricas internas vs. externas
Las métricas anteriores (silhouette, DBI, CH, codo) son internas. Evalúan el clustering usando solo los datos, sin etiquetas reales. Por eso son la opción estándar en problemas de clustering del mundo real, donde no hay etiquetas.
Las métricas externas comparan las asignaciones de clúster con etiquetas conocidas. El Adjusted Rand Index (ARI), la Normalized Mutual Information (NMI) y la homogeneidad son ejemplos comunes. Se usan cuando tienes etiquetas y quieres medir qué tan bien un algoritmo de clustering las reproduce.
Usa métricas internas cuando no tengas etiquetas, que es lo habitual. Usa métricas externas al comparar algoritmos de clustering en datos etiquetados.
Resumen de métricas, lado a lado:
| Método | Rango | Mejor valor | Velocidad | Úsalo para |
|---|---|---|---|---|
| Silhouette score | -1 a 1 | Cerca de 1 | Lento en datasets grandes | Interpretabilidad y análisis por punto |
| Método del codo | 0 a infinito | Busca el "codo" | Rápido | Comprobaciones rápidas |
| Índice de Davies-Bouldin | 0 a infinito | Cerca de 0 | Rápido | Datasets grandes |
| Índice de Calinski-Harabasz | 0 a infinito | Cuanto más alto, mejor | Rápido | Datasets grandes sin etiquetas |
Silhouette score comparado con alternativas
Limitaciones del silhouette score
El silhouette score tiene algunas limitaciones que conviene conocer:
- Asume clustering basado en distancias: por defecto usa distancia euclídea. Funciona bien con KMeans y otros algoritmos basados en centroides, pero no encaja con métodos de densidad como DBSCAN, donde los clústeres tienen formas arbitrarias y no hay un centro claro
- Funciona mejor con clústeres pequeños y bien separados: premia clústeres compactos y esféricos alejados entre sí. Si tus datos tienen clústeres cercanos u overlapeados, la puntuación será baja aunque el clustering sea correcto
- No es ideal con formas irregulares: en datos reales los clústeres no siempre son convexos. En esos casos, pueden obtener puntuaciones bajas aunque las asignaciones sean correctas
- Coste computacional en datasets grandes: calcularlo requiere distancias por pares entre puntos, que escalan como
O(n^2). En datasets con millones de puntos, es costoso - Sensibilidad a la métrica de distancia elegida: la puntuación cambia si usas euclídea, Manhattan, coseno u otra. Si tus datos no siguen las asunciones euclídeas, el silhouette score puede llevarte a conclusiones erróneas
Mejores prácticas al usar el silhouette score
El silhouette score funciona mejor si sigues estas pautas:
- Compara varias soluciones de clustering: no calcules una única puntuación. Ajusta modelos con distintos valores de
k(o algoritmos distintos) y compara sus puntuaciones - Visualiza los clústeres junto a la puntuación: un número por sí solo no cuenta toda la historia. Representa los clústeres y comprueba si las formas tienen sentido
- No optimices solo para la puntuación más alta: con k=2 a menudo se obtiene un valor mayor que con
k=5, incluso cuando 5 clústeres son más útiles para tu problema - Combínalo con conocimiento de dominio: la puntuación te indica dónde los datos tienen la estructura más limpia. El conocimiento del negocio te dice qué estructura es útil. Usa ambos
- Evalúa varias métricas: silhouette, DBI, CH y otras miden la calidad de forma diferente. Si coinciden, vas por buen camino; si no, mira los datos
Conclusión
El silhouette score es una de las formas más intuitivas de evaluar clustering porque refleja tanto lo agrupados que están los puntos como lo separados que están los clústeres.
Se calcula punto a punto, se promedia y se obtiene un único número entre -1 y 1. Cuanto más se acerca a 1, mejor definidos están los clústeres; valores cercanos o inferiores a 0 sugieren que la estructura no es sólida.
Pero el silhouette score es solo el principio. Acompáñalo de visualizaciones de clústeres y, sobre todo, de tu conocimiento del problema. Solo cuando todo apunte en la misma dirección podrás confiar en el resultado.
El silhouette score forma parte del panorama general de Unsupervised Learning in Python. Apúntate hoy y aprende a agrupar, transformar, visualizar y extraer insights de datos sin etiquetar.
