Vídeo em breve
Por enquanto, esta aula está disponível só em texto — o vídeo entra assim que ficar pronto.
Modelos clássicos
Agrupamento com K-Means
Aprendizado não supervisionado: descobrir grupos nos dados sem ter rótulos, e como escolher o número de grupos. · 15 min
Até agora todos os problemas tinham uma resposta certa nos dados (o preço, a espécie). No aprendizado não supervisionado não existe target: o objetivo é encontrar estrutura nos dados por conta própria. O caso mais comum é o agrupamento (clustering): separar as amostras em grupos de itens parecidos.
Usos típicos: segmentar clientes por comportamento de compra, agrupar notícias por assunto, reduzir as cores de uma imagem. Em robótica, dá para agrupar leituras de um sensor de distância em objetos separados.
Como o K-Means funciona
- Você escolhe o número de grupos,
k. - O algoritmo sorteia
kpontos como centros iniciais. - Cada amostra é atribuída ao centro mais próximo.
- Cada centro é movido para a média das amostras do seu grupo.
- Os passos 3 e 4 se repetem até os centros pararem de mudar.
Na prática
Vamos gerar dados com três grupos escondidos e pedir ao K-Means que os encontre, sem dizer a ele quem é de qual grupo:
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
X, _ = make_blobs(n_samples=300, centers=3, random_state=42)
# o "_" descarta os rótulos reais: o modelo não vai vê-los
kmeans = KMeans(n_clusters=3, n_init=10, random_state=42)
grupos = kmeans.fit_predict(X) # devolve o grupo de cada amostra
print(kmeans.cluster_centers_) # as coordenadas dos 3 centros
plt.scatter(X[:, 0], X[:, 1], c=grupos)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
c="red", marker="x", s=200)
plt.show()
Dica
O n_init=10 roda o algoritmo 10 vezes com sorteios iniciais diferentes
e fica com a melhor. Como o resultado depende do sorteio inicial, isso
deixa o agrupamento bem mais estável.
Como escolher o valor de k?
Com dados reais você raramente sabe quantos grupos existem. Uma técnica
clássica é o método do cotovelo: treinar com vários valores de k e
olhar a inércia (a soma das distâncias das amostras até o seu centro).
A inércia sempre cai quando k aumenta, mas em algum ponto a queda
desacelera bruscamente, formando um “cotovelo” no gráfico.
inercias = []
valores_k = range(1, 9)
for k in valores_k:
modelo = KMeans(n_clusters=k, n_init=10, random_state=42)
modelo.fit(X)
inercias.append(modelo.inertia_)
plt.plot(valores_k, inercias, marker="o")
plt.xlabel("Número de grupos (k)")
plt.ylabel("Inércia")
plt.show()
Nos dados deste exemplo, o cotovelo aparece em k = 3, o número real de
grupos.
Atenção
Como o K-Means usa distâncias, ele sofre do mesmo problema do KNN com escalas diferentes entre as features. E ele funciona melhor com grupos mais ou menos redondos e de tamanho parecido: formas alongadas ou aninhadas confundem o algoritmo.
Exercícios
Exercício
1. Aquecimento. Gere dados com make_blobs usando centers=4 e
agrupe com k = 4. Plote o resultado colorindo cada grupo.
Exercício
2. Cotovelo. Faça o gráfico do método do cotovelo para os dados do
exercício anterior. O cotovelo indica 4 grupos? Depois repita com
cluster_std=3 no make_blobs (grupos mais espalhados) e veja o que
acontece com o gráfico.
Exercício
3. Desafio. Use o dataset da íris ignorando a coluna target,
agrupe as flores com k = 3 e compare os grupos encontrados com as
espécies reais usando pd.crosstab(y, grupos). O K-Means reencontrou as
espécies? Repare que os números dos grupos podem estar em outra ordem
que os das espécies, o que não é um erro.