Lab08 - Aprendizado não supervisionado - KMeans, DBScan e GaussianMixture
Métodos de agrupamento¶
Uma das técnicas de aprendizagem não supervisionada é o agrupamento automático de dados ou clusterização.
Lembre-se: Em aprendizagem não supervissionada, o nosso conjunto de dados para treino não possui label.
Essa técnica classifica os dados em conjuntos que apresentam alguma similaridade (distância das observações). Os grupos gerados nesse processo são chamados de clusters
.
Desafio 1¶
Acesse o link e realize o cadastro com email FIAP
e bora fazer a atividade: https://miro.com/app/board/o9J_l2e1B1U=/
K-Means¶
O K-Means é SIMPLE por isso é um dos metodos de clusterização mais "clásicos" e recebe esse nome pois encontra uma quantidade K de clusters
, sendo K um parâmetro para o modelo e para cada cluster é atribuído um centro chamado de centroide
. Tambem conhecido método de partição sem sobreposição.
Curiosidades¶
Esse algoritimo está entre os top 10 algoritimos de mineração de dados (data mining)
É um algoritimo utilizado a mais de 70 anos, existe papers das decadas de 50 e 60 que falam sobre ele.
Algoritmo K-Means¶
O algoritimo K-Means trata-se de um método iterativo e pode ser definido em 4 etapas, são elas:
1) Escolher aleatoriamente k protótipos (centros) para os clusters
2) Atribuir cada objeto para o cluster de centro mais próximo (segundo alguma distância, e.g. Euclidiana)
3) Mover cada centro para a média (centróide) dos objetos do cluster correspondente
4) Repetir os passos 2 e 3 até que algum critério de convergência seja obtido:
- número máximo de iterações
- limiar mínimo de mudanças nos centróides
Vantagens e Desvantagens¶
Vantagens¶
- Simples e intuitivo
- Complexidade computacional linear em todas as variáveis críticas
- Eficaz em muitos cenários de aplicação e produz resultados de interpretação simples
Desvantagens¶
- k = ?
- Sensível à inicialização dos protótipos (mínimos locais)
- Limita-se a encontrar clusters volumétricos / globulares
- Cada item deve pertencer a um único cluster (partição rígida, ou seja, sem sobreposição)
- Limitado a atributos numéricos
- Sensível a outliers
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set() # for plot styling
import numpy as np
from sklearn.datasets import make_blobs
X, y_true = make_blobs(n_samples=3300, centers=8,
cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], s=5);
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=8)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
Desafio 2¶
Pergunta: E como descobrir o número de k?
dica: Busque por referências como o método do cotovelo ou elbow...
Desafio 3¶
Pergunta: E se os dados não forem volumétricos ou globulares? o K-Means consegue clusterizar?
dica: Busque por métodos de agrupamento por densidade
#Importe das libs
import pandas as pd
from sklearn.cluster import KMeans, DBSCAN
from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt
Carregando os dados¶
url_db = 'https://raw.githubusercontent.com/reisanar/datasets/master/moons.csv'
moons = pd.read_csv(url_db)
moons.head()
X | Y | |
---|---|---|
0 | -0.415208 | 1.035735 |
1 | 0.058781 | 0.304334 |
2 | 1.109379 | -0.509738 |
3 | 1.540948 | -0.427550 |
4 | 0.929095 | -0.532388 |
plt.scatter(x=moons['X'], y=moons['Y'])
<matplotlib.collections.PathCollection at 0x11825940130>
Criação de modelos de Agrupamento¶
# Modelos de agrupamento
random_state = 42
#k-means
km = KMeans(n_clusters=4, random_state=random_state) # k=4
#Gaussian Mixture
gm = GaussianMixture(n_components=4, random_state=random_state) #k=4
#DBScan
db = DBSCAN(eps=0.4)
#aplica o algoritimo e armazena o cluster de cada dado
km_c = km.fit_predict(moons)
gm_c = gm.fit_predict(moons)
db_c = db.fit_predict(moons)
fig = plt.figure(figsize = (12,8), dpi=80)
plt.subplot(2,2,1)
plt.scatter(x=moons['X'],y=moons['Y'])
plt.title('Original')
plt.subplot(2,2,2)
plt.scatter(x=moons['X'],y=moons['Y'], c=km_c)
plt.title('KMeans')
plt.subplot(2,2,3)
plt.scatter(x=moons['X'],y=moons['Y'], c=gm_c)
plt.title('GaussianMixture')
plt.subplot(2,2,4)
plt.scatter(x=moons['X'],y=moons['Y'], c=db_c)
plt.title('DBScan')
Text(0.5, 1.0, 'DBScan')