Exercícios

1 - Aplique os algoritmos K-means [1] e AgglomerativeClustering [2] em qualquer dataset que você desejar (recomendação: iris). Compare os resultados utilizando métricas de avaliação de clusteres (completeness e homogeneity, por exemplo) [3].

2 - Qual o valor de K (número de clusteres) você escolheu para a questão anterior? Desenvolva o Método do Cotovelo (não utilizar lib!) e descubra o K mais adequado. Após descobrir, aplique novamente o K-means com o K adequado.

3 - Após a questão 2, você aplicou o algoritmo com K apropriado. Refaça o cálculo das métricas de acordo com os resultados de clusters obtidos com a questão anterior e verifique se o resultado melhorou.

Bibliotecas


In [1]:
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

1ª Questão:

Carregando o Dataset (Glass)


In [8]:
# Carregando o Wine Dataset (https://archive.ics.uci.edu/ml/datasets/Wine)
data = pd.read_csv("wine.data")
X = data.iloc[:,1:].values
y = data.iloc[:,0].values

# Pre-processing the data (for PCA)
X = (X - X.mean(axis=0)) / X.std(axis=0)

Visualização dos Dados


In [3]:
# Plotando uma visualização 3-Dimensional dos Dados
# Podemos observar que os dados (em 3-Dimensões) são extremamente superpostos
pcaData = PCA(n_components=3).fit_transform(X)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(pcaData[:,0], pcaData[:,1], pcaData[:,2], c=y, cmap=plt.cm.Dark2)
plt.show()


Aplicação do K-Means


In [4]:
# Criamos o objeto da classe KMeans
kmeans = KMeans(n_clusters=2, random_state=0)

# Realizamos a Clusterização
kmeans.fit(X)
clts = kmeans.predict(X)

# Plotando uma visualização 3-Dimensional dos Dados, agora com os clusteres designados pelo K-Means
# Compare a visualização com o gráfico da celula de cima
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(pcaData[:,0], pcaData[:,1], pcaData[:,2], c=clts, cmap=plt.cm.Dark2)
plt.show()


Métricas de Avaliação


In [5]:
# Utilizamos três métricas de avaliação dos Clusteres, com base nos dados já classificados: 
# -> Homogeneity: porcentagem relativa ao objetivo de ter, em cada cluster, apenas membros de uma mesma classe
# -> Completeness: porcentagem relativa ao objetivo de ter todos os membros de uma classe no mesmo cluster
# -> V-Measure: medida que relaciona Homogeneity com Completeness, e é equivalente à uma métrica conhecida como NMI (Normalized Mutual Information).
homoScore = metrics.homogeneity_score(y, clts)
complScore = metrics.completeness_score(y, clts)  
vMeasureScore = metrics.v_measure_score(y, clts)

print("### Avaliação ({0} Clusters) ###".format(kmeans.n_clusters))
print("Homogeneity: \t{0:.3}".format(homoScore))
print("Completeness: \t{0:.3}".format(complScore))
print("V-Measure: \t{0:.3}".format(vMeasureScore))


### Avaliação (2 Clusters) ###
Homogeneity: 	0.402
Completeness: 	0.664
V-Measure: 	0.501

2ª Questão

Implementando o Método do Cotovelo


In [6]:
# Método do Cotevelo baseado na Inertia (Soma Quadrática da Distância Intra-Cluster de cada Ponto)
numK = np.arange(1,10); inertias = []
for i in numK:
    print(".", end="")
    kmeans.n_clusters = i
    kmeans.fit(X)
    
    inertias.append(kmeans.inertia_)
    
# Plotagens
plt.figure()
plt.title("Elbow Method")
plt.xlabel("Num of Clusters"); plt.ylabel("Inertia")
plt.plot(numK, inertias, 'bo-')
plt.show()


.........

Questão 3


In [7]:
# Realizamos a Clusterização, agora com um número selecionado de Clusteres
kmeans.n_clusters = 3
kmeans.fit(X)
clts = kmeans.predict(X)

# Visualização das Métricas de Avaliação
homoScore = metrics.homogeneity_score(y, clts)
complScore = metrics.completeness_score(y, clts)  
vMeasureScore = metrics.v_measure_score(y, clts)

print("### Avaliação ({0} Clusters) ###".format(kmeans.n_clusters))
print("Homogeneity: \t{0:.3}".format(homoScore))
print("Completeness: \t{0:.3}".format(complScore))
print("V-Measure: \t{0:.3}".format(vMeasureScore))

# Plotando uma visualização 3-Dimensional dos Dados, agora com os clusteres designados pelo K-Means
# Compare a visualização com os gráficos anteriores
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(pcaData[:,0], pcaData[:,1], pcaData[:,2], c=clts, cmap=plt.cm.Dark2)
plt.show()


### Avaliação (3 Clusters) ###
Homogeneity: 	0.878
Completeness: 	0.872
V-Measure: 	0.875