Introdução
K-Means é um dos algoritmos de agrupamento mais populares. Por ter pontos centrais em um cluster, ele agrupa outros pontos com base em sua distância até aquele ponto central.
Uma desvantagem do K-Means é ter que escolher o número de clusters, K, antes de executar o algoritmo que agrupa os pontos.
Se você gostaria de ler um guia detalhado para K-Means Clustering, dê uma olhada em “K-Means Clustering com Scikit-Learn”.
Método de cotovelo e análise de silhueta
As técnicas mais utilizadas para a escolha do número de Ks são as Método do cotovelo e os votos de Análise de silhueta.
Para facilitar a escolha de Ks, o Tijolo amarelo library encerra o código com loops for e um gráfico que normalmente escreveríamos em 4 linhas de código.
Para instalar o Yellowbrick diretamente de um notebook Jupyter, execute:
! pip install yellowbrick
Vamos ver como funciona para um conjunto de dados familiar que já faz parte do Scikit-learn, o íris conjunto de dados.
O primeiro passo é importar o conjunto de dados, KMeans
e yellowbrick
bibliotecas e carregue os dados:
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer, SilhouetteVisualizer
iris = load_iris()
Observe aqui, importamos o KElbowVisualizer
e SilhouetteVisualizer
da yellowbrick.cluster
, esses são os módulos que usaremos para visualizar os resultados do Elbow e Silhouette!
Depois de carregar o conjunto de dados, no data
chave do grupo (um tipo de dado que é uma extensão de um dicionário) são os valores dos pontos que queremos agrupar. Se você quiser saber o que os números representam, dê uma olhada em iris['feature_names']
.
Sabe-se que o conjunto de dados Iris contém três tipos de íris: 'versicolor', 'virginica' e 'setosa'. Você também pode inspecionar as classes em iris['target_names']
verificar.
Então, temos 4 features para agrupar e elas devem ser separadas em 3 agrupamentos diferentes de acordo com o que já sabemos. Vamos ver se nossos resultados com o Método do Cotovelo e Análise da Silhueta corroboram isso.
Primeiro, vamos selecionar os valores do recurso:
print(iris['feature_names'])
print(iris['target_names'])
X = iris['data']
Então, podemos criar um KMeans
modelo, um KElbowVisualizer()
instância que receberá esse modelo junto com o número de ks para o qual uma métrica será calculada, neste caso de (2 - 11) Ks.
Depois disso, ajustamos o visualizador com os dados usando fit()
e exibir o gráfico com show()
. Se uma métrica não for especificada, o visualizador usará o distorção métrica, que calcula a soma das distâncias quadradas de cada ponto ao seu centro atribuído:
model = KMeans(random_state=42)
elb_visualizer = KElbowVisualizer(model, k=(2,11))
elb_visualizer.fit(X)
elb_visualizer.show()
Agora, já temos um Cotovelo de pontuação de distorção para cluster do KMeans plote com uma linha vertical marcando qual seria o melhor número de ks, neste caso, 4
.
Parece que o Método Elbow com uma métrica de distorção não era a melhor escolha se não conhecêssemos o número real de clusters. A Silhouette também indicará que existem 4 clusters? Para responder isso, basta repetir o último código com um modelo com 4 clusters e um objeto visualizador diferente:
model_4clust = KMeans(n_clusters = 4, random_state=42)
sil_visualizer = SilhouetteVisualizer(model_4clust)
sil_visualizer.fit(X)
sil_visualizer.show()
O código exibe um Gráfico de silhueta do cluster KMeans para 150 amostras em 4 centros. Para analisar esses clusters, precisamos olhar para o valor do coeficiente de silhueta (ou score), seu melhor valor é mais próximo de 1. O valor médio que temos é 0.5
, marcado pela linha vertical, e não tão bom.
Também precisamos olhar para a distribuição entre os agrupamentos – um bom gráfico tem tamanhos semelhantes de áreas agrupadas ou pontos bem distribuídos. Neste gráfico, existem 3 clusters menores (número 3, 2, 1) e um cluster maior (número 0), o que não é o resultado que esperávamos.
Confira nosso guia prático e prático para aprender Git, com práticas recomendadas, padrões aceitos pelo setor e folha de dicas incluída. Pare de pesquisar comandos Git no Google e realmente aprender -lo!
Vamos repetir o mesmo gráfico para 3 clusters para ver o que acontece:
model_3clust = KMeans(n_clusters = 3, random_state=42)
sil_visualizer = SilhouetteVisualizer(model_3clust)
sil_visualizer.fit(X)
sil_visualizer.show()
Ao alterar o número de clusters, a pontuação da silhueta ficou 0.05
maiores e os clusters são mais equilibrados. Se não soubéssemos o número real de clusters, experimentando e combinando as duas técnicas, teríamos escolhido 3
em vez de 2
como o número de Ks.
Este é um exemplo de como combinar e comparar diferentes métricas, visualizar dados e experimentar diferentes valores de clusters é importante para conduzir o resultado na direção certa. E também, como ter uma biblioteca que facilite essa análise pode ajudar nesse processo!