Keras de pronóstico de series temporales multidimensionales y multivariantes (RNN / LSTM)

12

He estado tratando de entender cómo representar y dar forma a los datos para hacer una predicción de series de tiempo multidimensional y multivariante usando Keras (o TensorFlow), pero todavía no estoy muy claro después de leer muchas publicaciones / tutoriales / documentación del blog sobre cómo presentar los datos en el forma correcta (la mayoría de los ejemplos son un poco menos

Mi conjunto de datos:

  • varias ciudades
  • para lo cual tengo información sobre decir temperatura, tráfico de vehículos, humedad
  • por ejemplo los últimos 2 años (un registro por cada día)

Lo que quiero hacer: me gustaría pronosticar para cada ciudad las temperaturas que puedo esperar para el próximo año utilizando una versión posiblemente retrasada de la temperatura, el tráfico de automóviles y la humedad (por supuesto, habría varias características más, pero esto es solo un ejemplo para el pensamiento).

De qué estoy confundido: si tengo 2 ciudades, para las cuales grabé 3 funciones durante 365 días. ¿Cómo debo configurar mi entrada para que el modelo pueda generar un pronóstico para 365 días para estas dos ciudades (es decir, 2 series temporales de temperaturas durante 365 días)?

Intuitivamente, la forma del tensor sería (?, 365, 3)por 365 días y 3 características. Pero no estoy seguro de qué incluir en la primera dimensión y, lo más importante, me sorprendería si tuviera que ser por la cantidad de ciudades. Pero al mismo tiempo, no tengo idea de cómo especificar en el modelo que tiene que entender las dimensiones correctamente.

Cualquier puntero será útil. Estoy bastante familiarizado con el resto del problema (es decir, cómo se construye una red en Keras, etc., ya que lo he hecho para otras redes neuronales, pero más específicamente, cómo codificar mejor la secuencia para la entrada deseada).

Ah, y también , creo que podría entrenar y predecir para cada ciudad de forma independiente, pero estoy seguro de que todos estarán de acuerdo en que probablemente haya cosas que aprender que no son particulares de ninguna ciudad, pero que solo se pueden ver si se consideran varias de ellas, por eso creo que es importante codificarlo en el modelo.

Bastien
fuente
1
Aquí hay un buen tutorial sobre este tema: tensorflow.org/beta/tutorials/text/time_series
CubeBot88

Respuestas:

13

La forma de entrada para un LSTM debe ser (num_samples, num_time_steps, num_features). En su caso de ejemplo, combinar ambas ciudades como entrada num_featuresserá 2x3 = 6.

Si agrupa todos sus pasos de 365 tiempos en una muestra, la primera dimensión será 1: ¡una sola muestra! También puede hacer una verificación de cordura utilizando el número total de puntos de datos. Tiene 2 ciudades, cada una con 365 pasos de tiempo y 3 características: 2x365x3 = 2190. Obviamente, esto es lo mismo que 1x365x6 (como dije anteriormente), por lo que sería una posibilidad (Keras se ejecutará), pero obviamente no aprenderá a generalizar en absoluto, solo dándole una muestra.

Eche un vistazo a esta pregunta relevante , que respondí recientemente. Allí hablo un poco sobre el uso de una ventana móvil (verifique los comentarios de la respuesta para obtener más información). Eso le comprará más muestras si las necesita.

Si desea entrenar un solo modelo con datos para ambas ciudades como entrada, hacer predicciones para ambas ciudades en cada paso de tiempo es tan simple como definir una Densecapa final , que genera 2 unidades. Sus datos de validación / prueba deben, por supuesto, contener una tupla de (city1, city2).

Una forma quizás más sofisticada de abordar esto sería crear conjuntos de datos en una sola ciudad, luego entrenar varios submodelos en cada ciudad individualmente (por ejemplo, para 5 capas), luego Merge/ Concatenateellos y colocar varias capas adicionales en la parte superior. Esto significará que está combinando las características aprendidas de cada ciudad, que a su vez se están combinando a un nivel más alto de abstracción. Aquí está la primera imagen que obtuve de un motor de búsqueda , que esboza la idea.

n1k31t4
fuente
¡Muchas gracias por tomarse el tiempo de responder tan claramente! Tiene mucho sentido ahora. Pero, de hecho, lo que temía es que hacer la primera solución que explicaste evitará una gran generalización. ¿Sin embargo, el enfoque de ventana deslizante realmente permitiría mucha generalización en todas las ciudades?
Bastien
¡De nada! Las redes profundas siempre se benefician de más datos. Mis sugerencias anteriores contendrían muchos parámetros: con solo 365 puntos, corre el riesgo de sobreajustar a esas ciudades (es decir, sin generalización). Puede probar el aumento de datos , cómo depende de sus datos. Si tuviera suficientes datos, podría generalizar bien: me imagino un resultado de tipo Word2Vec (común en análisis de texto / PNL), donde las relaciones entre variables se vuelven interpretables. Mira esto para obtener información , y esto para más intuición / diversión . ¡Sus resultados pueden trazar un mapa del tiempo!
n1k31t4
Sí, tiene sentido, por lo que trabajar en algunas ventanas móviles podría engañar a "más datos" en una especie de si entiendo lo que dijo.
Bastien
Suponiendo que pronostique el mañana en función de los últimos 100 días, el estado del sistema probablemente no haya cambiado tan extremadamente desde ayer (si está haciendo ventanas móviles), en comparación con hace un año (sin usar ventanas móviles). Si bien técnicamente crea más muestras, no está creando nuevos puntos de datos, sino que predice que el modelo se centre en fragmentos más pequeños de uno en uno. Esta granularidad más alta le permitirá hacer declaraciones estadísticas mejores (más uniformes) sobre los resultados, en comparación con ajustar todos los datos y hacer una predicción. Disminuye la incertidumbre en los resultados.
n1k31t4
¡convenido! ¿Y la ventana móvil no evitaría que la celda de memoria aprenda dependencias de ira prolongada?
Bastien