Menu
CoddyTech

Escalar antes de agrupar

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 9 de 51.

K-means agrupa según la distancia, así que las unidades más grandes dominan. El peso de los gatos de refugio está en gramos y la edad, en años: una diferencia de 500 g eclipsa una de 10 años.

Dos gráficos de 120 gatos de refugio, con la edad en años en el eje horizontal y el peso en gramos en el vertical. A la izquierda, agrupados sin escalar: los gatos adultos se dividen por peso, mezclando jóvenes y mayores. A la derecha, agrupados después del escalado: gatitos, adultos y gatos mayores, divididos por edad

Estandariza primero, como para k-NN, para que cada característica cuente por igual:

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(...)) hace ambas cosas en un solo modelo. Después, lee cada grupo en unidades originales: calcula el promedio de sus filas originales, X[km.labels_ == c].mean(axis=0).

challenge icon

Desafío

Fácil

Una aplicación para buscar pisos agrupa 100 anuncios según el alquiler y la distancia a la estación. El código inicial agrupa las columnas sin escalar, y todos sus grupos quedan a unos 3 km: los dólares eclipsan a los kilómetros.

  1. Escala las dos columnas con StandardScaler.
  2. Agrupa las filas escaladas. Conserva el informe: lee cada grupo en unidades reales.

Para otra ciudad:

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

Pruébalo tú mismo

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

# Una fila por piso: alquiler mensual en dólares, distancia a la estación en km
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# Esto agrupa las columnas sin procesar: corrígelo
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# Muestra cada grupo en unidades reales, empezando por el más grande
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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online