Uma das operações mais comuns quando se trabalha com dados é o agrupamento dos mesmos. Muitas vezes esse agrupamento é explicito, como por exemplo grupos de deputados pertencentes a um mesmo partido. Entretanto, pode ser também muito interessante buscar outras formas de agrupamento nem sempre tão explicitas.
Existem diversas técnicas para esse propósito. O princípio de todas essas técnicas é buscar relações de proximidade ou distância entre os atributos dos seus dados e encontrar grupos coesos de elementos com características próximas entre si (por exemplo, deputados podem ser agrupados por seus padrões de votos, renda, discursos, etc...)
Uma das técnicas mais conhecidas para esse agrupamento não supervisionado é o algoritmo k-means. O k-means consegue, a partir da distribuição dos atributos dos dados, detectar grupos.
O único porém do método é que o número de grupos deve ser determinado antes de sua execução. Nem sempre é possível prever de antemão esse número e diferentes valores devem ser testados em alguns casos.
Veremos a seguir alguns exemplos de utilização do k-means, utilizando a biblioteca de aprendizado de máquina "scikit-learn" e dados de exemplo que contém dois atributos (coordenada x e y), que permitirá a visualização gráfica do algoritmo.
O primeiro exemplo utilizará como base o arquivo mouse.csv. Vamos carregar e plotar suas coordenadas.
Também usaremos bibliotecas python que nos auxiliarão:
In [1]:
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
#carrega base com base "mouse"
mouse = np.load("/hackday/mouse.npy") #le arquivo local csv, com dados, usando pandas
print "dimensão da base:", mouse.shape
plt.scatter(mouse[:,0], mouse[:,1]) #plota pontos em 2D
plt.show()
Observe a imagem plotada. Se você está vendo uma imagem de um personagem protegido por direitos autorais, nós não nos responsabilizamos por isso.
Tente perceber como os pontos se agrupam no espaço. Em quantos grupos você dividiria a imagem? Quais pontos pertencem a cada grupo?
Utilizando a implementação do kmeans do scikit-learn, vamos agrupar os dados em 3 grupos:
In [ ]:
k_means = KMeans(n_clusters=3) #inicializa a classe kmeans, com 3 clusters
k_means.fit(mouse) #atribui clusters aos dados
k_means_labels = k_means.labels_ #obtem o rotulo (classe) para cada amostra da colecao
Cada ponto do gráfico recebeu um rótulo (label), referente a sua classe. Podemos colorir o gráfico, dando uma cor diferente para elementos de cada grupo:
In [ ]:
plt.scatter(mouse[:,0], mouse[:,1], c=k_means_labels)
plt.show()
Agora é a vez de você treinar. Analise o seguinte conjunto de pontos "mistério":
In [ ]:
misterio = np.load("/hackday/misterio.npy")
plt.scatter(misterio[:,0], misterio[:,1]) #plota pontos em 2D
plt.show()
Quantos grupos você acha que compõem a base mistério? Tente rodar o kmeans, variando o número de clusters e observe o resultado para diferentes valores.
Como comparar diferentes resultados de clusterização? Que medidas podem ser feitas para avaliar a coesão de um cluster?
Opcional: Implemente alguma forma de medir a qualidade de uma clusterização, dado o número de clusters. Dica: A classe kmeans possui o atributo clustercenters (acessível como k_means.clustercenters), que contém as coordenadas do ponto central de cada grupo.
Utilize os espaços abaixo para implementar sua solução
In [ ]:
#rode o kmeans, para a base "misterio" alterando o valor da variavel "n_clusters"
#plote o resultado e faca comparacoes
#meça a qualidade de cada resultado