¿Mejores prácticas para codificar características categóricas para árboles de decisión?

13

Al codificar características categóricas para la regresión lineal, hay una regla: el número de dummies debe ser uno menos que el número total de niveles (para evitar la colinealidad).

¿Existe una regla similar para los árboles de decisión (en bolsas, potenciados)? Pregunto esto porque una práctica estándar en Python parece ser expandir los nniveles a ntontos (sklearns ' OneHotEncodero Pandas' pd.get_dummies), lo que me parece subóptimo.

¿Qué sugeriría como mejores prácticas para codificar características categóricas para árboles de decisión?

Sergey Bushmanov
fuente

Respuestas:

12

Parece que comprende que puede tener nniveles, en lugar de hacerlo n-1, porque a diferencia de la regresión lineal, no necesita preocuparse por una colinealidad perfecta.

(Llego a esto desde una perspectiva R, pero supongo que es lo mismo en Python). Eso depende de un par de cosas, como 1) qué paquete está usando y 2) cuántos niveles de factor tiene.

1) Si está utilizando el randomForestpaquete de R , entonces si tiene <33 niveles de factor, puede continuar y dejarlos en una función si lo desea. Esto se debe a que en la implementación de bosque aleatorio de R, verificará qué niveles de factores deben estar en un lado de la división y cuáles en el otro (por ejemplo, 5 de sus niveles podrían agruparse en el lado izquierdo y 7 podrían agruparse juntos a la derecha). Si divide la característica categórica en ndummies, entonces el algoritmo no tendría esta opción a su disposición.

Obviamente, si el paquete particular que está utilizando no puede manejar características categóricas, entonces solo necesitaría crear nvariables ficticias.

2) Como mencioné anteriormente, la implementación de bosque aleatorio de R solo puede manejar 32 niveles de factores; si tiene más que eso, entonces necesita dividir sus factores en subconjuntos más pequeños o crear una variable ficticia para cada nivel.

Tchotchke
fuente
1
¡Gracias! ¿Te estoy entendiendo correctamente? A menos que esté modelando en R, donde las características categóricas randomForestse codifican automáticamente, debería ir con ndummies porque la colinealidad no es un problema para RF.
Sergey Bushmanov
3
Tener más de 32 niveles de categorías codificadas en binario tendrá un comportamiento ligeramente diferente en el árbol, ya que RF solo seleccionará entre esas columnas binarias, en lugar de seleccionar la columna única del factor con muchos niveles. Esta sutil diferencia significa que la división en las columnas binarias será menos informativa en comparación con la división en la columna de factor, ya que solo hay una opción (0/1) versus (1 / {2,3}, {2,1} / 3 ) etc.
Sycorax dice Reinstate Monica
@ user777 No es un problema tener más de 32 variables. Es un problema de no tener variables de categoría "agrupadas" en Python sklearn... Hablando en términos prácticos, ¿hay evidencia (experiencia práctica, investigación, etc.) de que las variables "dummified" funcionarán peor que las variables categóricas "agrupadas" [en R]
Sergey Bushmanov
1
Teóricamente, podríamos esperar que los no agrupados funcionen un poco peor, porque le está dando al modelo menos flexibilidad. En el caso agrupado, si fuera realmente mejor tratar esa característica como no agrupada, entonces el modelo podría hacerlo (colocando un grupo en un lado y luego el resto en el otro). Sin embargo, en la práctica, me sorprendería si hubiera mucha diferencia (particularmente en el caso de RF, donde está creando tantos árboles)
Tchotchke
2
Encuentro que la implementación de randomForest usando características con muchos niveles de factores (> 15) es lenta como se mencionó, pero también produce un rendimiento mediocre del modelo. Supongo que un número muy alto de posibles divisiones reducirá la decoración deseada de los árboles en el conjunto. extraTrees y Rborist solo prueban una submuestra de divisiones catagóricas en cada nodo. Eso puede ayudar a la descorrelación y ciertamente a la velocidad. Por lo tanto, es posible una gama de soluciones entre "randomForest try any split" y "sklern dummy-variable only try 1-vs-rest splits". También pueden resultar útiles las agrupaciones diferentes de los muchos niveles en menos niveles.
Soren Havelund Welling
4

Hay otro enfoque para tratar con variables categóricas que se denomina codificación de destino / impacto.

En este esquema, la idea es codificar la entidad utilizando una sola columna flotante en la que el valor es el promedio de la variable objetivo en todas las filas que comparten la categoría. Esto es especialmente útil para los modelos basados ​​en árboles, ya que impone una relación de orden dentro de la característica (es decir, los valores a la derecha de la categoría tienen una respuesta media más alta que los valores a la izquierda) y facilita la división del espacio del predictor.

Aquí hay una buena explicación del tema:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

Y aquí hay un enlace al documento que originalmente propuso la codificación: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Hay algunos detalles más para evitar estimar la media en categorías con recuentos bajos y también hay otro modelo, CatBoost, que propone una solución al sesgo introducido por esta codificación, pero en mi experiencia es una forma simple y muy útil de codificar variables categóricas de alta cardinalidad. .

Ludecan
fuente