Google+ Seguidores

miércoles, 31 de enero de 2018

Introducción al Machine Learning #9 - K Vecinos más cercanos (Clasificación y Regresión)

Introducción:

En el día de hoy, me enfocare en describir al método de los "K Vecinos más cercanos" tanto para los casos de clasificación como los de regresión.

Otra cosa que quisiera aclarar antes de comenzar, es que cuando me refiera a "K-NN", me estoy refiriendo a "K Vecinos más cercanos". K-NN es un abreviación de "K-Nearest Neighbors" ("Traducción de K Vecinos más cercanos").

Clasificación de vecinos más cercanos:

En la clasificación K-NN, el resultado es una membresía de clase. Un objeto se clasifica por el voto mayoritario de sus vecinos, asignándose el objeto a la clase más común en sus k vecinos más cercanos (k  es un numero entero positivo, típicamente pequeño). Si k=1, entonces el objeto se asigna simplemente a la clase de ese vecino más cercano.

Ahora, veamos un ejemplo sencillo:

Imagen relacionada
Figura 1.1

La imagen de arriba, nos muestra el procedimiento de clasificación que emplea el método de K-NN. 

La imagen (Figura 1.1) nos muestra un sencillo diagrama de dispersión (nube de puntos). Como pueden observar, en el diagrama existen dos tipos de clases (Clase A y Clase B). Lo que queremos, es que al ingresar un nuevo punto, este se clasifica en una de las clases (ya sea en la clase A o en la clase B). En este caso queremos utilizar al clasificador de K-NN para que haga el trabaja. Cuando ingreso un nuevo dato (estrella), K-NN empleara su procedimiento de clasificación para asignar a este dato nuevo, una clase. ¿Que procedimiento? Buscar a los vecinos más cercano y de este modo clasificar a ese dato (estrella). En la figura 1.1 se observa una variable llamada K, esta variable contiene el numero de vecinos que el clasificador debe buscar en el diagrama. Se observa que en el momento en el que k=3, se crea un tipo de circunferencia al rededor de la estrella. Dicha circunferencia encierra a los 3 puntos más próximos a la estrella. Entre estos 3 puntos, 2 de ellos son de la clase B y una pertenece a la clase A. K-nn, clasificara la estrella según el numero de vecinos más cercanos (en este caso, a la clase B). Pero se cambiamos el valor de la variable K a 6, las cosas cambian. Ya que entre sus 6 vecinos más cercanos, 4 de ellos pertenecen a la clase A, y solo 2 pertenecen a al clase B.

El método de clasificación de K-NN es realmente muy sencillo. Es usado para para problemas que nos requieran de muchos datos, ya que que K-NN tiene sus limitaciones. Como que es muy sensible a los atributos irrelevantes, muy sensible al ruido y es lento si hay muchos datos de entrenamiento (en almacenamiento y en tiempo). Así que debemos de tener bien en claro esto, para tomar una decisión más favorable.

Bueno, ¿Que les pareció la explicación? Hasta ahora, es todo lo que debemos saber sobre la clasificación de K-NN. Por supuesto, hay muchas otras cosas, que explicare en su debido tiempo.

Perfecto, es momento de un ejemplo. El ejemplo de hoy lo aplicaremos usando el lenguaje de Programación Python y la librería Scikit-Learn. Scikit- Learn dos clasificadores de vecinos más cercanos: KNeighborsClassifier, implementa el aprendizaje basado en los K vecinos más cercano de cada punto de consulta, donde K puede ser especificado por el usuario. También tenemos al RadiusNeighborsClassifier, el cual implementa el aprendizaje basado en el número de vecinos dentro de un radio fijo r de cada punto de entrenamiento, donde r es un valor de coma flotante especificado por el usuario.

El clasificador KNeighborsClassifier es el más comúnmente utilizada de las dos técnicas. Veamos un ejemplo:

from sklearn.neighbors import KNeighborsClassifier #Importamos al método 
from sklearn.datasets import load_iris #Importamos el conjunto de datos
from sklearn.model_selection import train_test_split 

iris = load_iris() #Guardamos el conjunto de datos Iris en una variable

#Dividimos nuestros datos en "conjunto de entrenamiento y de prueba
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target) 

knn = KNeighborsClassifier(n_neighbors=5) #Declaramos al método

knn.fit(x_train, y_train) #Ajustamos a al método

knn.score(x_test, y_test) # El porcentaje de acertamiento del método
Out[1]:
0.97368421052631582

En el ejemplo anterior, lo que hacemos es entrenar a un clasificador con el conjunto de datos iris (discutido en artículos anteriores). Como pueden observar, al momento de declara al clasificador (knn = KNeighborsClassifier(n_neighbors=5)), le asignamos mediante el atributo "n_neighbors", el numero de vecinos que el clasificador tendrá en cuenta al momento de clasificar nuevos datos sin etiquetas.

Luego de entrenar al clasificador con el metodo "fit", utilizamos el método "score" para determinar el porcentaje que el clasificador acerto tratando de clasificar los datos de prueba.

Regresión de vecinos más cercanos:

La regresión es un proceso que trata de estimar la relación entre dos variables (La variable independiente y la dependiente). En los problemas de regresión, tratamos de predecir un valor continuo, ejemplo: Dado el tamaño de una casa, predecir su precio (valor real). 

Más específicamente, la regresión nos ayuda a entender como el valor de la variable dependiente varia al cambiar una de las variables independientes.


Mientras que en la clasificación se trata de predecir valores discretos para Y (Ej: 1,2,3 y 4), en la regresión se predicen valores continuos (Ej: 222.6, 434.87, 300, 587 ...). 

Puedes leer más acerca de los problemas de Regresión ingresando al siguiente enlace: http://www.pythondiario.com/2018/01/introduccion-al-machine-learning-8.html.

La regresión basada en vecinos se pueden usar en casos en donde las etiquetas de datos son variables continuas en lugar de discretas. 

Mientras que en la clasificación se trata de predecir valores discretos para Y (Ej: 1,2,3 y 4), en la regresión se predicen valores continuos (Ej: 222.6, 434.87, 300, 587 ...)

Ahora, realicemos un ejemplo con Python y Scikit-Learn.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import neighbors

# Generamos los datos
np.random.seed(0)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
T = np.linspace(0, 5, 500)[:, np.newaxis]
y = np.sin(X).ravel()

y[::5] += 1 * (0.5 - np.random.rand(8))

n_neighbors = 5 #Definimos el numero de vecinos que utilizaremos

for i, weights in enumerate(['uniform', 'distance']):
    knn = neighbors.KNeighborsRegressor(n_neighbors, weights=weights) # Definimos al regresor
    y_ = knn.fit(X, y).predict(T) # Lo entrenamos

    # Graficamos los resultados
    plt.subplot(2, 1, i + 1)
    plt.scatter(X, y, c='k', label='data')
    plt.plot(T, y_, c='g', label='prediction')
    plt.axis('tight')
    plt.legend()
    plt.title("KNeighborsRegressor (k = %i, weights = '%s')" % (n_neighbors,
                                                                weights))

plt.show # Mostramos la grafica en pantalla
Out[3]:
<function matplotlib.pyplot.show>


El ejemplo anterior, es una prueba de "KNeighborsRegressor". Como pueden observar, el resultado son 2 gráficas, esto por que en una al modelo se entrena con el atributo 'uniform' y al otros con el atributo 'distance'.

El método de KNN, es comúnmente usado para la clasificación, así que al momento de realizar regresión, KNN no sera tu primera opción.

Puedes leer más acerca de la clasificación y regresión viendo los siguientes artículos:

  1. http://www.pythondiario.com/2018/01/introduccion-al-machine-learning-7-los.html
  2. http://www.pythondiario.com/2018/01/introduccion-al-machine-learning-8.html
  3. http://scikit-learn.org/stable/modules/neighbors.html#classification
Dirígete a mi repositorio y ve todos los ejemplos presentados en este articulo: https://github.com/LuisAlejandroSalcedo/Pruebas_de_Machine_Learning_ScikitLearn.

Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.

No hay comentarios :
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Powered by Blogger .