Menu
CoddyTech

Escalado para los vecinos

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

k-NN mide la distancia, así que una característica con valores grandes eclipsa al resto, como se advirtió en la sección 2. Aquí, la distancia al río, en metros, eclipsa la elevación:

Dos mapas de 160 casas, con la distancia al río en el eje horizontal y la elevación en el vertical; inundadas o secas. Sin escalar: el mapa queda dividido en franjas verticales solo por la distancia, con una precisión de 0.6. Escalado: las casas inundadas quedan en la esquina inferior cerca del río, con una precisión de 0.925

Escala primero. Ajusta el escalador solo con las filas de entrenamiento y, después, transforma ambos conjuntos:

scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)
model = KNeighborsClassifier()
model.fit(X_train_s, y_train)
print(model.score(X_test_s, y_test))

Esto imprime 0.925, frente a 0.6. Las filas de prueba siguen sin verse: el escalador no aprende nada de ellas.

challenge icon

Desafío

Fácil

Un medidor inteligente adivina qué aparato está en funcionamiento a partir de su potencia (vatios) y tiempo de funcionamiento (minutos), en meter.csv. El código inicial lee k e imprime la precisión de k-NN con las características sin escalar.

  1. Ajusta un StandardScaler con las filas de entrenamiento y transforma ambos conjuntos.
  2. Ajusta un modelo k-NN con el mismo valor de k usando las filas escaladas; imprime su precisión con 3 decimales.
  3. Imprime la mejora.

Para otra casa y k = 5:

Unscaled accuracy: 0.65
Scaled accuracy: 0.875
Scaling gains 0.225

Pruébalo tú mismo

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler

# Una fila por cada uso de un electrodoméstico: potencia en vatios, tiempo de funcionamiento en minutos y qué electrodoméstico es
meter = pd.read_csv("meter.csv")
X = meter[["watts", "minutes"]]
y = meter["appliance"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())

# k-NN con las características sin procesar
raw_model = KNeighborsClassifier(n_neighbors=k)
raw_model.fit(X_train, y_train)
raw = raw_model.score(X_test, y_test)
print(f"Unscaled accuracy: {round(raw, 3)}")

# 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 supervisado

Practica por tu cuenta: Compilador de Python online