Codificar datos categóricos en aprendizaje automático

Una mejor codificación de datos categóricos puede significar un mejor rendimiento del modelo. En este artículo, le presentaré una amplia gama de opciones de codificación del paquete Category Encoders para usar con el aprendizaje automático scikit-learn en Python.

TL; DR;

Utilice codificadores de categorías para mejorar el rendimiento del modelo cuando tenga datos nominales u ordinales que puedan proporcionar valor.

Para columnas nominales, pruebe la codificación OneHot, Hashing, LeaveOneOut y Target. Evite OneHot para columnas de alta cardinalidad y algoritmos basados ​​en árboles de decisión.

Para columnas ordinales, pruebe Ordinal (Entero), Binario, OneHot, LeaveOneOut y Target. Es menos probable que Helmert, Sum, BackwardDifference y Polynomial sean útiles, pero si tiene tiempo o una razón teórica, es posible que desee probarlos.

Para tareas de regresión, Target y LeaveOneOut probablemente no funcionen bien.

Mapa vial

En este artículo analizaremos los términos, el uso general y cinco opciones de codificación clásica: Ordinal, One Hot, Binary, BaseN y Hashing. En el segundo artículo evaluaremos codificadores de contraste con raíces en la prueba de hipótesis. En el artículo final veremos los codificadores bayesianos.

Aquí están los siete tipos de datos:

  • Inútil – inútil para los algoritmos de aprendizaje automático, es decir – discreto
  • Nominal – grupos sin orden – discreto
  • Binario – discreto o discreto
  • Ordinal – grupos con el fin – discreto
  • Recuento – el número de apariciones – discreto
  • Tiempo – números cíclicos con un componente temporal – continuo
  • Intervalo – números positivos y / o negativos sin un componente temporal – continuo

Aquí estamos preocupado con la codificación de datos nominales y ordinales. Una columna con datos nominales tiene valores que no se pueden ordenar de ninguna manera significativa.

Los datos nominales suelen estar codificados en caliente, pero hay muchas opciones que pueden funcionar mejor para el aprendizaje automático.

Por el contrario, los datos ordinales pueden ordenarse por rango. Los datos ordinales se pueden codificar de tres maneras, en términos generales, pero creo que es seguro decir que su codificación a menudo no se considera cuidadosamente.

  1. Se puede suponer que está lo suficientemente cerca de los datos de intervalo, con magnitudes relativamente iguales entre valores – para tratarlo como tal. Los científicos sociales hacen esta suposición todo el tiempo con escalas de Likert. Por ejemplo, “En una escala de 1 a 7, siendo 1 extremadamente improbable, 4 no es probable ni poco probable y 7 es extremadamente probable, ¿qué tan probable es que recomiende esta película a un amigo?”. Aquí se puede suponer razonablemente que la diferencia entre 3 y 4 y la diferencia entre 6 y 7 son similares.
  2. Se puede tratar como datos nominales, donde cada categoría no tiene relación numérica con otra. La codificación en caliente y otras codificaciones apropiadas para datos nominales tienen sentido aquí.
  3. La magnitud de la diferencia entre los números puede ignorarse. Puede entrenar su modelo con diferentes codificaciones y ver qué codificación funciona mejor.

En esta serie, veremos los codificadores de Encoders de Categorical 11 a partir de la versión 1.2.8. La versión 1.3.0 debería lanzarse pronto y probablemente incluirá un nuevo codificador, Weight of Evidence. Abordaremos Weight of Evidence si el lanzamiento ya está listo para cuando lleguemos a la Parte 3 de la serie.

Muchos de estos métodos de codificación tienen más de un nombre en el mundo de las estadísticas y, a veces, un nombre puede significar cosas diferentes. Seguiremos el uso de Category Encoders.

Hay un infinito número de formas infinitas de codificar información categórica. Los que están en Category Encoders deberían ser suficientes para casi todos los usos.

Resumen rápido

Aquí está la lista de funciones de Category Encoders con sus descripciones y el tipo de datos que serían más apropiados para codificar.

Encoders clásicos

El primer grupo de cinco codificadores clásicos se puede ver en un continuo de información de incrustación en una columna (Ordinal) hasta k columnas (OneHot). Estas son codificaciones muy útiles para que entiendan los practicantes de aprendizaje automático.

  • Ordinal – convierte etiquetas de cadena en valores enteros 1 a k . Ordinal.
  • OneHot – una columna por cada valor para comparar con todos los demás valores. Nominal, ordinal.
  • Binario – convierte cada número entero en dígitos binarios. Cada dígito binario obtiene una columna. Alguna pérdida de información pero menos dimensiones. Ordinal.
  • BaseN – Codificación ordinal, binaria o superior. Nominal, ordinal. No agrega mucha funcionalidad. Probablemente evitar.
  • Hashing – Al igual que OneHot pero con menos dimensiones, algunas pérdidas de información debido a colisiones. Nominal, ordinal.

Encoders de contraste

Los cinco codificadores de contraste tienen múltiples problemas que, en mi opinión, hacen improbable que sean útiles para el aprendizaje automático. Todos ellos generan una columna para cada valor de columna. Yo los evitaría en la mayoría de los casos. Sus intentos declarados están abajo.

  • Helmert (reverso) – La media de la variable dependiente para un nivel se compara con la media de la variable dependiente sobre todos los niveles previos.
  • Suma – compara la media de la variable dependiente para un nivel dado con la media general de la variable dependiente en todos los niveles.
  • Diferencia hacia atrás – la media de la variable dependiente para un nivel se compara con la media de la variable dependiente para el nivel anterior.
  • Polinomio – contrastes polinomiales ortogonales. Los coeficientes tomados por codificación polinómica para k = 4 niveles son las tendencias lineales, cuadráticas y cúbicas en la variable categórica.

Codificadores bayesianos

Los tres codificadores bayesianos usan información de la variable dependiente en sus codificaciones. Todos ellos imprimen una columna y pueden funcionar bien con datos de cardinalidad alta.

  • Objetivo : utilice la media del DV, debe tomar medidas para evitar el exceso de ajuste / fuga de respuesta. Nominal, ordinal. Para tareas de clasificación.
  • LeaveOneOut – similar al objetivo, pero evita la contaminación. Nominal, ordinal. Para tareas de clasificación.
  • WeightOfEvidence – esperado en la próxima versión 1.3.0. Se revisará si está incluido y se publicará cuando la Parte 3 esté lista para presionar.

Usar

Los codificadores de categoría siguen la misma API que los preprocesadores de sklearn. Tienen algunas comodidades adicionales, como la capacidad de agregar fácilmente un codificador a una tubería. Además, el codificador devuelve un DataFrame de pandas si se pasa un DataFrame.

Aquí hay un ejemplo del código con el BinaryEncoder:

https://gist.github.com/discdiver/a323e62dcae117d5e3afcad8e3750a48.js

Trataremos algunos problemas con la implementación en la segunda y tercera parte de esta serie. Pero debería poder acceder directamente a los primeros cinco si está familiarizado con la API de scikit learn.

Tenga en cuenta que todos los codificadores de categoría imputan automáticamente los valores faltantes de forma predeterminada. Sin embargo, le recomiendo que complete los datos de datos que faltan antes de la codificación para que pueda probar los resultados de varios métodos.

Terminología

Es posible que veas a los comentaristas usar los siguientes términos indistintamente: dimensión característica vector serie variable independiente y columna . Yo también 🙂 De manera similar, puede ver fila y observación usada indistintamente.

k es el número original de valores únicos en su columna de datos. Alto cardinalidad significa una gran cantidad de valores únicos (un gran k) . Una columna con cientos de códigos postales es un ejemplo de una característica de cardinalidad alta.

Pájaro de tema de alta cardinalidad

Alta dimensionalidad significa una matriz con muchas dimensiones. La alta dimensionalidad viene con la maldición de la dimensionalidad: se puede encontrar un tratamiento completo de este tema aquí . Lo importante es que la alta dimensionalidad requiere muchas observaciones y, a menudo, resulta en sobreajuste.

Una varita que ayuda a evitar los datos Curse of Dimensionality

Sparse es una matriz con muchos ceros relativos a otros valores. Si los codificadores transforman los datos de modo que se vuelvan escasos, es posible que algunos algoritmos no funcionen correctamente. La escasez a menudo se puede gestionar marcándola, pero muchos algoritmos no funcionan bien a menos que los datos sean densos.

Escasa

Extrayendo Codificadores de Categoría

¡Sin más preámbulos, codifiquemos!

Ordinal

OrdinalEncoder convierte cada valor de cadena en un número entero. El primer valor único en su columna se convierte en 1, el segundo se convierte en 2, el tercero se convierte en 3, etc.

Lo que era el valor real antes de la codificación no afecta en qué se convierte cuando fit_transform con OrdinalEncoder. El primer valor podría haber sido 10 y el segundo valor podría haber sido 3. Ahora serán 1 y 3, respectivamente.

Si la columna contiene datos nominales, detenerse después de usar OrdinalEncoder es una mala idea. Su algoritmo de aprendizaje automático tratará la variable como continua y asumirá que los valores están en una escala significativa. En cambio, si tiene una columna con valores carro, autobús, y camión primero debe codificar estos datos nominales utilizando OrdinalEncoder. Luego codifícalo de nuevo usando uno de los métodos apropiados para los datos nominales que exploraremos a continuación.

Por el contrario, si los valores de tus columnas son verdaderamente ordinales, eso significa que el número entero asignado a cada valor es significativo. La asignación debe hacerse con intención. Supongamos que su columna tiene los valores de cadena “Primero”, “Tercero” y “Segundo” en él. Esos valores deben correlacionarse con los enteros correspondientes al pasar OrdinalEncoder una lista de dicts como:

 [{'col':'finished_race_order'
 'mapping': [("First"1)
 ('Segundo', 2), 
 ('Tercero', 3)] 
}]

Esta es la configuración básica para todos los ejemplos de código a seguir. Puede obtener el cuaderno completo en este Kaggle Kernel .

Aquí está la columna X no transformada.

Y aquí está el código OrdinalEncoder para transformar los valores de columna color de letras a enteros .

Todos los valores de cadena ahora son enteros.

LabelEncoder de Sklearn hace más o menos lo mismo que OrdinalEncoder de Category Encoder, pero no es tan fácil de usar. LabelEncoder no devolverá un DataFrame, en su lugar devuelve una matriz numpy si pasa un DataFrame. También emite valores empezando por 0, en comparación con el valor predeterminado de OrdinalEncoder para generar valores comenzando por 1.

Puede realizar la codificación ordinal asignando valores de cadena a enteros manualmente con aplicar . Pero eso es trabajo adicional una vez que sepa cómo usar los codificadores de categoría.

OneHot

La codificación única es el enfoque clásico para tratar con datos nominales y tal vez ordinales. Se lo conoce como el “Enfoque estándar para datos categóricos” en la serie de tutoriales Machine Learning de Kaggle . También utiliza la codificación de nombres indicador y ocasionalmente codificación binaria . Sí, esto es confuso.

Es un sol ardiente

El codificador único crea una columna para cada valor para comparar con todos los demás valores. Para cada columna nueva, una fila obtiene un 1 si la fila contiene el valor de esa columna y un 0 si no lo hizo. Así es como se ve:

color_-1 es en realidad una columna extraña, porque es todo 0, sin variaciones no ayuda a su modelo a aprender nada. Puede haber sido diseñado para valores perdidos, pero en la versión 1.2.8 de Category Encoders no está haciendo nada. Sin embargo, solo está agregando una columna, por lo que no es realmente un gran problema para el rendimiento.

La codificación única puede funcionar muy bien, pero el número de funciones nuevas es igual a k, el número de funciones únicas valores. Esta expansión de funciones puede crear serios problemas de memoria si su conjunto de datos tiene características de alta cardinalidad. Los datos codificados en caliente también pueden ser difíciles para los algoritmos basados ​​en árbol de decisiones: consulte la discusión aquí .

Las funciones pandas GetDummies y sklearn OneHotEncoder realizar el mismo papel que OneHotEncoder. Encuentro que OneHotEncoder es un poco más agradable de usar.

Binario

El binario puede considerarse como un híbrido de codificadores unívocos y hash. Binary crea menos funciones que one-hot, mientras que conserva algunos valores únicos en la columna the. Puede funcionar bien con datos ordinales de mayor dimensionalidad.

Así es como funciona:

  • Las categorías están codificadas por OrdinalEncoder si aún no están en forma numérica.
  • Luego esos enteros se convierten en código binario, por lo que por ejemplo 5 se convierte en 101 y 10 se convierte en 1010
  • Luego los dígitos de esa cadena binaria se dividen en columnas separadas. Entonces, si hay 4-7 valores en una columna ordinal, se crean 3 nuevas columnas: una para el primer bit, una para el segundo y una para el tercero.
  • Cada observación se codifica a través de las columnas en su forma binaria .

Así es como se ve:

La primera columna no tiene variación, por lo que no está haciendo nada para ayudar al modelo.

Con solo tres niveles, la información incrustada se confunde. Hay muchas colisiones y el modelo no puede obtener mucha información de las características. Solo una codificación en caliente con solo unos pocos valores. Por el contrario, el binario realmente brilla cuando la cardinalidad de la columna es más alta, con los 50 estados de EE. UU., Por ejemplo.

La codificación binaria crea pocas columnas que la codificación en caliente. Es más eficiente con la memoria. También reduce las posibilidades de problemas de dimensionalidad con mayor cardinalidad.

La mayoría de los valores similares se superponen entre sí en muchas de las columnas nuevas. Esto permite que muchos algoritmos de aprendizaje automático aprendan la similitud de los valores. La codificación binaria es un compromiso decente para los datos ordinales con alta cardinalidad.

Para los datos nominales, un algoritmo hash con un control más detallado generalmente tiene más sentido. Si ha utilizado la codificación binaria con éxito, compártala en los comentarios.

BaseN

Cuando BaseN base = 1 es básicamente lo mismo que una codificación en caliente. Cuando base = 2 es básicamente lo mismo que la codificación binaria. McGinnis dijo : “Prácticamente, esto agrega muy poca funcionalidad nueva, raramente la gente usa base-3 o base-8 o cualquier base que no sea ordinal o binaria en problemas reales.”

Base 3 [19659084] La razón principal de su existencia es posiblemente hacer la búsqueda de grillas más fácil. Puede usar BaseN con gridsearchCV. Sin embargo si va a buscar en la cuadrícula con algunas de estas opciones de codificación, de todas maneras va a hacer que esa búsqueda sea parte de su flujo de trabajo. No veo una razón convincente para usar BaseN. Si lo hace, comparta los comentarios.

La base predeterminada para BaseNEncoder es 2, que es el equivalente de BinaryEncoder.

Hashing

HashingEncoder implementa el truco hash. Es similar a la codificación única, pero con menos nuevas dimensiones y algunas pérdidas de información debido a colisiones.

Las colisiones no afectan significativamente el rendimiento a menos que exista una gran superposición. Puede encontrar una excelente discusión sobre el truco de hash y las pautas para seleccionar el número de características de salida aquí .

Aquí está la columna ordinal para refrescar.

Y aquí está HashingEncoder.

El parámetro n_components controla el número de columnas expandidas. El valor predeterminado es ocho columnas. En nuestra columna de ejemplo con tres valores, el resultado predeterminado es de cinco columnas llenas de ceros.

Si establece [n n_components menos de k tendrá una pequeña reducción en el valor provisto por los datos codificados. También tendrá menos dimensiones.

Puede pasar un algoritmo hash de su elección a HashingEncoder; el valor predeterminado es md5 . Los algoritmos Hashing han sido muy exitosos en algunos concursos de Kaggle . Vale la pena intentar con los datos nominales y ordinales si tiene que lidiar con algunas columnas de cardinalidad más altas.

Breaktime

Eso es todo por este artículo. En el siguiente artículo veremos el grupo de contrastes de Codificadores de categoría.

Si encontraste este artículo interesante, útil o medianamente divertido, ayuda a otros a encontrarlo con algunas palmadas de claqueta. Gracias por leer.

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *