Curso

«En muchas tareas prácticas de ciencia de datos, el conjunto de datos contiene variables categóricas. Estas variables suelen almacenarse como valores de texto». (Practical Business Python) Dado que el aprendizaje automático se basa en ecuaciones matemáticas, dejar las variables categóricas tal cual puede generar problemas. Muchos algoritmos admiten valores categóricos sin más manipulación, pero incluso en esos casos sigue habiendo debate sobre si conviene codificarlas o no. Los algoritmos que no admiten valores categóricos requieren, en ese caso, aplicar metodologías de codificación. Veamos algunos métodos.
Metodologías de codificación
Codificación por etiquetas (label encoding)
En la codificación por etiquetas, asignamos a cada categoría un número o etiqueta. Las etiquetas elegidas para las categorías no guardan relación entre sí. Por ello, categorías que están vinculadas o son cercanas entre sí pierden esa información tras la codificación.
Codificación por frecuencia
Es una forma de usar la frecuencia de las categorías como etiquetas. En los casos en que la frecuencia guarda cierta relación con la variable objetivo, ayuda al modelo a entender y asignar pesos en proporción directa o inversa, según la naturaleza de los datos.
Codificación one-hot
En este método, asignamos a cada categoría un vector con 1 y 0 que indica la presencia o ausencia de la característica. El número de vectores depende de las categorías que queramos conservar. En características de alta cardinalidad, este método genera muchas columnas y ralentiza notablemente el aprendizaje. Suele haber debate entre one-hot encoding y dummy encoding y cuándo usar cada uno. Son muy parecidos, salvo que one-hot genera un número de columnas igual al de categorías, mientras que el dummy genera una menos. En última instancia, debe gestionarlo quien modela durante la validación.
Trampa de las variables ficticias (dummy variable trap):
Imagina que tienes dos categorías en una característica categórica. Tras aplicar one-hot encoding, habrá dos columnas que la representan, pero si te fijas, con un solo vector basta para representar ambos valores. Por ejemplo, una característica categórica con dos valores, «red» y «blue». Con one-hot se crearán dos vectores, uno para «red» y otro para «blue», pero la información puede aprenderse usando solo uno, y el otro será constante. Así que podemos eliminar un vector, lo que reduce los datos sobre los que entrenar los algoritmos. Esto ayuda al modelo a rendir mejor y facilita explicar su funcionamiento. En escenarios reales, a menudo debemos tratar muchas características categóricas, a veces con conocimiento previo de sus resultados. Las prácticas de codificación te permiten abordar la entrada de datos, pero también pueden convertir el proceso y el aprendizaje en una tarea muy pesada.
Codificación por objetivo, impacto o verosimilitud
La codificación por objetivo (target encoding) es similar a la codificación por etiquetas, salvo que aquí las etiquetas se correlacionan directamente con la variable objetivo. Por ejemplo, en la codificación por la media del objetivo, para cada categoría la etiqueta se decide con el valor medio de la variable objetivo en los datos de entrenamiento. Este método resalta la relación entre categorías similares, pero las relaciones quedan acotadas a las propias categorías y al objetivo. Sus ventajas son que no afecta al volumen de datos y facilita un aprendizaje más rápido; su desventaja es que resulta más difícil de validar. Es necesaria la regularización en la implementación de esta metodología. Consulta target encoder en python y en R.
Estadísticas de codificación
La variabilidad de la codificación describe la variación de la codificación dentro de una misma categoría. En one-hot encoding, la variabilidad depende del momento de implementación en el que se decide cuántas categorías incluir, es decir, aquellas con suficiente impacto en la variable objetivo. Otras metodologías de codificación también muestran una variabilidad significativa que se identifica en la fase de validación.
Para calcular la distinguibilidad de la codificación, contamos las etiquetas de las categorías y luego calculamos la desviación estándar de esas etiquetas. Esto muestra si las categorías codificadas están bien separadas o si se agrupan en una zona.
Ten en cuenta que, si eliges un estilo de codificación sencillo al crear un modelo, este tenderá a sesgarse. Para entenderlo mejor, visita este debate; además, para distintos modelos conviene ajustar la metodología de codificación: por ejemplo, en regresión puedes usar codificación por la media del objetivo, y en clasificación puedes optar por codificación por frecuencia relativa.
Para terminar, me gustaría compartir un transformador al estilo scikit-learn que ayuda a codificar variables categóricas con distintas técnicas.
category_encoders
Esta librería de scikit-learn ofrece las siguientes técnicas implementadas actualmente:
- Ordinal
- One-Hot
- Binary
- Helmert Contrast
- Sum Contrast
- Polynomial Contrast
- Backward Difference Contrast
- Hashing
- BaseN
- LeaveOneOut
- Target Encoding
Admite dataframes de pandas como entrada y puede transformar datos. También es compatible con pipelines de sklearn; para más detalles, visita aquí.
Si quieres aprender más sobre scikit-learn, realiza el curso de DataCamp Supervised Learning with scikit-learn.
