Pular para o conteúdo
</>RoByte

Buscar cursos e aulas

Aulas do curso

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

  1. Você escolhe o número de grupos, k.
  2. O algoritmo sorteia k pontos como centros iniciais.
  3. Cada amostra é atribuída ao centro mais próximo.
  4. Cada centro é movido para a média das amostras do seu grupo.
  5. 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.