Clasificación de Datos con Algoritmo K-Nearest Neighbors
Resumen
¿Qué es el algoritmo K-Nearest Neighbors?
El algoritmo K-Nearest Neighbors (KNN) es uno de los modelos más importantes y antiguos en el ámbito del machine learning. Este algoritmo se utiliza principalmente para la clasificación de objetos o vectores de datos cuyos grupos o categorías no son conocidos. KNN parte de una clasificación previa y busca encontrar la clase o etiqueta de un nuevo objeto basándose en su proximidad a otros puntos de datos clasificados.
¿Cómo funciona la clasificación en KNN?
La clave del K-Nearest Neighbors reside en el valor 'K', que representa el número de vecinos más cercanos utilizados para determinar la clasificación de un nuevo punto de datos. En resumen:
Votación por números: Se toma la mayoría de los 'K' vecinos para decidir a qué grupo pertenece el nuevo punto de datos. Por ejemplo, si K=5, el grupo con al menos 3 votos se adjudicará el nuevo punto de datos.
Este algoritmo es sencillo de implementar y tiene aplicaciones en diversos campos como finanzas y medicina. Sin embargo, es importante considerar las posibles complicaciones al usar un valor par para 'K', ya que puede llevar a votaciones empatadas.
¿Cuáles son las limitaciones del algoritmo KNN?
Aunque KNN es un algoritmo poderoso y fácil de comprender, presenta algunos desafíos, especialmente relacionados con los costos computacionales:
Costos computacionales: A medida que el tamaño del dataset aumenta, el cálculo de las distancias para clasificar cada nuevo punto se vuelve intensivo en recursos computacionales. Para mitigar este problema, se recomienda utilizar una muestra representativa y aleatoria del dataset original.
¿Cómo se puede aplicar KNN a ejemplos prácticos?
Supongamos que queremos clasificar un punto de datos desconocido perteneciente a un universo ficticio como 'Dothraki' o 'Westerosi'.
Dothraki: Generalmente musculosos, nómadas, y guerreros que dependen de sus habilidades físicas.
Westerosi: Menos musculosos, no nómadas, confían en armaduras pesadas.
Usando KNN, podemos graficar estos grupos basado en características como musculatura y uso de armadura. Posteriormente, aplicamos el algoritmo para decidir la clasificación del nuevo punto de datos en función de sus cinco vecinos más cercanos.
¿Cómo se visualiza el proceso de KNN?
Para simplificar, imaginemos un gráfico con dos grupos clasificados: Dothraki y Westerosi.
Determinación del punto a clasificar: Escogemos un nuevo punto y calculamos sus distancias a los vecinos más cercanos.
Votación de clasificación: Contamos los vecinos pertenecientes a cada grupo y utilizamos mayoría simple para decidir la clasificación.
Resultado: El nuevo punto se asigna al grupo predominante entre sus vecinos más cercanos.
El algoritmo de K-Nearest Neighbors es intuitivo y poderoso, pero exige una comprensión clara de su funcionamiento y limitaciones. Su fuerza reside en su capacidad para adaptarse a diferentes problemas de clasificación sin necesidad de complejas fórmulas matemáticas.
¡Te animamos a que compartas tus dudas, inquietudes y avances en los comentarios y continúes explorando el emocionante mundo del machine learning!
Muchas Gracias, siempre se aprecian las ayudas visuales.
Qué crack!! Gracias @watchengel
Excelente aporte! :D
Que genial! muy claro, te pasaste!
La solución que aplicaría en caso de tener un K par y que mi punto tuviera igual cantidad de vecinos de un grupo y otro, sería buscar la distancia menor entre algún punto de estos dos grupos y mi punto, para desempatar
No creo que esa consideración sea fuerte debido a que un solo elemento determinaría el desempate . Es osea 1 vs 1 . Si escoges un k-impar el desempate en el peor de los casos se determinará por 2 elementos . osea un 2 vs 1 . Nose si me logré entender .
Pienso que si tuviera un k par != 2 y hubiera un empate en ambos lado con respecto la cantidad, ejemplo 6
a = 3 b = 3
Si en promedio están más los los a ganaría los a. Ojo en promedio
Ejemplo aplicado (K-nearest neighbor y distancia euclidiana)
function distancia =dist_euclidiana(nuevo, mejor_vendido) dim =size(nuevo,2); distancia =0;fori=1: dim
distancia +=(nuevo(i)-mejor_vendido(i))^2;end distancia =sqrt(distancia);end
Si tuviera una K par, pondria como excepción que de tener vecinos X e Y iguales, buscara otro vecino mas cercano.
Me gustó ese enfoque, el “desempate”. Y los requerimientos no serán mucho mayores 🙌🏻🙌🏻
Hola, hice un código en cuál clarifiqué 6 productos por su calidad y precio, el usuario puede ingresar un nuevo producto y algoritmo responderá si es "costoso" o "calidoso" de acuerdo a los datos que ya tenía. Finalmente serán graficados los puntos en Bokeh. (Re-alimentación bienvenida!)
importmathfrom bokeh.ioimport output_notebook, show
from bokeh.plottingimport figure
def welcome():print('Welcome to the K-Nearest neighbors code implementation')print(f'{"+"*54}') calidad =int(input("Ingrese la calidad del producto en una escala de 1 a 10: ")) precio =int(input("Ingrese el precio del producto en una escala de 1 a 10: ")) k =int(input('Ingrese el número de vecinos que desea comparar (Impar menor de 6): '))print(f'El precio ingresado:{precio} con calidad:{calidad}')return calidad, precio, k
def graficar(DATOS,calidad,precio): x_values =[] y_values =[] p =figure(title='Relacion precio calidad', x_axis_label='Calidad', y_axis_label='Precio')for key inDATOS: x_values.append(key[0]) y_values.append(key[1]) p.circle(x_values, y_values, size=15, line_color="navy", fill_color="red", fill_alpha=0.5,legend_label="Datos Clasificados",) p.circle(calidad, precio, size=15, line_color="navy", fill_color="blue", fill_alpha=0.5,legend_label="Dato usuario",)show(p)def vecinos(DATOS,distancias,k,keys): indices_vecino_mas_cercanos =[] contador_costoso =0 contador_calidad =0 #Ordena la lista para conocer las distancias cortas
distancias_ordenadas =list(sorted(distancias)) #Unicamente evalua los vecinos que el usuario desea comparar, encontrando a que par de coordenadas corresponen las distancias pequeñasfor i inrange(k): value = distancias_ordenadas[i] indices_vecino_mas_cercanos.append(distancias.index(value)) #Recorre los pares coordenados que están más cerca para ver si son costosos y calidosos
for i inindices_vecino_mas_cercanos: tag = keys[i]print(f'Vecino cercano: {tag} ')ifDATOS[tag]=='costoso': contador_costoso +=1else: contador_calidad +=1if contador_calidad > contador_costoso:print('Su producto es calidoso') elif contador_calidad < contador_costoso:print('Su producto es costoso')else:print('Su producto no pudo ser calificado')def calculo_distancia(DATOS,calidad,precio): distancias =[] keys =[]for key inDATOS: tuples =(key[0]),(key[1]) keys.append(tuples) distancia = math.sqrt((calidad - key[0])**2+(precio - key[1])**2) distancias.append(distancia)return distancias ,keys
if __name__ =="__main__": #Pide al usuario su opinión sobre el precio y la calidad del producto a evaluar, también el número de vecinos con que desea comparar.calidad, precio, k =welcome()DATOS={(2,5):'costoso',(1,4):'costoso',(2,6):'costoso',(5,1):'calidad',(6,3):'calidad',(4,1):'calidad',} #Calcula las distancias con respecto a todos los puntos, devuelve arreglo de distantancias y arreglo con las coordenas de los productos ya clasificados
distancias, keys =calculo_distancia(DATOS,calidad,precio)vecinos(DATOS,distancias,k,keys)graficar(DATOS,calidad,precio)
El problema de_ k = par_ es que puede salir que la mitad de vecinos cercanos es de un grupo X y la mitad de vecinos cercanos de un grupo Y
Pienso que partiendo de cero se podría usar un algoritmo de clustering con un muestra significativa para definir los grupos y luego usar este algoritmo de clasificación para ir anexando nuevos puntos a los grupos definidos anteriormente.
Clasificación K-nearest neighbors.
Es uno de los algoritmos mas importante y mas antiguos 👴🏽.
Parte del supuesto de que ya tenemos algún conjunto de datos clasificados y queremos encontrar la clasificación de un vector nuevo.
La K se refiere a la cantidad de vecinos que usaremos para clasificar a dicho vector. Se observa a que clase pertenece la mayoría de los k puntos mas cercanos. Es importante determinar el valor de K ❣️.
Debemos tener cuidado con usar K par ya que puede suceder que toquen K/2 votos para dos clases y no se puede determinar a cual pertenece 😟. Si pasa eso, podemos aumentar el valor de K.
!
Es muy costoso computacionalmente y no sirve para altas dimensiones 🔬 pero nuevamente, se puede hacer una muestra 😃.
Siempre es importante determinar los elementos que contiene el feature vectors, las cuales tienen que representar a los elementos 🔥.
Desde mi punto de vista para k par, seguiría tomando para ese caso el siguiente vecino más cercano hasta realizar un desempate, y claro está se clasificaría con el grupo que mayor vecinos tenga.
Como elijo el valor de "K"
Hola
El valor óptimo de K se debe elegir con base en el "ruido" que este genere en el modelo, normalmente se una el método de el arco para determinar el número adecuado, ese número adecuado normalmente es aquel valor que minimiza el error, aquí te dejo una imagen que es bastante sencilla de entender
!Método del arco para la selección de K
Saludos y mucho éxito, espero te haya podido ayudar
Para determinar el número óptimo de clusters que se pueden tener en una muestra de datos, existen varios métodos prácticos tanto formales como gráficos que se pueden utilizar, pero una de las técnicas más comunes y robustas, es el método del codo.
El método del codo se basa en la suma de los cuadrados de las distancias de cada elemento de datos con su centroide correspondiente y se denota de la siguiente manera:
Donde WCSS es la suma de los cuadrados de las distancias y se refiere a Within-Cluster-Sum-of-Squares, Yi es el centroide del elemento o dato Xi y n el total de datos en la muestra.
El proceso se lleva a cabo iniciando con un solo cluster para todos los elementos de la muestra y se obtiene la suma de todas las distancia de cada elemento con el centroide, posteriormente se crean dos centroides y se suman los elementos más cercanos a cada uno de los centroides para sumar las distancias de cada elemento con su centroide correspondiente. El proceso se repite para 3, 4, 5 … n centroides. Cuando el número de centroides es igual a la cantidad de datos de la muestra (n), las distancias son cero, dado que cada elemento es un centroide.
Clasificación K-nearest neighbors:
Ventaja:
Sencillo de aprender e implementar.
Desventaja:
Utiliza todo el dataset para entrenar cada punto.
Requiere mucha memoria y CPU.
Para mí un K par debe sumar las distancias de los dos grupos y la distancia menor es el cluster que pertenece
¿Qué pasaría si es que por ejemplo tuviéramos 3 grupos (A,B,C) y tuviéramos un valor de "k" de 8 y resulta que da 3 a "A", 3 a "B" y 2 a "C" ?
Igual se escogería la solución entre "A" y "B"? (asumo por distancias)
¿Qué pasa si la respuesta es un poco "ambigua" ?
Supongo que podrías agregar una tercera variable para saber cuál es mejor; por ejemplo, el costo de una ruta contra la otra. Si no, podrías tomar cualquiera de las dos.
Comparto mis NOTAS:
Es uno de los algortimos más importantes y más antiguos de machine learning.
Parte del supuesto que ya tenemos una clasificación.
Trata de encontrar los "vecinos más cercanos" (tomando como parámetro la distancia entre puntos).
"K" se refiere a la cantidad de vecinos que se utilizaran para clasificar un ejemplo (dato) que aún no ha sido clasificado.
Es computacionalmente muy costoso y no sirve con datos de alta dimensionalidad.
if k %2 != 0 entonces el algoritmo puede dejar muchos datos sin clasificar, por empate entre los otros puntos, por lo cual podemos perder muchos datos para el algoritmo.
Con un valor par existe la posibilidad de empate, tiene la misma probabilidad de ser de un grupo o del otro grupo
Hola! ¿Alguien sabe como se usa el Elbow method con el que se define el K de K-nearest?
Hola Diego, de acuerdo a lo que investigue un poco el metodo Elbow consiste en la prueba y error con distintos valores, esto en el algoritmo KNN.
!En este caso el valor optimo dispose de intentar con números del 0 a l 40 es el #20
Aquí abajo el enlace a la publicación que leí, puedes escribirme al telegram: @gjimenex
Elbow Method in Supervised Machine Learning
Según entiendo kNN es aprendizaje supervisado por usamos etiquetas, se deberá usara un test set donde se calcula el error y evalúa en diferentes puntos de k para determinar el k optimo.
A modo personal infiero que no hay un k universal nunca, por que a medida que ponemos mayor data validada podríamos refinar para obtener modelos mas precisos.
Ya vi varios videos de la implementación con Python y hay algo que no me queda claro, según lo he entendido en todos el material que he visto la idea es que tengo 2 grupos ya definidos o clasificados y deso saber a cual de estos pertenece u dato no clasificado; pero en la implementación no he visto que define esos datos no clasificados
Estos tipos de algoritmos tienen algún margen de error a la hora de clasificar el punto desconocido?