Algoritmo de vecinos m谩s cercanos en Python y Scikit-Learn

    El algoritmo de K-vecinos m谩s cercanos (KNN) es un tipo de algoritmos de Machine Learning supervisados. KNN es extremadamente f谩cil de implementar en su forma m谩s b谩sica y, sin embargo, realiza tareas de clasificaci贸n bastante complejas. Es un algoritmo de aprendizaje perezoso ya que no tiene una fase de entrenamiento especializada. M谩s bien, usa todos los datos para entrenar mientras clasifica un nuevo punto de datos o instancia. KNN es un algoritmo de aprendizaje no param茅trico, lo que significa que no asume nada sobre los datos subyacentes. Esta es una caracter铆stica extremadamente 煤til ya que la mayor铆a de los datos del mundo real realmente no siguen ning煤n supuesto te贸rico, por ejemplo, separabilidad lineal, distribuci贸n uniforme, etc.

    En este art铆culo, veremos c贸mo se puede implementar KNN con la biblioteca Scikit-Learn de Python. Pero antes de eso, exploremos primero la teor铆a detr谩s de KNN y veamos cu谩les son algunos de los pros y los contras del algoritmo.

    Teor铆a

    La intuici贸n detr谩s del algoritmo KNN es uno de los m谩s simples de todos los algoritmos de Machine Learning supervisados. Simplemente calcula la distancia de un nuevo punto de datos a todos los dem谩s puntos de datos de entrenamiento. La distancia puede ser de cualquier tipo, por ejemplo, euclidiana o Manhattan, etc. A continuaci贸n, selecciona los puntos de datos K m谩s cercanos, donde K puede ser cualquier n煤mero entero. Finalmente, asigna el punto de datos a la clase a la que pertenecen la mayor铆a de los K puntos de datos.

    Veamos este algoritmo en acci贸n con la ayuda de un ejemplo simple. Suponga que tiene un conjunto de datos con dos variables, que cuando se trazan, se parece al de la siguiente figura.

    Su tarea es clasificar un nuevo punto de datos con ‘X’ en la clase “Azul” o la clase “Roja”. Los valores de las coordenadas del punto de datos son x = 45 e y = 50. Suponga que el valor de K es 3. El algoritmo KNN comienza calculando la distancia del punto X a todos los puntos. Luego encuentra los 3 puntos m谩s cercanos con la menor distancia al punto X. Esto se muestra en la figura siguiente. Se han rodeado los tres puntos m谩s cercanos.

    El paso final del algoritmo KNN es asignar un nuevo punto a la clase a la que pertenecen la mayor铆a de los tres puntos m谩s cercanos. En la figura de arriba podemos ver que los dos de los tres puntos m谩s cercanos pertenecen a la clase “Rojo” mientras que uno pertenece a la clase “Azul”. Por lo tanto, el nuevo punto de datos se clasificar谩 como “Rojo”.

    Pros y contras de KNN

    En esta secci贸n presentaremos algunos de los pros y los contras de utilizar el algoritmo KNN.

    Pros

  • Es extremadamente f谩cil de implementar.
  • Como se dijo anteriormente, es aprendizaje perezoso algoritmo y, por lo tanto, no requiere entrenamiento antes de realizar predicciones en tiempo real. Esto hace que el algoritmo KNN sea mucho m谩s r谩pido que otros algoritmos que requieren entrenamiento, por ejemplo, SVM, regresi贸n lineal, etc.
  • Dado que el algoritmo no requiere entrenamiento antes de hacer predicciones, se pueden agregar nuevos datos sin problemas.
  • Solo hay dos par谩metros necesarios para implementar KNN, es decir, el valor de K y la funci贸n de distancia (por ejemplo, Euclidiana o Manhattan, etc.)
  • Contras

  • El algoritmo KNN no funciona bien con datos de alta dimensi贸n porque con un gran n煤mero de dimensiones, se vuelve dif铆cil para el algoritmo calcular la distancia en cada dimensi贸n.
  • El algoritmo KNN tiene un alto costo de predicci贸n para grandes conjuntos de datos. Esto se debe a que en grandes conjuntos de datos el costo de calcular la distancia entre el nuevo punto y cada punto existente es mayor.
  • Por 煤ltimo, el algoritmo KNN no funciona bien con caracter铆sticas categ贸ricas ya que es dif铆cil encontrar la distancia entre dimensiones con caracter铆sticas categ贸ricas.
  • Implementaci贸n del algoritmo KNN con Scikit-Learn

    En esta secci贸n, veremos c贸mo se puede utilizar la biblioteca Scikit-Learn de Python para implementar el algoritmo KNN en menos de 20 l铆neas de c贸digo. Las instrucciones de descarga e instalaci贸n de la biblioteca de aprendizaje Scikit est谩n disponibles en aqu铆.

    Nota: El c贸digo proporcionado en este tutorial se ha ejecutado y probado con el cuaderno Python Jupyter.

    El conjunto de datos

    Vamos a utilizar el famoso conjunto de datos de iris para nuestro ejemplo KNN. El conjunto de datos consta de cuatro atributos: ancho de s茅palo, largo de s茅palo, ancho de p茅talo y largo de p茅talo. Estos son los atributos de tipos espec铆ficos de plantas de iris. La tarea consiste en predecir la clase a la que pertenecen estas plantas. Hay tres clases en el conjunto de datos: Iris-setosa, Iris-versicolor e Iris-virginica. M谩s detalles del conjunto de datos est谩n disponibles aqu铆.

    Importaci贸n de bibliotecas

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    

    Importar el conjunto de datos

    Para importar el conjunto de datos y cargarlo en nuestro marco de datos de pandas, ejecute el siguiente c贸digo:

    url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
    
    # Assign colum names to the dataset
    names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
    
    # Read dataset to pandas dataframe
    dataset = pd.read_csv(url, names=names)
    

    Para ver c贸mo se ve realmente el conjunto de datos, ejecute el siguiente comando:

    dataset.head()
    

    Al ejecutar el script anterior, se mostrar谩n las primeras cinco filas de nuestro conjunto de datos como se muestra a continuaci贸n:

    Longitud del s茅palo Ancho del s茅palo Longitud del p茅talo Ancho del p茅talo Clase

    0

    1

    2

    3

    4

    5.13,51.40,2Iris-setosa
    4.93,01.40,2Iris-setosa
    4.73.21.30,2Iris-setosa
    4.63.11,50,2Iris-setosa
    5,03.61.40,2Iris-setosa

    Preprocesamiento

    El siguiente paso es dividir nuestro conjunto de datos en sus atributos y etiquetas. Para hacerlo, use el siguiente c贸digo:

    X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, 4].values
    

    los X variable contiene las primeras cuatro columnas del conjunto de datos (es decir, atributos) mientras y contiene las etiquetas.

    Prueba de tren dividida

    Para evitar un ajuste excesivo, dividiremos nuestro conjunto de datos en divisiones de entrenamiento y de prueba, lo que nos da una mejor idea de c贸mo se desempe帽贸 nuestro algoritmo durante la fase de prueba. De esta manera, nuestro algoritmo se prueba en datos no vistos, como lo har铆a en una aplicaci贸n de producci贸n.

    Para crear divisiones de entrenamiento y prueba, ejecute el siguiente script:

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
    

    El script anterior divide el conjunto de datos en un 80% de datos de tren y un 20% de datos de prueba. Esto significa que de un total de 150 registros, el conjunto de entrenamiento contendr谩 120 registros y el conjunto de prueba contiene 30 de esos registros.

    Escala de funciones

    Antes de realizar predicciones reales, siempre es una buena pr谩ctica escalar las caracter铆sticas para que todas puedan evaluarse de manera uniforme. Wikipedia explica el razonamiento bastante bien:

    Dado que el rango de valores de los datos sin procesar var铆a ampliamente, en algunos algoritmos de Machine Learning, las funciones objetivas no funcionar谩n correctamente sin la normalizaci贸n. Por ejemplo, la mayor铆a de los clasificadores calculan la distancia entre dos puntos por la distancia euclidiana. Si una de las caracter铆sticas tiene una amplia gama de valores, la distancia se regir谩 por esta caracter铆stica en particular. Por lo tanto, el rango de todas las caracter铆sticas debe normalizarse de modo que cada caracter铆stica contribuya aproximadamente de manera proporcional a la distancia final.

    El algoritmo de descenso de gradiente (que se utiliza en el entrenamiento de redes neuronales y otros algoritmos de Machine Learning) tambi茅n converge m谩s r谩pido con las caracter铆sticas normalizadas.

    El siguiente script realiza el escalado de caracter铆sticas:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    scaler.fit(X_train)
    
    X_train = scaler.transform(X_train)
    X_test = scaler.transform(X_test)
    

    Entrenamiento y predicciones

    Es extremadamente sencillo entrenar el algoritmo KNN y hacer predicciones con 茅l, especialmente cuando se usa Scikit-Learn.

    from sklearn.neighbors import KNeighborsClassifier
    classifier = KNeighborsClassifier(n_neighbors=5)
    classifier.fit(X_train, y_train)
    

    El primer paso es importar el KNeighborsClassifier clase de la sklearn.neighbors biblioteca. En la segunda l铆nea, esta clase se inicializa con un par谩metro, es decir n_neigbours. Este es b谩sicamente el valor de K. No hay un valor ideal para K y se selecciona despu茅s de la prueba y la evaluaci贸n; sin embargo, para empezar, 5 parece ser el valor m谩s com煤nmente utilizado para el algoritmo KNN.

    El paso final es hacer predicciones sobre nuestros datos de prueba. Para hacerlo, ejecute el siguiente script:

    y_pred = classifier.predict(X_test)
    

    Evaluar el algoritmo

    Para evaluar un algoritmo, la matriz de confusi贸n, la precisi贸n, la recuperaci贸n y la puntuaci贸n f1 son las m茅tricas m谩s utilizadas. los confusion_matrix y classification_report m茅todos del sklearn.metrics se puede utilizar para calcular estas m茅tricas. Eche un vistazo al siguiente gui贸n:

    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    

    La salida del script anterior se ve as铆:

    [[11  0  0]
       0 13  0]
       0  1  6]]
                     precision   recall   f1-score   support
    
        Iris-setosa       1.00     1.00       1.00        11
    Iris-versicolor       1.00     1.00       1.00        13
     Iris-virginica       1.00     1.00       1.00         6
    
        avg / total       1.00     1.00       1.00        30
    

    Los resultados muestran que nuestro algoritmo KNN pudo clasificar los 30 registros en el conjunto de prueba con una precisi贸n del 100%, lo cual es excelente. Aunque el algoritmo funcion贸 muy bien con este conjunto de datos, no espere los mismos resultados con todas las aplicaciones. Como se se帽al贸 anteriormente, KNN no siempre se desempe帽a tan bien con caracter铆sticas categ贸ricas o de alta dimensionalidad.

    Comparaci贸n de la tasa de error con el valor K

    En la secci贸n de entrenamiento y predicci贸n dijimos que no hay forma de saber de antemano qu茅 valor de K produce los mejores resultados en el primer intento. Elegimos aleatoriamente 5 como el valor K y resulta en una precisi贸n del 100%.

    Una forma de ayudarlo a encontrar el mejor valor de K es trazar la gr谩fica del valor de K y la tasa de error correspondiente para el conjunto de datos.

    En esta secci贸n, trazaremos el error medio de los valores predichos del conjunto de prueba para todos los valores de K entre 1 y 40.

    Para hacerlo, primero calculemos la media de error para todos los valores predichos donde K var铆a entre 1 y 40. Ejecute el siguiente script:

    error = []
    
    # Calculating error for K values between 1 and 40
    for i in range(1, 40):
        knn = KNeighborsClassifier(n_neighbors=i)
        knn.fit(X_train, y_train)
        pred_i = knn.predict(X_test)
        error.append(np.mean(pred_i != y_test))
    

    El script anterior ejecuta un ciclo de 1 a 40. En cada iteraci贸n, se calcula el error medio para los valores predichos del conjunto de prueba y el resultado se agrega al error lista.

    El siguiente paso es trazar el error valores frente a valores K. Ejecute el siguiente script para crear el gr谩fico:

    plt.figure(figsize=(12, 6))
    plt.plot(range(1, 40), error, color="red", linestyle="dashed", marker="o",
             markerfacecolor="blue", markersize=10)
    plt.title('Error Rate K Value')
    plt.xlabel('K Value')
    plt.ylabel('Mean Error')
    

    El gr谩fico de salida se ve as铆:

    De la salida podemos ver que el error medio es cero cuando el valor de K est谩 entre 5 y 18. Le aconsejar铆a que juegue con el valor de K para ver c贸mo afecta la precisi贸n de las predicciones.

    Recursos

    驴Quiere obtener m谩s informaci贸n sobre Scikit-Learn y otros algoritmos 煤tiles de Machine Learning? Recomiendo consultar algunos recursos m谩s detallados, como un curso en l铆nea:

    Si bien leer publicaciones de blog como esta es un gran comienzo, la mayor铆a de las personas generalmente aprenden mejor con las im谩genes, los recursos y las explicaciones de cursos como los vinculados anteriormente.

    Conclusi贸n

    KNN es un algoritmo de clasificaci贸n simple pero poderoso. No requiere entrenamiento para hacer predicciones, que suele ser una de las partes m谩s dif铆ciles de un algoritmo de Machine Learning. El algoritmo KNN se ha utilizado ampliamente para encontrar similitudes de documentos y reconocimiento de patrones. Tambi茅n se ha empleado para desarrollar sistemas de recomendaci贸n y para la reducci贸n de dimensionalidad y los pasos de preprocesamiento para visi贸n por computadora, en particular tareas de reconocimiento facial.

    A partir de aqu铆, le recomendar铆a que implemente el algoritmo KNN para un conjunto de datos de clasificaci贸n diferente. Var铆e el tama帽o de la prueba y del entrenamiento junto con el valor K para ver c贸mo difieren sus resultados y c贸mo puede mejorar la precisi贸n de su algoritmo. Hay disponible una buena colecci贸n de conjuntos de datos de clasificaci贸n aqu铆 para que juegues.

    驴A qu茅 otras aplicaciones ha aplicado el algoritmo KNN? 驴C贸mo te fue? 隆H谩znoslo saber en los comentarios!

    .

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *