17 · Clasificación con K-Vecinos más cercanos
El algoritmo más perezoso — memoriza los datos de entrenamiento, luego clasifica nuevos puntos votando entre sus k vecinos más cercanos.
KNN es el algoritmo más perezoso — 'entrena' instantáneamente memorizando todos los datos, luego clasifica un nuevo punto votando entre sus k vecinos más cercanos.
Sin esto:
Sin KNN te perderías el aprendiz basado en instancias canónico y el clasificador no lineal más simple posible.
Cada modelo que hemos visto hasta ahora — regresión lineal, logística, SVM, Naive Bayes — ajusta un conjunto compacto de parámetros durante el entrenamiento. En el momento de inferencia, solo esos parámetros importan; los datos originales pueden descartarse.
K-Nearest Neighbors (KNN) descarta esa idea por completo. No hay un paso de entrenamiento explícito: el algoritmo simplemente memoriza el conjunto de entrenamiento completo. Para clasificar un nuevo punto x:
- Calcula la distancia de x a cada punto de entrenamiento.
- Encuentra los K puntos de entrenamiento más cercanos (el "vecindario").
- Deja que voten: gana la clase mayoritaria.
Esto se llama aprendizaje perezoso — todo el trabajo ocurre en tiempo de predicción, no en tiempo de entrenamiento.
Métricas de distancia
El voto solo es significativo si "más cercano" está bien definido. Opciones comunes:
- Euclidiana (L2): d(x, y) = √Σ(xᵢ − yᵢ)² — el default.
- Manhattan (L1): d(x, y) = Σ|xᵢ − yᵢ| — más robusta a outliers individuales; preferible para datos dispersos.
- Coseno: d(x, y) = 1 − (x · y)/(||x|| ||y||) — mide ángulo, no magnitud; popular para embeddings de texto.
El rol de K
k = 1 : Alta varianza, bajo sesgo. Frontera maximalmente flexible. k = n : Varianza cero, alto sesgo. Frontera totalmente plana. A medida que k aumenta, la frontera se suaviza. El k óptimo se encuentra por validación cruzada.
El imperativo de escalar
La distancia solo es físicamente significativa cuando las características comparten una escala común. Siempre aplica StandardScaler antes de KNN.
Python (in browser)
KNN (k=5) produce una frontera tipo Voronoi suave que sigue perfectamente las formas de luna — algo que un modelo lineal nunca podría lograr. La suavidad de la frontera está controlada completamente por k. Nota que `StandardScaler` se aplicó primero — sin él, el cálculo de distancia no tendría sentido si las dos características tuvieran rangos diferentes.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
A medida que k aumenta, la frontera se suaviza monótonamente — k alto = alto sesgo. k=1 memoriza los datos de entrenamiento perfectamente (100% de precisión de entrenamiento) pero generalizará mal. k=5 y k=25 muestran el punto óptimo práctico para este dataset.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Siempre ajusta k mediante validación cruzada, no evaluando en el conjunto de prueba. El envoltorio con `Pipeline` es crítico: ajustar el `StandardScaler` dentro de cada fold evita que la distribución del fold de validación se filtre al ajuste del scaler, lo que inflaría las puntuaciones de CV.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
En datos continuos de baja dimensión y bien escalados, la métrica de distancia rara vez cambia la precisión drásticamente. La diferencia real surge en entornos de alta dimensión o específicos del dominio: Euclidiana para imágenes, Manhattan para datos tabulares con outliers, Coseno para vectores de texto TF-IDF.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
La maldición de la dimensionalidad es la razón más importante por la que KNN falla en ML de producción. Siempre aplica reducción de dimensionalidad antes de desplegar KNN en datos de alta dimensión.
¿Por qué debes escalar las características antes de KNN?
- KNN memoriza los datos de entrenamiento; la predicción encuentra los K vecinos más cercanos por distancia y devuelve el voto mayoritario. El entrenamiento es O(1), la predicción es O(n·d).
- k pequeño = alta varianza (frontera ondulada); k grande = alto sesgo (frontera plana). Elige k por validación cruzada, siempre dentro de un Pipeline con StandardScaler.
- Siempre StandardScaler antes de KNN — las características de gran rango dominan la distancia Euclidiana y hacen que el vecindario no tenga sentido.
- KNN se degrada en alta dimensión (maldición de la dimensionalidad) — el concepto de 'vecino más cercano' pierde sentido por encima de ~50 características. Aplica PCA primero.
Sistemas de recomendación (encontrar usuarios/ítems similares); recuperación de imágenes; puntuación de outliers; clasificador de prototipo rápido antes de comprometerse con un modelo más complejo.
Si lo quitas: Perderías el clasificador no paramétrico más simple y la base conceptual de los métodos basados en similitud.