K-nearest neighbors (KNN) en Python

K-Nearest Neighbors (KNN) es un algoritmo de aprendizaje automático supervisado que se utiliza para tareas de clasificación y regresión. También se utiliza con frecuencia en la imputación de valores faltantes. El principio en el que se basa es que las observaciones más cercanas a un punto de datos dado son las más «similares» en un conjunto de datos, y, por lo tanto, podemos clasificar puntos no previstos en función de los valores de los puntos existentes más cercanos. El usuario puede elegir el valor de K, que representa el número de observaciones cercanas a usar en el algoritmo.


KNN en Python

Comencemos por visualizar algunos puntos de datos:

import matplotlib.pyplot as plt

x = [2, 3, 5, 7, 8, 10, 12, 15, 18, 20]
y = [15, 12, 18, 25, 22, 30, 28, 32, 35, 40]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]

plt.scatter(x, y, c=classes)
plt.show()

Resultado:

KNN en Pyhton

Ahora ajustamos el algoritmo KNN con K=1:

from sklearn.neighbors import KNeighborsClassifier

data = list(zip(x, y))
knn = KNeighborsClassifier(n_neighbors=1)

knn.fit(data, classes)

Y lo usamos para clasificar un nuevo punto de datos:

new_x = 9
new_y = 28
new_point = [(new_x, new_y)]

prediction = knn.predict(new_point)

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"Nuevo punto, clase: {prediction[0]}")
plt.show()

Ahora hacemos lo mismo, pero con un valor de K más alto que cambia la predicción:

knn = KNeighborsClassifier(n_neighbors=5)

knn.fit(data, classes)

prediction = knn.predict(new_point)

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"Nuevo punto, clase: {prediction[0]}")
plt.show()

Ejemplo completo de KNN en Python

import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

# Datos de ejemplo
x = [2, 3, 5, 7, 8, 10, 12, 15, 18, 20]
y = [15, 12, 18, 25, 22, 30, 28, 32, 35, 40]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]

# Visualizar los datos
plt.scatter(x, y, c=classes)
plt.show()

# Crear un modelo KNN con K=1
data = list(zip(x, y))
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data, classes)

# Clasificar un nuevo punto
new_x = 9
new_y = 28
new_point = [(new_x, new_y)]
prediction = knn.predict(new_point)

# Visualizar el resultado
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"Nuevo punto, clase: {prediction[0]}")
plt.show()

# Cambiar el valor de K a 5
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(data, classes)
prediction = knn.predict(new_point)

# Visualizar el nuevo resultado
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"Nuevo punto, clase: {prediction[0]}")
plt.show()

Resultado:

ejemplo KNN en Pyhton

Explicación del Ejemplo

1.Importar Librerías:

  • Importamos las librerías necesarias, que incluyen Matplotlib para visualización y scikit-learn para KNN.

2. Datos de Ejemplo:

  • Definimos dos listas, x e y, que representan las coordenadas x e y de puntos en un espacio bidimensional.
  • classes es una lista que asigna una clase (0 o 1) a cada punto. En este ejemplo, estamos trabajando en un problema de clasificación binaria.

3. Visualización de Datos:

  • Usamos Matplotlib para crear un gráfico de dispersión que muestra los puntos en el espacio bidimensional. Los puntos se colorean según su clase.

4. Creación del Modelo KNN (K=1):

  • Creamos un modelo KNN con n_neighbors=1, lo que significa que solo se considerará el punto más cercano para hacer predicciones.
  • Ajustamos (entrenamos) el modelo KNN con nuestros datos de ejemplo utilizando knn.fit(data, classes).

5. Clasificación de un Nuevo Punto:

  • Creamos un nuevo punto (new_x, new_y) que deseamos clasificar.
  • Usamos el modelo KNN entrenado para predecir la clase del nuevo punto con knn.predict(new_point).

6. Visualización de Resultados (K=1):

  • Visualizamos el nuevo punto junto con los puntos existentes, coloreando el nuevo punto según su clase predicha. También mostramos un texto con la clase predicha.

7. Cambio del Valor de K (K=5):

  • Creamos un nuevo modelo KNN con n_neighbors=5, lo que significa que consideraremos los 5 puntos más cercanos para hacer predicciones.
  • Ajustamos el nuevo modelo KNN con nuestros datos de ejemplo.
  • Volvemos a clasificar el mismo nuevo punto con el nuevo modelo.

8. Visualización de Resultados (K=5):

  • Visualizamos nuevamente el nuevo punto junto con los puntos existentes, pero esta vez con un valor de K más grande.
  • La clase predicha puede cambiar debido a la inclusión de más puntos cercanos en la decisión.