Menu
CoddyTech

Escale antes de agrupar

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 9 de 51.

O K-means agrupa por distância, então as unidades maiores predominam. Gatos de abrigo por peso em gramas e idade em anos: uma diferença de 500 g se sobrepõe a uma de 10 anos.

Dois gráficos de 120 gatos de abrigo, idade em anos na horizontal e peso em gramas na vertical. À esquerda, agrupados sem escala: os gatos adultos se dividem por peso, misturando jovens e idosos. À direita, agrupados após a normalização: filhotes, adultos e idosos, separados por idade

Primeiro, padronize, como no k-NN, para que cada característica tenha o mesmo peso:

X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X_scaled)

make_pipeline(StandardScaler(), KMeans(...)) faz as duas coisas em um único modelo. Depois, interprete cada grupo em unidades reais: calcule a média de suas linhas originais, X[km.labels_ == c].mean(axis=0).

challenge icon

Desafio

Fácil

Um aplicativo de busca de apartamentos agrupa 100 anúncios por aluguel e distância até a estação. O código inicial agrupa as colunas brutas, e todos os grupos ficam a cerca de 3 km de distância: os dólares abafam os quilômetros.

  1. Escale as duas colunas com um StandardScaler.
  2. Agrupe as linhas escaladas. Mantenha o relatório: ele apresenta cada grupo em unidades reais.

Para outra cidade:

38 flats: $1820 a month, 0.9 km out
33 flats: $1130 a month, 4.2 km out
29 flats: $2760 a month, 1.5 km out

Experimente você mesmo

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Uma linha por apartamento: aluguel mensal em dólares, distância até a estação em km
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# Isso agrupa as colunas sem padronização: corrija
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# Apresente cada grupo em unidades reais, começando pelo maior
sizes = pd.Series(km.labels_).value_counts()
for c in sizes.index:
    group = flats[km.labels_ == c]
    print(f"{sizes[c]} flats: ${round(group['rent'].mean())} a month, {group['station_km'].mean():.1f} km out")
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online