¿Cuándo usar One Hot Encoding vs LabelEncoder vs DictVectorizor?


96

He estado creando modelos con datos categóricos durante un tiempo y, en esta situación, básicamente uso la función LabelEncoder de scikit-learn para transformar estos datos antes de construir un modelo.

Entiendo la diferencia entre OHE, LabelEncodery DictVectorizoren términos de lo que están haciendo a los datos, pero lo que no está claro para mí es cuándo puede optar por emplear una técnica sobre otra.

¿Existen ciertos algoritmos o situaciones en los que uno tiene ventajas / desventajas con respecto a los demás?


2
En referencia a la respuesta de AN6U5 , y esta afirmación:> Todavía hay algoritmos como árboles de decisión y bosques aleatorios que pueden funcionar con variables categóricas muy bien y LabelEncoder se puede usar para almacenar valores usando menos espacio en disco. ¿El uso de LabelEncoder no transformaría una característica categórica en numérica, causando así que un árbol de decisión realice divisiones en algún valor que realmente no tiene sentido ya que la asignación es arbitraria?
Nico

1
Nico, creo que lo que dice AN6U5 es específicamente para los árboles de decisión, funciona bien, porque el árbol se dividiría en perro, gato, ratón o 1,2,3 y el significado del "gato" vs "2" no es importante para un árbol (piense en la forma en que se divide). En el caso de algo así como la regresión logística, los valores son parte de una ecuación ya que multiplica los valores de peso * por lo que podría causar problemas de entrenamiento y problemas de peso dado que dog: 1 y cat: 2 no tienen una relación numérica 1 * 2 (aunque todavía puede funcionar con suficientes ejemplos de entrenamiento y épocas).
Doug F

Respuestas:


125

Hay algunos casos en los que LabelEncoder o DictVectorizor son útiles, pero estos son bastante limitados en mi opinión debido a la ordinalidad.

LabelEncoder puede convertir [perro, gato, perro, ratón, gato] en [1,2,1,3,2], pero la ordinalidad impuesta significa que el promedio de perro y ratón es gato. Todavía hay algoritmos como árboles de decisión y bosques aleatorios que pueden funcionar con variables categóricas muy bien y LabelEncoder se puede usar para almacenar valores usando menos espacio en disco.

One-Hot-Encoding tiene la ventaja de que el resultado es binario en lugar de ordinal y que todo se encuentra en un espacio vectorial ortogonal. La desventaja es que para una alta cardinalidad, el espacio de características realmente puede explotar rápidamente y comenzar a luchar con la maldición de la dimensionalidad. En estos casos, suelo emplear una codificación en caliente seguida de PCA para reducir la dimensionalidad. Me parece que la combinación juiciosa de one-hot plus PCA rara vez puede ser superada por otros esquemas de codificación. PCA encuentra la superposición lineal, por lo que naturalmente tenderá a agrupar características similares en la misma característica.


1
Muchas gracias, esto es muy útil y tiene mucho sentido. ¿Hay algún otro esquema de codificación que use para casos específicos / límite? ¿Alguna vez se encuentra en una situación en la que utilizará diferentes esquemas de codificación para diferentes funciones?
anthr

21

Si bien AN6U5 ha dado una muy buena respuesta, quería agregar algunos puntos para referencia futura. Al considerar One Hot Encoding (OHE) y Label Encoding , debemos tratar de comprender qué modelo está intentando construir. Es decir, las dos categorías de modelo que consideraremos son:

  1. Modelos basados ​​en árboles : árboles de decisión impulsados ​​por gradientes y bosques aleatorios.
  2. Modelos no basados ​​en árboles : lineal, kNN o basado en redes neuronales.

Consideremos cuándo aplicar OHE y cuándo aplicar Label Encoding al construir modelos basados ​​en árboles.

Aplicamos OHE cuando:

  1. Cuando los valores cercanos entre sí en la codificación de la etiqueta corresponden a valores objetivo que no están cerca (datos no lineales).
  2. Cuando la característica categórica no es ordinal (perro, gato, ratón).

Aplicamos la codificación de etiquetas cuando:

  1. La característica categórica es ordinal (Jr. kg, Sr. kg, primaria, secundaria, etc.).
  2. Cuando podemos encontrar un codificador de etiquetas que asigne etiquetas cercanas a categorías similares : esto conduce a menos derrames en el tren, lo que reduce el tiempo de ejecución.
  3. Cuando el número de características categóricas en el conjunto de datos es enorme: la codificación de una característica categórica con un gran número de valores puede conducir a (1) un alto consumo de memoria y (2) el caso en que el modelo rara vez utiliza características no categóricas. Puede ocuparse del primer caso si emplea matrices dispersas. El segundo caso puede ocurrir si construye un árbol utilizando solo un subconjunto de características. Por ejemplo, si tiene 9 características numéricas y 1 categórica con 100 valores únicos y codificó en caliente esa característica categórica, obtendrá 109 características. Si un árbol se construye con solo un subconjunto de características, rara vez se usarán las características numéricas iniciales 9. En este caso, puede aumentar el tamaño de control de parámetros de este subconjunto. En xgboost se llama colsample_bytree, en sklearn's Random Forest max_features.

En caso de que desee continuar con OHE, como sugirió @ AN6U5, es posible que desee combinar PCA con OHE.

Consideremos cuándo aplicar OHE y Label Encoding al construir modelos no basados ​​en árboles.

Para aplicar la codificación de etiquetas, la dependencia entre la función y el objetivo debe ser lineal para que la codificación de etiquetas se pueda utilizar de manera efectiva.

Del mismo modo, en caso de que la dependencia no sea lineal, es posible que desee utilizar OHE para lo mismo.

Nota: Parte de la explicación se ha mencionado en Cómo ganar una competencia de ciencia de datos de Coursera.


Explicación muy intuitiva. ¿No deberían ser "divisiones", no "divisiones"?
dzieciou

0

LabelEncoder es para datos ordinales, mientras que OHE es para datos nominales.