Lab09 - Aprendizado não supervisionado - DBScan, agrupamento hierarquico, dendrograma
Métodos de agrupamento¶
De forma geral as estratégias de agrupamento são:¶
- Partição: exemplo KMeans
- Densidade: exemplo DBSCAN
- Hierarquicas: exemplo AGNES
Utilizamos a ferramenta orange-canvas
para obter uma intuição sobre esses algoritimos além de compreender suas principais diferença.
Desafio 1 (Sugestão)¶
Faça a instalação do orange-canvas
em sua maquina e realize os exemplos dados em sala de aula.
Para usuarios linux o site oficial https://orangedatamining.com/ recomenda o uso de virutal env, eu uso direto sem virtual env:
Instalação:
sudo apt install python3-pyqt5.*
pip install --upgrade --user pyqtwebengine==5.12
pip install --upgrade --user pyqt5==5.12
pip3 install orange3 --user
pip install orange3-educational
Execute:
python3 -m Orange.canvas
ou
orange-canvas
Agrupamento por estratégia Hierarquica¶
adiciona descrição do problema...
Importa libs¶
%matplotlib inline
# O scipy é bastante utilizada para Data Science
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
Importa dataset¶
url_db= 'https://stackabuse.s3.amazonaws.com/files/hierarchical-clustering-with-python-and-scikit-learn-shopping-data.csv'
df = pd.read_csv(url_db)
#renomeando o nome das colunas para tirar espaço
df.columns = ['CustomerID', 'Genre', 'Age', 'Annual_Income_k','Spending_Score_1_100']
df.head()
CustomerID | Genre | Age | Annual_Income_k | Spending_Score_1_100 | |
---|---|---|---|---|---|
0 | 1 | Male | 19 | 15 | 39 |
1 | 2 | Male | 21 | 15 | 81 |
2 | 3 | Female | 20 | 16 | 6 |
3 | 4 | Female | 23 | 16 | 77 |
4 | 5 | Female | 31 | 17 | 40 |
Descrição das colunas do dataset:
CustomerID = Identificação do usuario
Genre = Genero
Age = Idade
Annual Income (k$) = Rendimento anual em k$
Spending Score (1-100) = Indice de "vontade de gastar no shooping"
Criando um subset¶
data = df.iloc[:,[3,4]].values
data;
Visualização no espaço 2D¶
plt.figure(figsize=(10,7))
plt.scatter(data[:, 0], data[:, 1])
<matplotlib.collections.PathCollection at 0x259d91692e0>
Desafio 2¶
Realize uma análise visual e determine uma quantidade de cluster.
[ ] - 2 clusters
[ ] - 3 clusters
[ ] - 4 clusters
[ ] - 5 clusters
[ ] - 6 clusters
[ ] - 7 clusters
[ ] - 8 clusters
Dendrograma¶
O dendrograma é uma forma grafica de visualizar o agrupamentos de objetos.
O agrupamento (linkage
) é feito de forma iterativa: No inicio, cada objeto é um cluster e no fim, todos os objetos fazem parte do mesmo cluster.
plt.figure(figsize=(10,10))
den = dendrogram(linkage(data, method='average'))
#plt.axhline(y=30)
Desafio 2¶
Visualmente, com base no dendrograma acima, qual seria o melhor corte para realizar a clusterização hierarquica?
[ ] - 2 clusters
[ ] - 3 clusters
[ ] - 4 clusters
[ ] - 5 clusters
[ ] - 6 clusters
[ ] - 7 clusters
[ ] - 8 clusters
Desafio 3¶
O agrupameno dos dados foi realizado a partir do calculo da média (average). Realize um estudo para comparar com outros linkage methtods.
single
complete
average
weighted
centroid
median
ward
Compare os resultados de pelo menos 3 métodos: single, average e ward
Referência: Leia a documentação oficial https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html#scipy.cluster.hierarchy.linkage
## sua resposta aqui.....
AGNES¶
AGNES (AgglomerativeClustering) é uma estratégia de agrupamento de dados do tipo botton-top.
Como parametros deve ser passado o numero de cluster que foi encontrado no dendrograma e os metodos utilizados affinity e linkage.
cluster = AgglomerativeClustering(n_clusters=5, affinity="euclidean", linkage="ward")
cluster.fit_predict(data)
array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2], dtype=int64)
cluster.labels_
array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2], dtype=int64)
plt.figure(figsize=(10,7))
plt.scatter(data[:,0],data[:,1], c=cluster.labels_, cmap="rainbow")
<matplotlib.collections.PathCollection at 0x7ff2cf90d640>
Desafio 4¶
Utilizando este dataset compare com os resultados para KMeans e DBSCAN
## implemente sua resposta