Menu
CoddyTech

Clústeres como características

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

Un modelo lineal no puede curvarse. La señal telefónica en tres pueblos se debilita con la distancia a la antena de cada pueblo, una forma que la posición por sí sola oculta:

135 hogares en tres pueblos, hacia el este a través de la imagen y hacia el norte arriba, cada pueblo alrededor de una cruz negra, su centro de k-means. Líneas discontinuas unen un hogar rojo con los tres centros: 4.9 km, 5.2 km y, el más cercano, 1.0 km

k-means encuentra las aldeas. km.transform da la distancia de cada fila a todos los centros, y .min(axis=1) conserva la más cercana:

km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X_train)
near_train = km.transform(X_train).min(axis=1)
near_test = km.transform(X_test).min(axis=1)
X_train2 = np.column_stack([X_train, near_train])
X_test2 = np.column_stack([X_test, near_test])

Con esa columna adicional, el R cuadrado de prueba de un modelo lineal sube de 0.000 a 0.886.

Ajusta k-means solo con las filas de entrenamiento, como un escalador, y después transforma ambos conjuntos.

challenge icon

Desafío

Intermedio

El equipo de sonido de un festival quiere saber qué tan alto es el sonido donde se encuentra la gente. El código inicial divide crowd.csv, lee k e imprime la puntuación usando solo la posición.

  1. Ajusta k-means con k clústeres a las posiciones de entrenamiento.
  2. Añade la distancia de cada fila al centro más cercano como tercera columna, en ambos conjuntos.
  3. Imprime el nuevo R cuadrado de prueba y la ganancia, con 3 decimales.

Para otro festival y k = 4:

Position only: R squared 0.097
With the nearest of 4 centers: R squared 0.734
Gain: 0.637

Pruébalo tú mismo

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.cluster import KMeans

# 250 asistentes al festival: dónde estaban situados (m) y el nivel de sonido allí (dB)
crowd = pd.read_csv("crowd.csv")
X = crowd[["x_m", "y_m"]].to_numpy()
y = crowd["sound_db"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())


# Ajusta una regresión lineal con las columnas de entrenamiento y devuelve su R al cuadrado para las columnas de prueba
def test_r2(A_train, A_test):
    model = LinearRegression().fit(A_train, y_train)
    return model.score(A_test, y_test)


before = test_r2(X_train, X_test)
print(f"Position only: R squared {before:.3f}")

# Escribe tu código a continuación
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