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
:
Ejercicio: Comprueba tus conocimientos
"Red"
no es un número de punto flotante. Debes convertir cadenas como "Red"
en números de punto flotante.
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:
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:
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.