Chisme 110 del Lince: el vecino más cercano, clasificar palabras con kNN

Simulador y tutorial. Trabajarás en el navegador, sin instalar nada. Usa las mismas 24 palabras del chisme 109, con vectores inventados.

El Lince de la Noche tiene una lista de palabras nuevas que CABRA todavía no conoce: «ballena», «tomate», «camión». Quiere que la IA diga a qué grupo pertenece cada una. «Fácil», dice. «Que mire qué palabras conoce y elija la misma clase». La Gata Montesa levanta una ceja: «¿Y si la palabra más parecida es un ratón con cara de perro?». El Lince se queda mirando la pantalla. «Pues miramos a más vecinos».

Introducción

En el chisme 109 aprendimos a medir la distancia entre palabras. Ahora usamos esa distancia para clasificar: dada una palabra nueva, la IA busca las palabras conocidas más cercanas y decide su grupo según lo que votan sus vecinos. Este método se llama k vecinos más cercanos, o kNN (de k-nearest neighbors).

Por qué este chisme

Hasta ahora hemos agrupado sin respuestas (chismes 106 y 108). Aquí el ordenador sí tiene respuestas: sabe a qué grupo pertenece cada palabra conocida, y aprende a decidir el grupo de una nueva. Es la base de la clasificación supervisada, la misma idea que el reconocimiento de imágenes o de voz, pero en su versión más sencilla.

Cómo funciona

  1. Tenemos palabras conocidas, cada una con sus tres números y su grupo (animal, comida, lugar o vehículo).
  2. Llega una palabra nueva con sus tres números.
  3. Medimos la distancia de la nueva a todas las conocidas y nos quedamos con las k más cercanas.
  4. Cada una de esas vecinas «vota» su grupo. Gana el grupo con más votos.

El número k lo elegimos nosotros. Con k = 1, la palabra toma el grupo de su vecina más cercana, aunque esa vecina sea un error. Con k más grande, pesan más vecinos y el resultado se suaviza, pero si k es demasiado grande, las vecinas pueden ser de grupos muy distintos y la decisión se vuelve borrosa.

Qué necesitamos

Construcción

Abre el simulador de abajo. Mueve los deslizadores para crear una palabra nueva, o pulsa uno de los ejemplos (ballena, tomate, camión...). Pulsa «Clasificar» y mira a sus vecinas.

Paso 1. Clasifica un ejemplo

Pulsa «ballena». La IA la clasifica sola, con k = 3. ¿Qué grupo sale? ¿Qué vecinas tiene? La respuesta real aparece debajo: ¿acierta?

Paso 2. Cambia k

Repite el paso 1 con k = 1, k = 3 y k = 7. ¿Cambia el resultado? Mira también el porcentaje de acierto que aparece bajo el mapa: es la prueba de las 24 palabras, cada una clasificada sin contarse a sí misma.

Paso 3. Crea tu palabra

Mueve los deslizadores para inventar una palabra (por ejemplo, grande, sin vida y no natural). ¿Qué grupo le asigna la IA? ¿Te parece razonable?

El código en Python

Este es el mismo método en Python con cinco palabras conocidas, para que puedas ver cada paso. Cópialo y pruébalo:

import math
from collections import Counter

# palabras conocidas: [tamaño, tiene vida, es natural] y su grupo
conocidas = [
    ([0.4, 1.0, 0.9], "animal"),    # perro
    ([0.3, 1.0, 0.6], "animal"),    # gato
    ([1.0, 0.0, 0.3], "lugar"),     # ciudad
    ([0.6, 0.0, 0.0], "vehículo"),  # coche
    ([0.1, 0.0, 1.0], "comida"),    # manzana
]

def clasificar(nueva, datos, k):
    # 1. ordenar las palabras conocidas por distancia a la nueva
    cercanas = sorted(datos, key=lambda d: math.dist(nueva, d[0]))[:k]
    # 2. contar los votos de las k vecinas
    votos = Counter(grupo for _, grupo in cercanas)
    return votos.most_common(1)[0][0]

ballena = [0.9, 1.0, 1.0]
print(clasificar(ballena, conocidas, 3))

Lo que hace el programa es lo mismo que el simulador: mide, ordena y vota. No sabe qué es una ballena; solo sabe qué números se parecen a los de las palabras que ya conoce.

Aviso importante: las palabras y los vectores son inventados para que los puedas leer. Un clasificador real se entrena con muchos más ejemplos, con muchas más características, y casi nunca usa solo tres.

Cómo probarlo

  1. Busca un valor de k que dé el mayor porcentaje de acierto. ¿Coincide con tu intuición?
  2. Crea una palabra que esté justo entre dos grupos. ¿Qué pasa con k par, por ejemplo k = 2 o k = 4? ¿Qué regla usa el programa cuando hay empate?
  3. Cambia el código de Python: añade una palabra conocida nueva, como «bicicleta», y comprueba si cambia la clasificación de la ballena.

Qué estamos midiendo realmente

Para el aula

Retos

  1. Haz que funcione. Clasifica las seis palabras de ejemplo con k = 3 y anota cuáles aciertan.
  2. Mide el acierto por k. Anota el porcentaje para k de 1 a 7 y dibuja la gráfica en papel.
  3. Añade ejemplos. Escribe cinco palabras nuevas con sus tres números y su grupo en el código de Python, y comprueba si el resultado cambia.
  4. Busca el caso difícil. Crea una palabra que el método clasifique mal y explica por qué la confunde.

Qué hemos aprendido

Para clasificar una palabra nueva basta con mirar a sus vecinas más cercanas y dejar que voten. Es un método sencillo y fácil de explicar, pero depende de tres decisiones humanas: qué características usamos, cómo medimos la distancia y cuántas vecinas miramos. Por eso una clasificación siempre hay que comprobarla antes de creerla.

Para seguir investigando