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

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

Nombre de la función Cantidad de categorías Categorías de muestra
snowed_today 2 Verdadero, falso
skill_level 3 Principiante, profesional, experto
season 4 Invierno, primavera, verano, 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 valen más que los verdes. Dado que los fabricantes ofrecen una cantidad limitada de colores exteriores, car_color es una característica categórica 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 una característica independiente en el vector de características.
      Por ejemplo, "Rojo" es una función, "Naranja" es una función independiente, etcétera.
Figura 1: Es un atributo único para cada categoría.

Ejercicio: Evalúa tu intuición

Verdadero o falso: Un modelo de aprendizaje automático puede entrenarse directamente en valores de cadenas sin procesar, como "Red" y "Black", 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 en atributos con 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 en la siguiente ilustración:

Figura 2: Cada color está asociado con un valor entero único. Por ejemplo, “Rojo” está asociado con el número entero 0, “Naranja” con el número entero 1, y así sucesivamente.
Figura 2: Atributos indexados

Ejercicio: Comprueba tu intuición

¿Tu modelo debe entrenarse directamente en los números de índice que se muestran en la Figura 2?
Si el modelo se entrenara en los números de índice, trataría cada uno de forma incorrecta como un valor numérico y consideraría que "Black" (número de índice 5) es 5 veces más significativo para el modelo que "Orange" (número de índice 1).
No
Tu modelo no debe entrenarse en los números de índice. Si lo hiciera, tu modelo trataría cada número de índice como un valor numérico y consideraría que "Black" (índice número 5) es 5 veces más significativo para el modelo que "Orange" (índice número 1).

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:

  • Cada categoría está representada por un vector (array) de N elementos, en el que N es el número de categorías. Por ejemplo, si car_color tiene ocho categorías posibles, el vector one-hot que lo representa tendrá ocho elementos.
  • Exactamente uno de los elementos de un vector one-hot tiene el valor 1.0; todos los elementos restantes tienen el valor 0.0.

Por ejemplo, la siguiente tabla muestra la codificación one-hot para cada elemento de car_color:

Función Rojo Orange Azul Amarillo Verde Negro Púrpura Brown
“Red” 1 0 0 0 0 0 0 0
"Naranja" 0 1 0 0 0 0 0 0
"Blue" 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
"Negro" 0 0 0 0 0 1 0 0
“Púrpura” 0 0 0 0 0 0 1 0
“Marrón” 0 0 0 0 0 0 0 1

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

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, etc.) para asignar el valor de entrada a un ID. Por lo tanto, el sistema asigna “Amarillo”, “Naranja”, “Azul” y “Azul” a 3, 1, 2, 2. Luego, el sistema convierte esos valores en un vector de características one-hot. Por ejemplo, dado un sistema con ocho colores posibles, 3 se convierte en 0, 0, 0, 1, 0, 0, 0, 0.
Figura 3: Es el proceso integral para asignar categorías a vectores de atributos.

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, suelen 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 inicia 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 one-hot de ocho elementos. Es importante que el modelo se entrene en el vector de uno caliente, no en 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 no solo contiene los colores populares, sino también algunos colores extremos que rara vez se usan, como "Mauve" o "Avocado". En lugar de asignar a cada uno de estos colores extremos una categoría independiente, puedes agruparlos en una sola categoría "general" 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 de la función Cantidad de categorías Categorías de muestra
words_in_english ~500,000 "happy", "walking"
US_postal_codes ~42,000 "02114", "90301"
last_names_in_Germany ~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 independiente, suelen ser una opción mucho mejor. Las incorporaciones reducen de manera significativa 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.