¿Funciones de codificación como mes y hora como categoriales o numéricas?

23

¿Es mejor codificar características como mes y hora como factor o numérico en un modelo de aprendizaje automático?

Por un lado, creo que la codificación numérica podría ser razonable, porque el tiempo es un proceso progresivo (el quinto mes es seguido por el sexto mes), pero por otro lado, creo que la codificación categorial podría ser más razonable debido a la naturaleza cíclica de años y días (al mes 12 le sigue el primero).

¿Existe una solución o convención general para esto?

Julian
fuente
Enfrenté el mismo problema al definir la variable de hora del día (1 a 24) en el modelo de RF. Si convierto la variable en categórica, la función VarImp muestra un valor de importancia para cada hora y se ve muy desorganizada. Me pregunto si es necesario convertir la variable numérica del tipo 'hora del día' en categórica.
Mahmudur Rahman

Respuestas:

19

¿Ha considerado agregar la transformación (seno, coseno) de la variable de hora del día? Esto asegurará que las 0 y 23 horas, por ejemplo, estén cerca una de la otra, permitiendo así que la naturaleza cíclica de la variable brille.

( Más información )

Pablo O
fuente
tipo de problema con esto porque si lo hago: sin (pi * X / 24) donde X en [0, 23] tenemos la misma evaluación para 6 am y 6 pm que sin (pi * 6/24) == sin (pi * 18/24). pero estas son horas totalmente diferentes
Eran Moshe
Puede hacer el ciclo así: sin (pi * X / 12). Gracias Eran:]
Eran Moshe
@EranMoshe fyi en la publicación del enlace de arriba usan un factor de 2 * pi en su lugar, por lo que sería pecado (2 * pi * X / 12) - dan algunos razonamientos para esto en los comentarios
tsando
Y es (2 * pi X / 24) que es (pi X / 12):] Como puede ver, he luchado con exactamente el mismo problema que el autor de blog.davidkaleko.com/feature-engineering-cyclical-features.html fue luchado con. Y en los comentarios puedes ver a "Mariel G" corrigiéndolo exactamente como me di cuenta: pi * X / 12 circulará durante la hora del día. ¡Lo que también aprendí es que debes tomar los componentes cos y sin de esto para definir un verdadero período de 24 horas! (necesitas un círculo verdadero, y no solo una función periódica)
Eran Moshe
@EranMoshe ah sí, si quieres hacerlo durante horas, entonces se puede reducir a piX / 12, pero si quieres hacer meses, entonces sería 2piX / 12, es decir, pi / 6. Entonces, en general, sería 2piX / período
tsando
9

La respuesta depende del tipo de relaciones que desee representar entre la característica de tiempo y la variable de destino.

Si codifica el tiempo como numérico, está imponiendo ciertas restricciones al modelo. Para un modelo de regresión lineal, el efecto del tiempo ahora es monótono, ya sea que el objetivo aumente o disminuya con el tiempo. Para los árboles de decisión, los valores de tiempo cercanos entre sí se agruparán.

Codificar el tiempo como categórico le da al modelo más flexibilidad, pero en algunos casos, el modelo puede no tener suficientes datos para aprender bien. Una técnica que puede ser útil es agrupar valores de tiempo en un cierto número de conjuntos y usar el conjunto como un atributo categórico.

Algunos grupos de ejemplos:

  • Por mes, agrupe en cuartos o estaciones, dependiendo del caso de uso. Por ejemplo: enero-marzo, abril-junio, etc.
  • Para la hora del día, agrupe en cubos de la hora del día: mañana, tarde, etc.
  • Para el día de la semana, agrupe en día laborable, fin de semana.

Cada uno de los anteriores también se puede usar directamente como un atributo categórico, dados los datos suficientes. Además, las agrupaciones también se pueden descubrir mediante análisis de datos, para complementar un enfoque basado en el conocimiento del dominio.

raghu
fuente
4

Recomiendo usar características numéricas. El uso de características categóricas significa esencialmente que no considera la distancia entre dos categorías como relevante (por ejemplo, la categoría 1 está tan cerca de la categoría 2 como de la categoría 3). Este definitivamente no es el caso durante horas o meses.

Sin embargo, el problema que plantea es que desea representar las horas y los meses de manera que 12 sea tan cercano a 11 como a 1. Para lograrlo, le recomiendo ir con lo sugerido en los comentarios y usar una función seno / coseno antes de usar las horas / meses como características numéricas.

Tanguy Coatalem
fuente
3

Depende de qué algoritmo estés usando.

Si está utilizando algoritmos basados ​​en árboles como bosque aleatorio, simplemente pase esta pregunta. La codificación categórica no es necesaria para los algoritmos basados ​​en árboles.

Para otros algoritmos como la red neuronal, sugiero probar ambos métodos (continuo y categórico). El efecto difiere entre diferentes situaciones.

Icyblade
fuente
Depende de la implementación basada en el árbol. Los paquetes ampliamente utilizados como scikit-learn y xgboost no reconocen variables categóricas. Se espera que los codifique en caliente.
Ricardo Cruz
De esta publicación: intodatascience.com/… no deberías usar uno caliente para nada basado en árboles de decisión, que es más o menos lo que estoy descubriendo por las malas.
ashley
1

Debido a que todos los datos que tiene están bien definidos, le sugiero una codificación categórica, que también es más fácil de aplicar.

simonepi
fuente
1

Para reformular la respuesta proporcionada por @raghu . Una diferencia importante entre las características categóricas y numéricas es si la magnitud de los números es comparable, es decir, ¿2019 es más grande que 2018 o diciembre (12) más grande que marzo (3)? Realmente no. Si bien hay un orden secuencial en estos números, su magnitud no es comparable. Por lo tanto, la transformación en un valor categórico puede tener más sentido.

CathyQian
fuente