Fecha / hora de codificación (datos cíclicos) para redes neuronales

12

¿Cómo codificar la fecha y hora de un evento para una red neuronal?

No tengo una serie temporal continua, sino algunos eventos con fecha y hora, y analizo algún tipo de interés. Este interés difiere entre las mañanas y las tardes, y difiere entre los días de la semana, y entre el verano y el invierno, y antes de Navidad y Pascua, y así sucesivamente. Y los eventos en sí mismos tienen una fuerte distribución no uniforme a lo largo del tiempo (más de día que de noche, algunos tipos más durante la semana, algunos más durante el fin de semana).

Intenté codificarlo como Número de semana en el año, como Día de la semana 1-7 y como Hora del día. Pero jugar con un autoencoder escaso me dio la impresión de que mis datos no tienen ningún sentido para una red neuronal, ni siquiera podría reproducir nada cerca de la entrada, incluso con una gran capa oculta. Ni como 0-1 categorial ni como valores normalizados.

Pero la búsqueda de la codificación del tiempo para una red neuronal proporciona principalmente información sobre series de tiempo, por lo que estoy un poco con los ojos vendados por el bosque pero en busca del árbol.

Por supuesto, podría mirar los datos y clasificarlos más o menos despóticos. Pero el concepto de Deep Learning parece eliminar toda la extracción manual de funciones hecha a mano. Y la categorización insertaría grandes saltos en una variable de entrada naturalmente continua.

Mi "codificación natural" en mi cerebro es más como una membresía difusa en algunas categorías como "noche", "mañana", "día de la semana", etc.

Para hacer todo más interesante, también la variable dependiente contiene esos datos de fecha / hora, pero esa es una pregunta diferente.

EDITAR: De alguna manera relacionada con el tipo de datos cíclicos hay algunas preguntas recientes, como

¿Qué pruebas estadísticas son razonables con este conjunto de datos de hora del día?

Flaschenpost
fuente

Respuestas:

7

Estaba buscando una respuesta a un problema similar y me topé con este hilo. La idea de codificación sinusoidal se explora en esta publicación de blog:

Codificación de características continuas cíclicas: tiempo de 24 horas

La respuesta de Ian se ocupó completamente de mis necesidades, así que pensé en publicarla aquí para recordarla en el futuro.

João Paulo Figueira
fuente
Me pregunto cómo se puede usar stackoverflow.com/questions/59653862/… , especialmente cuando el tiempo son características.
user4581
1

Podría intentar representar el tiempo como una matriz grande, es decir, un 365 por 24, para representar los días del año y las horas del día, y luego "desenrollar" esto en un vector de 1 por 8760. El tiempo correspondería a la posición dentro de este vector y el valor en esta posición es el valor en ese momento.

lector de babelproof
fuente
2
¿Has probado y has tenido éxito con una codificación como esa? Me sorprendería si una red neuronal "aprendiera" las posiciones exactas del domingo por la mañana en esta codificación. Pero sorprender a los ingenuos es uno de los puntos fuertes de las redes neuronales, por lo que no apostaría mi escocés contra él. ;-)
flaschenpost
Esto podría ser útil si quisiera detectar eventos cíclicos por la misma hora en varios años, pero me parece que la correlación será muy débil. Puedo ver una mayor probabilidad de una correlación entre la misma hora cada semana, o la misma hora cada día, para la mayoría de los datos de series temporales.
thekingoftruth
1

Sugeriría crear múltiples características de entrada de la serie de tiempo utilizando relaciones que usted sabe (o cree) que ya existen en los datos. Por ejemplo, usted indica que la salida objetivo variará:

entre mañanas y tardes, y difiere entre semana, y entre verano e invierno, ...

Entonces, ¿por qué no crear un conjunto de características que describa cada uno de estos 'ciclos'? Esto puede ayudar a descifrar las variaciones micro y macro en lugar de una sola característica que describe todo.

Por ejemplo...

Si tiene una tendencia por la cual ocurre algo interesante alrededor del mediodía cada día, cree una función del 1 al que describa las horas del día. Ahora la red aprenderá a disparar alrededor de las 12. Compare esto con el caso en que tiene estos mismos datos codificados como horas en una semana . Ahora la red tiene que intentar aprender a disparar en que es significativamente más complejo.1..241..16812,36,60...

GatosLoveJazz
fuente
Sí, esta fue mi primera idea también. Pero el concepto circular del tiempo (a las 23:59 seguido de las 00:00) se oculta, y otra cosa que me molesta es el salto entre los números aparentemente completos: un evento a las 09:55 es muy similar a las 10:05, pero en la mañana 06:10 es muy diferente de 06:55. Podría imaginar buscar centros de la época (¿óptica o similar?) Y luego medir y dar la distancia a esos centros. Entonces, las 04:30 am es la noche más profunda, mientras que las 05:30 es más "matutina", pero no es como la noche.
flaschenpost
1
Bueno, en ese caso, podría intentar codificar como sinusoide o coseno, o de hecho ambos.
CatsLoveJazz