🧠 ¿Qué es K-NN?
K-NN significa K Vecinos Más Cercanos. Es un algoritmo de clasificación (y también puede hacer regresión) que no aprende nada durante el entrenamiento. En lugar de eso, cuando le das un dato nuevo, simplemente mira a su alrededor y se basa en los «vecinos» más cercanos para decidir qué clase asignarle.
Como cuando no sabes qué hacer y miras lo que hacen tus amigos 😄
Si la mayoría de ellos vota por una opción, tú también lo haces.
🔍 ¿Cómo funciona?
- Eliges un número K (cuántos vecinos mirar).
- Para un nuevo dato, calcula su distancia con todos los puntos del entrenamiento (por lo general, distancia euclidiana).
- Selecciona los K puntos más cercanos.
- Mira a qué clase pertenecen y elige la más frecuente (en clasificación) o el promedio (en regresión).
📦 Ejemplo práctico
Supón que estás en una nueva ciudad y quieres saber si un restaurante es bueno. ¿Qué haces?
- Miras los 5 más cercanos (K=5).
- Si 3 de esos 5 tienen buena puntuación (por ejemplo, estrellas), entonces asumes que ese lugar probablemente también es bueno.
⚙️ Parámetro clave: K
- Si K es muy pequeño (ej: K=1), el modelo puede ser muy sensible al ruido.
- Si K es muy grande (ej: K=20), puede ignorar diferencias importantes.
Un buen valor suele estar entre 3 y 10, pero se puede probar con varios y elegir el mejor.
📈 Ventajas
✅ Súper fácil de entender
✅ No hace suposiciones sobre los datos
✅ Puede ser muy preciso si se elige bien K
✅ Funciona con múltiples clases
🚨 Desventajas
❌ Muy lento con datasets grandes (tiene que calcular muchas distancias)
❌ No se lleva bien con muchas columnas irrelevantes
❌ Requiere escalar las variables (estandarizar), o distancias raras arruinan el resultado
❌ Sensible a valores atípicos (outliers)
🧑💻 Código en Python
andas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
# Datos de ejemplo
data = pd.DataFrame({
'edad': [25, 45, 35, 33, 52, 23, 41, 38],
'ingresos': [50000, 80000, 60000, 58000, 120000, 45000, 70000, 64000],
'compra': [0, 1, 0, 0, 1, 0, 1, 1]
})
X = data[['edad', 'ingresos']]
y = data['compra']
# Escalar datos
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Dividir
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.25, random_state=42)
# Modelo KNN
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# Predicción
y_pred = knn.predict(X_test)
# Evaluación
print("Precisión:", accuracy_score(y_test, y_pred))
📊 ¿Cómo saber qué valor de K usar?
Puedes probar con varios valores de K (ej. del 1 al 20) y medir cuál da mejor precisión. Eso se llama validación cruzada.
🧩 En resumen
Concepto | Valor |
---|---|
Tipo de modelo | Supervisado, basado en distancia |
Aprende durante training | No (lazy learner) |
Bueno para | Clasificación simple |
Requiere normalización | Sí |
Interpretabilidad | Alta (tipo «voto de vecinos») |