Datos categóricos: Vocabulario y codificación one-hot

El término dimensión es sinónimo de la cantidad de elementos en un vector de atributos. Algunos atributos categóricos son de baja dimensión. Por ejemplo:

Nombre del atributo Cantidad de categorías Categorías de ejemplo
snowed_today 2 Verdadero, Falso
skill_level 3 Principiante, profesional y experto
season 4 Invierno, primavera, verano y otoño
day_of_week 7 Lunes, martes y miércoles
planeta 8 Mercurio, Venus y la Tierra

Cuando un atributo categórico tiene una cantidad baja de categorías posibles, puedes codificarlo como un vocabulario. Con una codificación de vocabulario, el modelo trata cada valor categórico posible como un atributo independiente. Durante el entrenamiento, el modelo aprende diferentes pesos para cada categoría.

Por ejemplo, supongamos que creas un modelo para predecir el precio de un automóvil en función, en parte, de un atributo categórico llamado car_color. Quizás los autos rojos valgan más que los verdes. Dado que los fabricantes ofrecen una cantidad limitada de colores exteriores, car_color es un atributo categórico de baja dimensión. En la siguiente ilustración, se sugiere un vocabulario (valores posibles) para car_color:

Figura 1: Cada color de la paleta se representa como una característica independiente. Es decir, cada color es un atributo independiente en el vector de atributos.
      Por ejemplo, "Rojo" es un atributo, "Naranja" es otro atributo independiente, y así sucesivamente.
Figura 1: Un atributo único para cada categoría.

Ejercicio: Comprueba tus conocimientos

Verdadero o falso: Un modelo de aprendizaje automático puede entrenarse directamente con valores de cadena sin procesar, como "Rojo" y "Negro", sin convertir estos valores en vectores numéricos.
Verdadero
Durante el entrenamiento, un modelo solo puede manipular números de punto flotante. La cadena "Red" no es un número de punto flotante. Debes convertir cadenas como "Red" en números de punto flotante.
Falso
Un modelo de aprendizaje automático solo se puede entrenar con atributos que tengan valores de punto flotante, por lo que deberás convertir esas cadenas en valores de punto flotante antes del entrenamiento.

Números de índice

Los modelos de aprendizaje automático solo pueden manipular números de punto flotante. Por lo tanto, debes convertir cada cadena en un número de índice único, como se muestra en la siguiente ilustración:

Figura 2: Cada color está asociado a un valor entero único. Por ejemplo, "Rojo" se asocia con el número entero 0, "Naranja" con el número entero 1, y así sucesivamente.
Figura 2: Son los atributos indexados.

Después de convertir las cadenas en números de índice únicos, deberás procesar los datos aún más para representarlos de maneras que ayuden al modelo a aprender relaciones significativas entre los valores. Si los datos de atributos categóricos se dejan como números enteros indexados y se cargan en un modelo, este tratará los valores indexados como números de punto flotante continuos. Luego, el modelo consideraría que "púrpura" es seis veces más probable que "naranja".

Codificación one-hot

El siguiente paso para crear un vocabulario es convertir cada número de índice en su codificación one-hot. En una codificación one-hot, se hace lo siguiente:

  • Cada categoría se representa con un vector (array) de N elementos, donde N es la cantidad de categorías. Por ejemplo, si car_color tiene ocho categorías posibles, el vector de representación one-hot tendrá ocho elementos.
  • Exactamente uno de los elementos de un vector de codificación one-hot tiene el valor 1.0; todos los elementos restantes tienen el valor 0.0.

Por ejemplo, en la siguiente tabla, se muestra la codificación one-hot para cada color en car_color:

Función Rojo Orange Azul Amarillo Verde Negro Púrpura Brown
"Rojo" 1 0 0 0 0 0 0 0
"Orange" 0 1 0 0 0 0 0 0
"Azul" 0 0 1 0 0 0 0 0
"Amarillo" 0 0 0 1 0 0 0 0
"Verde" 0 0 0 0 1 0 0 0
"Black" 0 0 0 0 0 1 0 0
“Morado” 0 0 0 0 0 0 1 0
"Marrón" 0 0 0 0 0 0 0 1

El vector one-hot, no la cadena ni el número de índice, es lo que se pasa al vector de atributos. El modelo aprende un peso independiente para cada elemento del vector de atributos.

En la siguiente ilustración, se sugieren las diversas transformaciones en la representación del vocabulario:

Figura 3: Diagrama del proceso de extremo a extremo para asignar categorías a vectores de características. En el diagrama, los atributos de entrada son "Amarillo", "Naranja", "Azul" y "Azul" por segunda vez.  El sistema usa un vocabulario almacenado ("Rojo" es 0, "Naranja" es 1, "Azul" es 2, "Amarillo" es 3, y así sucesivamente) para asignar el valor de entrada a un ID. Por lo tanto, el sistema asigna "Amarillo", "Naranja", "Azul" y "Azul" a 3, 1, 2 y 2. Luego, el sistema convierte esos valores en un vector de atributos one-hot. Por ejemplo, dado un sistema con ocho colores posibles, el 3 se convierte en 0, 0, 0, 1, 0, 0, 0, 0.
Figura 3: Proceso de extremo a extremo para asignar categorías a vectores de características.

Representación dispersa

Un atributo cuyos valores son predominantemente cero (o están vacíos) se denomina atributo disperso. Muchos atributos categóricos, como car_color, tienden a ser atributos dispersos. La representación dispersa significa almacenar la posición del 1.0 en un vector disperso. Por ejemplo, el vector one-hot para "Blue" es el siguiente:

[0, 0, 1, 0, 0, 0, 0, 0]

Dado que 1 está en la posición 2 (cuando se comienza el recuento en 0), la representación dispersa para el vector one-hot anterior es la siguiente:

2

Ten en cuenta que la representación dispersa consume mucha menos memoria que el vector de codificación one-hot de ocho elementos. Es importante destacar que el modelo debe entrenarse con el vector codificado con un 1 y ceros, no con la representación dispersa.

Valores atípicos en los datos categóricos

Al igual que los datos numéricos, los datos categóricos también contienen valores atípicos. Supongamos que car_color contiene no solo los colores populares, sino también algunos colores atípicos que se usan con poca frecuencia, como "Mauve" o "Avocado". En lugar de asignar a cada uno de estos colores atípicos una categoría separada, puedes agruparlos en una sola categoría "comodín" llamada fuera del vocabulario (OOV). En otras palabras, todos los colores atípicos se agrupan en un solo bucket de valores atípicos. El sistema aprende un solo peso para ese bucket de valores atípicos.

Codificación de atributos categóricos de alta dimensión

Algunos atributos categóricos tienen una gran cantidad de dimensiones, como los que se muestran en la siguiente tabla:

Nombre del atributo Cantidad de categorías Categorías de ejemplo
words_in_english Alrededor de 500,000 "feliz", "caminando"
US_postal_codes Aproximadamente 42,000 "02114", "90301"
last_names_in_Germany Aproximadamente 850,000 "Schmidt", "Schneider"

Cuando la cantidad de categorías es alta, la codificación one-hot suele ser una mala opción. Las incorporaciones, que se detallan en un módulo de incorporaciones aparte, suelen ser una opción mucho mejor. Los embeddings reducen considerablemente la cantidad de dimensiones, lo que beneficia a los modelos de dos maneras importantes:

  • Por lo general, el modelo se entrena más rápido.
  • Por lo general, el modelo compilado infiere predicciones más rápido. Es decir, el modelo tiene una latencia más baja.

La codificación hash (también llamada truco de codificación hash) es una forma menos común de reducir la cantidad de dimensiones.