Curso
Depois que você treina um modelo de clustering, como saber se os clusters ficaram bons?
Não existe uma resposta universal. No aprendizado supervisionado tradicional, dá para comparar as previsões com os rótulos verdadeiros e obter uma acurácia. Com clustering isso não é possível. Você escolheu k=5, mas será que outro valor de k seria melhor? Sem rótulos, não dá para saber se o algoritmo encontrou uma estrutura real ou só dividiu os dados em pedaços aleatórios.
O silhouette score é a métrica que você procura. Ele mostra o quão bem cada ponto se encaixa no cluster ao qual foi atribuído em relação ao cluster mais próximo, e é uma das métricas mais usadas. Funciona sem rótulos e é fácil de interpretar.
Neste artigo, vou explicar a fórmula e como interpretá-la, mostrar um exemplo em Python com scikit-learn e cobrir quando essa métrica é ou não a melhor opção.
Você é novo em clustering? Leia nosso tutorial Introduction to k-Means Clustering with scikit-learn para entender como o algoritmo funciona e como usá-lo em Python.
O que é o silhouette score?
O silhouette score é um número entre -1 e 1 que indica o quão bem cada ponto se ajusta ao seu cluster.
Esse número mostra duas coisas:
- Quão próximo um ponto está dos outros pontos do seu próprio cluster
- Quão distante ele está do cluster mais próximo ao qual não pertence
Se o ponto está bem dentro do seu grupo e longe de qualquer outro, o score é alto. Se está na borda, mais perto de um cluster vizinho do que do próprio, o score é baixo.
Em resumo, é esse equilíbrio que o silhouette score mostra. Ele captura tanto o quão próximos os pontos estão dentro de cada cluster quanto o quão bem os clusters estão separados entre si. Ambos são igualmente relevantes. Um clustering que agrupa bem os pontos, mas coloca clusters sobrepostos, não é útil; e um clustering que separa bem os clusters, mas deixa os pontos espalhados dentro deles, também não é.

Clusters bem separados versus clusters sobrepostos
Scores mais altos significam clusters melhor definidos. Um score próximo de 1 indica pontos bem concentrados dentro do cluster e longe dos demais. Um score próximo de 0 indica sobreposição entre clusters ou fronteiras ambíguas. Um score negativo indica que o ponto está mais próximo de outro cluster do que daquele ao qual foi atribuído.
Como funciona o silhouette score?
Cada ponto recebe seu próprio silhouette score, calculado a partir de duas distâncias.
A primeira é a distância média do ponto para os demais pontos do seu cluster. Se for pequena, o ponto está próximo dos outros; se for grande, o ponto está pouco conectado ao cluster.
A segunda é a distância média do ponto para os pontos do cluster vizinho mais próximo. Se for grande, o ponto está claramente separado de outros clusters; se for pequena, o ponto está próximo da fronteira.

Distância de um ponto para os clusters
O valor de silhouette compara esses dois números. Um ponto bem dentro do seu cluster e longe dos demais recebe um score alto. Um ponto na borda (perto de outro cluster) recebe um score baixo. Um ponto mais próximo de outro cluster do que do seu recebe um score negativo.
Um ponto importante: nenhuma dessas distâncias basta sozinha.
Um cluster compacto pode estar encostado em outro. Um cluster bem separado pode ser internamente disperso. Você precisa das duas distâncias para confiar na atribuição.
Fórmula do silhouette score
Veja a fórmula para um único ponto:

Fórmula do silhouette score
Onde:
-
aé a distância média do ponto para todos os outros pontos do mesmo cluster -
bé a distância média do ponto para todos os pontos do cluster vizinho mais próximo
A fórmula divide a diferença entre b e a pelo maior dos dois valores.
Em geral, você pode interpretar o score assim:
-
Quando
bé muito maior quea: O ponto está longe de qualquer outro cluster e próximo do seu. O numerador fica próximo deb, o denominador também ébe o score fica próximo de 1 -
Quando
aé muito maior queb: O ponto está mais próximo de outro cluster do que do seu. O numerador é um número negativo grande, próximo de-a, o denominador éae o score fica próximo de -1 -
Quando
aebsão parecidos: O ponto está na fronteira entre dois clusters. O numerador fica perto de 0, e o score também
Mais detalhes a seguir.
Como interpretar o silhouette score
Aqui vai um guia prático para leitura do silhouette score:
- Perto de 1: Pontos bem no interior de seus clusters e longe dos demais
- Em torno de 0,7: Clustering de boa qualidade; grupos distintos e pontos próximos dos demais do seu cluster
- Em torno de 0,5: Clustering razoável; há alguma sobreposição, mas os grupos ainda são distinguíveis
- Perto de 0: Clusters se sobrepõem ou as fronteiras são pouco claras. A estrutura pode não ser real
- Abaixo de 0: Pontos estão mais próximos do cluster errado. Isso pode acontecer quando você escolhe um número inadequado de clusters ou quando os dados não se agrupam bem
Os limites acima são apenas referências. O que é um bom silhouette score depende do conjunto de dados.
Dados esparsos e de alta dimensionalidade costumam gerar scores menores mesmo quando os clusters são bons. Dados densos e bem separados podem gerar scores acima de 0,7. Compare scores entre modelos no mesmo dataset, não contra um limiar universal.
Como calcular o silhouette score
O cálculo é feito ponto a ponto. Veja como funciona para um único ponto.
Passo 1: Calcule a, a distância média do ponto para todos os outros pontos do seu cluster. Se o ponto está em um cluster com 4 outros pontos, e as distâncias são 1,2; 1,5; 1,0; e 1,3:

Cálculo do silhouette score (1)
Passo 2: Encontre o cluster vizinho mais próximo (aquele, diferente do cluster do ponto, com a menor distância média do ponto). Em seguida, calcule b, a distância média do ponto para cada ponto desse cluster. Se o cluster mais próximo tem 5 pontos às distâncias 2,4; 2,8; 3,0; 2,6; e 2,7:

Cálculo do silhouette score (2)
Passo 3: Substitua a e b na fórmula:

Cálculo do silhouette score (3)
Passo 4: Repita para todos os pontos do dataset. O silhouette score geral do clustering é a média dos scores individuais.
Exemplo de silhouette score em Python
O scikit-learn oferece duas funções para calcular o silhouette score, ambas em sklearn.metrics:
-
silhouette_score()retorna o score médio do clustering como um todo -
silhouette_samples()retorna o score de cada ponto individual
Veja como usá-las com KMeans em um 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]}")
Ao executar o código acima, você verá uma saída como esta:

Saída do exemplo em Python
O score geral de 0,791 indica que os quatro clusters estão bem definidos e separados.
Os scores por ponto permitem analisar cada observação individualmente.
Pontos com scores altos estão bem dentro de seus clusters. Pontos com scores baixos ou negativos estão na fronteira ou foram mal atribuídos, o que é útil para detectar outliers ou revisar casos limítrofes.
Como escolher o número ideal de clusters
Um dos usos mais comuns do silhouette score é escolher o k certo no KMeans.
O processo tem três etapas:
- Treine o KMeans para uma faixa de valores de k
- Calcule o silhouette score para cada ajuste
- Escolha o
kcom o score mais alto
Código para isso:
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}")
Esses são os scores que você verá para cada k:

Silhouette score para diferentes valores de k
O maior score está em k=4. Esse é o valor a escolher.
Vale lembrar que o silhouette score não substitui o conhecimento de negócio. Se o seu problema pede 5 segmentos de clientes e o maior silhouette é em 4, não escolha 4 automaticamente. A métrica mostra onde os dados têm a estrutura mais limpa, mas às vezes o número certo de clusters é aquele que faz sentido para o seu contexto.
Silhouette score vs. outras métricas de clustering
O silhouette score provavelmente é a métrica mais comum para avaliar clustering, mas não é a única. Veja como ele se compara às alternativas.
Silhouette score vs. método do cotovelo (elbow)
O método do cotovelo é uma técnica visual para escolher k no KMeans. Você treina modelos para uma faixa de k, plota a inércia (soma dos quadrados intra-cluster) contra k e escolhe o valor onde a curva faz uma dobra evidente.
A vantagem do método do cotovelo é ser rápido e fácil de rodar. Mas o "cotovelo" nem sempre é claro. Em dados bagunçados, a curva pode ser suave e não dá para ver onde ela dobra.
O silhouette score fornece um número para cada k, permitindo uma comparação mais objetiva. É mais lento de calcular, mas não deixa a decisão apenas à interpretação visual.
Use o método do cotovelo para um check rápido. Use o silhouette score quando precisar de uma resposta mais sólida.
Silhouette score vs. índice de Davies-Bouldin
O índice de Davies-Bouldin (DBI) mede a similaridade média entre cada cluster e o seu mais similar. DBI menor indica clustering melhor; o score perfeito é 0.
O DBI usa centróides dos clusters para calcular a similaridade, o que o torna mais rápido que o silhouette em datasets grandes. Ele também tem intuição parecida ao premiar clusters compactos e bem separados.
A questão é que o DBI só informa sobre o clustering como um todo. O silhouette também dá score por ponto, permitindo encontrar casos de fronteira e outliers.
Use DBI quando trabalhar com datasets grandes e performance for crucial. Use silhouette quando quiser analisar os pontos individualmente.
Silhouette score vs. índice de Calinski-Harabasz
O índice de Calinski-Harabasz (CH), também chamado de critério da razão de variância, é a razão entre a dispersão entre clusters e a dispersão dentro dos clusters. Scores mais altos indicam clustering melhor, e o score não tem limite superior.
O CH é rápido e funciona bem em datasets grandes porque envolve apenas estatísticas a nível de cluster. Assim como silhouette e DBI, funciona melhor em clusters convexos e bem separados.
O CH também não possui escala natural, então só dá para comparar scores CH entre modelos no mesmo dataset, não entre datasets diferentes.
Use CH quando seu dataset for grande e você precisar do resultado rapidamente. Use silhouette quando quiser interpretabilidade e insights ponto a ponto.
Métricas internas vs. externas
As métricas acima (silhouette, DBI, CH, elbow) são internas. Elas avaliam o clustering usando apenas os dados, sem rótulos verdadeiros. Por isso são padrão em problemas reais de clustering, onde rótulos não existem.
Métricas externas comparam as atribuições de clusters com rótulos conhecidos. Exemplos comuns incluem Adjusted Rand Index (ARI), Normalized Mutual Information (NMI) e homogeneidade. Elas são usadas quando há rótulos e você quer testar o quão bem um algoritmo de clustering os reproduz.
Use métricas internas quando não houver rótulos, que é o mais comum. Use métricas externas ao comparar algoritmos de clustering em dados rotulados.
Aqui vai um resumo das métricas lado a lado:
| Método | Faixa | Melhor valor | Velocidade | Use para |
|---|---|---|---|---|
| Silhouette score | -1 a 1 | Perto de 1 | Lento em datasets grandes | Interpretabilidade e insights por ponto |
| Método do cotovelo (elbow) | 0 ao infinito | Procure o "cotovelo" | Rápido | Verificações rápidas |
| Índice de Davies-Bouldin | 0 ao infinito | Perto de 0 | Rápido | Datasets grandes |
| Índice de Calinski-Harabasz | 0 ao infinito | Quanto maior, melhor | Rápido | Datasets grandes e sem rótulos |
Silhouette score em comparação com alternativas
Limitações do silhouette score
O silhouette score tem algumas limitações importantes:
- Pressupõe clustering baseado em distância: Por padrão, usa distância Euclidiana. Funciona bem para KMeans e outros algoritmos baseados em centróide, mas não se adapta a métodos baseados em densidade como DBSCAN, onde clusters têm formatos arbitrários e não há centróide claro
- Funciona melhor com clusters pequenos e bem separados: A métrica favorece clusters compactos e aproximadamente esféricos, distantes entre si. Se seus dados têm clusters próximos ou sobrepostos, o score será baixo mesmo que o clustering esteja correto
- Não é ideal para formatos irregulares de cluster: Na prática, clusters nem sempre são convexos. Nesses casos, os scores podem ser baixos mesmo com atribuições corretas
- Custo computacional em datasets grandes: Calcular o silhouette exige distâncias par a par entre pontos, o que escala como
O(n^2). Em conjuntos com milhões de pontos, isso sai caro - Sensibilidade à métrica de distância escolhida: O score muda conforme você usa Euclidiana, Manhattan, cosseno ou outra. Se os dados não seguem as suposições Euclidianas, o silhouette pode induzir ao erro
Boas práticas para usar o silhouette score
O silhouette score funciona melhor quando você segue algumas práticas básicas:
- Compare múltiplas soluções de clustering: Não calcule apenas um único silhouette. Treine modelos com diferentes valores de
k(ou algoritmos diferentes) e compare os scores lado a lado - Visualize os clusters junto com o score: Um número sozinho não conta a história toda. Plote os clusters e veja se os formatos fazem sentido
- Não otimize apenas pelo maior score: Clustering com k=2 muitas vezes tem score maior do que
k=5mesmo quando 5 clusters fazem mais sentido para o seu problema - Combine com conhecimento de domínio: O score mostra onde os dados têm a estrutura mais nítida. O conhecimento de domínio mostra qual estrutura é realmente útil. Use os dois
- Avalie múltiplas métricas de clustering: Silhouette, DBI, CH e outras métricas medem qualidade de formas diferentes. Quando houver concordância, é um bom sinal; quando não, investigue os dados
Conclusão
O silhouette score é uma das maneiras mais intuitivas de avaliar clustering porque mostra tanto o quão bem os pontos estão agrupados quanto o quão bem os clusters estão separados.
Você calcula ponto a ponto, faz a média e obtém um número entre -1 e 1. Scores próximos de 1 indicam clusters bem definidos; scores perto de 0 ou negativos indicam que a estrutura pode não ser real.
Mas o silhouette score é só o começo. Combine-o com visualizações de clusters e, principalmente, com seu conhecimento de domínio. Só quando tudo apontar para a mesma direção você pode confiar no resultado.
O silhouette score faz parte do panorama maior de Unsupervised Learning in Python. Inscreva-se hoje para aprender a agrupar, transformar, visualizar e extrair insights de dados sem rótulos.
