Está en la página 1de 9

Clasificador KNN

Presentado para:
Cesar Rodríguez

Presentado por:
James Ronaldo Benavides Garzón

Jeisson Daniel Rodríguez

Universidad de La Salle

Bogotá, Colombia

2021
Planteamiento

Un sistema de clasificación trata de clasificar ejemplos o instancias representados por


una serie de características o atributos en diferentes clases o categorías, las cuales son
valores discretos. En el ´ámbito del aprendizaje automático, el objetivo de estos sistemas
es aprender a decidir cuál es la clase a la que pertenecen los ejemplos nuevos sin
etiquetar. Existen dos tipos clasificación:

• Clasificación supervisada: Los sistemas de clasificación supervisados son aquellos en


los que, a partir de un conjunto de ejemplos clasificados (conjunto de entrenamiento),
es decir, etiquetados previamente, asignamos una clasificación a nuevos ejemplos.
En la Figura 1, podemos ver que los ejemplos con los que entrenamos el clasificador
ya se encuentran etiquetados con las distintas clases (clase 1, clase 2, clase N), y
ante una nueva instancia, el clasificador le asigna una de esas clases. Una aplicación
de la clasificación supervisada es el diagnóstico de enfermedades, y un ejemplo
concreto es la clasificación de tumores, en donde la nueva muestra consta de distintas
mediciones realizadas a un paciente, como la anchura y altura del tumor, y las
etiquetas en las que se clasifican los ejemplos son la clase benigno y la clase maligno.

Ilustración 1 Clasificación supervisada

• Clasificación no supervisada: Los sistemas de clasificación no supervisados son


aquellos en los que no disponemos de ejemplos clasificados, es decir, no etiquetados
previamente, sino que únicamente, a partir de sus propiedades, los agrupamos
(clustering) segunda su similitud. En la Figura 2, vemos como los ejemplos que
disponemos no se encuentras clasificados, y es tras el proceso de agrupamiento
cuando los ejemplos quedan clasificados, de tal forma que datos que pertenecen al
mismo grupo son similares, y datos que pertenecen a diferentes grupos son diferentes.
Este proceso no clasifica a nuevas instancias, sino que simplemente agrupa a los
ejemplos según su similitud. En muchas ocasiones no disponemos de datos
etiquetados, pero resulta interesante dividirlos en grupos con el mismo significado. La
clasificación no supervisada se emplea en el análisis de información genética, en la
que se obtiene grupos de genes con funciones similares.
Ilustración 2 Clasificación no supervisada.

Clasificador k-vecinos más cercanos

El algoritmo los k-vecinos más cercanos (kNN) es un algoritmo simple y de alto


rendimiento de clasificación supervisada. kNN pertenece al paradigma perezoso de
aprendizaje (lazy learning), donde el trabajo se retrasa todo lo posible, ya que no se
construye ningún modelo. El modelo son los propios datos o conjunto de entrenamiento,
y se trabaja cuando llega un nuevo ejemplo a clasificar. Aunque kNN es una técnica
simple, ha demostrado ser uno de los algoritmos más efectivos en la Minería de Datos
(está considerado uno de los 10 algoritmos más importantes de la Minería de Datos [2]).
El algoritmo kNN se basa en el cálculo de distancias entre el ejemplo a clasificar y un
grupo de k ejemplos del conjunto de entrenamiento. Dichos ejemplos son los que se
encuentran más próximos al ejemplo que queremos clasificar, de modo que lo
clasificamos según las clases a las que pertenezcan los k ejemplos obtenidos.

Número de vecinos más cercanos:

Ilustración 3 Impacto del parámetro K en KNN


En cuanto al número de vecinos más cercanos, valor de k, como se observa en la Figura
el clasificador resultara sensible al ruido si este es muy pequeño. En cambio, kNN es
robusto frente al ruido cuando se utilizan valores de k moderados, y si es muy grande, el
vecindario puede incluir ejemplos de otras clases
Clasificación del nuevo ejemplo a partir de las clases de su vecindario:

Otra de las cuestiones para tener en cuenta es como realizar la agregación final del
algoritmo. Esta agregación puede llevarse a cabo a través del voto simple, en el que cada
clase de los k ejemplos seleccionados tiene el mismo valor, por lo que se clasifica al nuevo
ejemplo en la clase más frecuente. También la agregación final puede llevarse a cabo a
través de la agregación de las distancias de los k ejemplos seleccionados agrupados por
las clases, por lo que se clasifica al nuevo ejemplo en la clase cuyo valor agregado sea el
menor. En el caso de este proyecto aplicaremos el voto simple. Por último, se debe definir
la clasificación del nuevo ejemplo cuando existe un empate en el número de clases
mayoritarias de los k vecinos más cercanos. En esta situación, se puede clasificar al
nuevo ejemplo escogiendo al azar una de las clases mayoritarias, una por defecto o la
clase cuyo ejemplo esté más cerca del ejemplo a clasificar. En el caso de este proyecto
aplicaremos la segunda opción, escogeremos la clase mías pequeña.

El algoritmo completo del clasificador k-vecinos más cercanos se presenta en el siguiente


Algoritmo.

Características KNN

• KNN es local: asume que la clase de un dato depende sólo de los k vecinos más
cercanos (no se construye un modelo global)
• No necesita adaptación para más de dos clases (a diferencia de clasificadores lineales)
• Si se quiere hace regresión, calcular la media de los k vecinos
• Es sencillo
Problemas / limitaciones KNN

• Muy sensible a los atributos irrelevantes y la maldición de la dimensionalidad


• Muy sensible al ruido
• Lento, si hay muchos datos de entrenamiento (O(n*d) en almacenamiento y en tiempo)
• Depende de que la función de distancia sea la adecuada

Atributos irrelevantes

Metodología

Teniendo una base de datos de números entre 0 y 9 con 10.000 muestras poder generar
un algoritmo para hacer reconocimiento utilizando el método de knn.
Se implementan las diferentes librerías para poder hacer diferentes operaciones
aritméticas, poder extraer información de la base de datos y un algoritmo para entrenar.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from io import open
import scipy.io as sio
train_label='/content/drive/MyDrive/Semestre 10/Machine
Learning/Laboratorio/Trainnumbers_label.csv'
train_img='/content/drive/MyDrive/Semestre 10/Machine
Learning/Laboratorio/Trainnumbers_image.csv'
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

Se extrae la base de datos por medio de la librería pandas y algunos argumentos como
añadir una enumeración tanto en filas como columnas.

i = pd.read_csv(train_img, index_col=None, header=None)


l = pd.read_csv(train_label, header=None)
Para poder realizar operaciones aritméticas y poder extraer la información de la tabla se
utiliza la libreria numpy donde se pasa la matriz de la imagen de 784 x 10000 y un vector
donde concuerdan los números de la imagen que van del 0 al 9.

inp = np.array(i)
lnp = np.array(l)

Se realiza la media de la matriz de la imagen y se le aplica la transpuesta por los


parámetros que recibe la función mean() donde devolverá la media de las muestras y
necesitamos la media de los pixeles por lo tanto se le aplica la transpuesta para obtener
un vector fila de 784 y se realiza la misma operacion con la desviación estándar y se
obtiene el siguiente código:
meant = np.transpose(np.mean(np.transpose(inp), axis=0))
stdt = np.transpose(np.std(np.transpose(inp), axis=0))
Teniendo los valores de la media y la desviación estándar se puede normalizar los puntos
de la imagen, obtener un punto central para las muestras y obtener nuevamente la matriz
784 x 10000
pn = np.zeros([784,10000])
forma = inp.shape
for i in range(forma[1]):
pn[:,i]=(inp[:,i]-meant)/stdt
Se le pasa la librería para poder aplicar vectores propios con el fin de obtener la mayor
distancia que hay entre pixeles comparando uno a uno por medio de la covarianza y
aplicando la función eig() obtenemos la variable Diag un vector de 784 con los valores de
las distancias entre píxeles y transMatcn obtiene la matriz de 784 x 10000
from numpy import linalg as LA
transMatcn = np.zeros([784,784])
Diag = np.zeros([784,784])
a = np.cov(pn)
Diag, transMatcn = LA.eig(a)
Teniendo los datos casi preparados se puede generar un cambio de dimensiones pasar
de 784 dimensiones a 3, 10 o 30 depende de la necesidad y de los resultados obtenidos
para poder obtener un clasificador relativamente robusto, el número de dimensiones
depende de ncompca.
ncompca = 3
transMat = np.zeros([ncompca,784])
D, N = inp.shape
for i in range(ncompca):
transMat[i,:] = np.transpose(transMatcn[:,i])
Para obtener la función de muestras con respecto a las dimensiones se debe hacer una
multiplicación de matrices donde se obtiene como resultado una matriz del número de
filas de la primera matriz por el número de columnas de la segunda matriz.
ProyPointsn=np.dot(transMat,pn)
Ya obteniendo los datos necesarios para clasificar dependiendo de cada una de las
dimensiones que se requieran, se realiza el clasificador de números donde requiere 1
entrada, 1 salida, el número de muestras de entreno, el número de muestras de testeo,
en este caso las entradas son las dimensiones por la cantidad de muestras y la salida es
el número que obtendremos, esto devuelve los parámetros de x_train, x_test, y_train,
y_test.
knn_variable recibe el número de vecinos que se quiere utilizar, se le pasan los
parámetros de entrenamiento como lo son x_train, y_train; pasandole el nombre de la
variable que se utilizó y la función score que hace parte del clasificador “knn” podemos
obtener el resultado conforme a los parámetros entrenados, dando estos en un rango de
0 a 1 por ser un porcentaje de acierto.
X_train, X_test, y_train, y_test =
train_test_split(np.transpose(ProyPointsn), np.transpose(lnp),
random_state=0)
knn_variable = KNeighborsClassifier(n_neighbors=3);
knn_variable.fit(X_train, y_train)
knn_acierto = knn_variable.predict(X_test)
knn_eficiencia = np.mean(knn_acierto==y_test)
print("Entrenamiento: ", knn_variable.score(X_train,y_train))
print("Testeo: ", knn_variable.score(X_test,y_test)*100)

Resultados
Aplicando el algoritmo de para observar el comportamiento que tuvieron desde 3 a 13
dimensiones se obtuvieron los siguientes resultados
print(pp.shape)
plt.bar(pp[0,:],pp[1,:])
plt.xscale('log')
plt.xlabel('PCA')
plt.ylabel('Rendimiento %')
plt.show()

En la siguiente figura se observa que se obtuvieron buenos resultados de las PCA


mayores a 13 donde analizando cada una de las dimensiones, la PCA número 20 obtuvo
un pico en porcentaje y al aumentar la cantidad de PCA hasta el número máximo de
dimensiones (784) desciende a un valor que oscila entre 80% y 90%, siendo estas
características no influyentes en el clasificador

Figura PCA VS Rendimiento


Fuente: Autor
En la siguiente imagen se observa el rendimiento del clasificador utilizando 10 PCA y
variando el número de muestras a entrenar donde se tomó un rango de 5% hasta 65%
de entreno y se observa que el número de entrenos disminuye a medida que aumenta el
porcentaje de datos, por lo tanto, es más eficiente utilizar el valor por defecto de 25% de
entreno y obtener buenos resultados del clasificador “KNN”
Figura % de test a entrenar VS Rendimiento
Fuente: Autor

Se realizó el análisis comparando el número de vecinos con el rendimiento manteniendo


el número de PCA=10, al tener un número muy pequeño de vecinos cercanos el
clasificador se vuelve muy sensible a los cambios que tenga este por lo tanto se observa
en la siguiente imagen a medida que crecen los K vecinos se vuelve más eficiente el
sistema, pero llega a un punto máximo donde empieza a descender este rendimiento y
no es lo mejor tener muchos vecinos ya que al estar a un radio tan lejos las distancias
serán muy mínimas y no reconocerá el verdadero valor por lo tanto se utiliza 10 vecinos
es un valor eficiente en cuanto al número de dimensiones.

Figura K vecinos cercanos VS Rendimiento


Fuente: Autor

Conclusiones

• El número de dimensiones de las imágenes en este caso se comportan como


características que entre mayor sea su valor, abran características que no aportaran
al clasificador y por lo tanto perderá rendimiento, en este caso el 3% de las
dimensiones muestra el número de características que tienen mejor rendimiento.
• El clasificador knn ha demostrado ser uno de los más fáciles de utilizar, pero a la vez
uno de los más robustos.
• El clasificador al tener menor cantidad de números vecinos se convierte en un sistema
muy sensible por lo tanto se debe hacer un muestreo para obtener el mejor
rendimiento.
• El knn cuenta con variedad de aplicaciones como en este caso reconocimiento de
imágenes y objetos, genética, pronosticadores económicos que su muestra no
sobrepasa el millón de muestras, para tener un rendimiento eficiente y rápido.

Bibliografía

• Zapata-Tapasco, A., Mora-Flórez, J., & Pérez-Londoño, S. (2014). Metodología híbrida basada
en el regresor knn y el clasificador boosting para localizar fallas en sistemas de
distribución. Ingeniería y Competitividad, 16(2), 165-177.
• Salcedo-Campos, F. J., Dıaz-Verdejo, J. E., & Garcıa-Teodoro, P. Evaluacion de la
configuracion de clasificadores KNN para la deteccion de flujos P2P.
• Mur, R. A. Clasificadores Knn-I.

También podría gustarte