Path: blob/master/site/es-419/tutorials/structured_data/time_series.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Predicción de series temporales
Este tutorial es una introducción a la predicción de series temporales usando TensorFlow. Construye algunos estilos diferentes de modelos, incluyendo redes neuronales convolucionales y recurrentes (CNNs y RNNs).
Se trata en dos partes principales, con subsecciones:
Predicción para un único paso de tiempo:
Una sola característica.
Todas las características.
Predicción de múltiples pasos:
De una sola vez: Realice todas las predicciones a la vez.
Autorregresivo: Realiza una predicción cada vez y retroalimenta el modelo con el resultado.
Preparación
El conjunto de datos meteorológicos
Este tutorial utiliza un conjunto de datos de series temporales meteorológicas registrados por el Instituto Max Planck de Biogeoquímica.
Este conjunto de datos contiene 14 características diferentes, como la temperatura del aire, la presión atmosférica y la humedad. Se recopilaron cada 10 minutos, a partir de 2003. Para mayor eficacia, sólo se usarán los datos recopilados entre 2009 y 2016. Esta sección del conjunto de datos fue preparada por François Chollet para su libro Aprendizaje Profundo con Python.
Este tutorial sólo se ocupará de las predicciones horarias, así que empiece por submuestrear los datos de intervalos de 10 minutos a intervalos de una hora:
Miremos los datos. Aquí están las primeras filas:
He aquí la evolución de algunas características a lo largo del tiempo:
Inspeccionar y despejar
Luego, observe las estadísticas del conjunto de datos:
Velocidad del viento
Algo que debería destacar son las columnas min
del valor de la velocidad del viento (wv (m/s)
) y el valor máximo (max. wv (m/s)
). Este -9999
es probablemente erróneo.
Existe por separado una columna de dirección del viento, por lo que la velocidad debería ser mayor que cero (>=0
). Reemplácela con ceros:
Ingeniería de características
Antes de meternos de lleno en la construcción de un modelo, debemos entender nuestros datos y asegurarnos de que le estamos pasando al modelo datos con el formato adecuado.
Viento
La última columna de los datos, wd (deg)
, da la dirección del viento en grados. Los ángulos no son un buen tipo de dato para el modelo: 360° y 0° deberían ser próximos entre sí y poder transicionar entre sí sin problemas. La dirección no debería importar si el viento no sopla.
En estos momentos, la distribución de los datos sobre el viento tiene este aspecto:
Pero esto será más fácil de interpretar para el modelo si convierte las columnas de dirección y velocidad del viento en un vector de viento:
La distribución de los vectores de viento es mucho más sencilla de interpretar correctamente por el modelo:
Hora
Del mismo modo, la columna Date Time
es muy útil, pero no en esta forma de cadena. Empiece por convertirla a segundos:
Al igual que la dirección del viento, la hora en segundos no es un dato de entrada útil para el modelo. Al ser datos meteorológicos, tiene una clara periodicidad diaria y anual. Hay muchas formas de tratar la periodicidad.
Puede obtener señales utilizables al usar transformadas de seno y coseno para despejar las señales de "Hora del día" y "Hora del año":
Esto permite al modelo acceder a las frecuencias más importantes. En este caso, usted sabía de antemano qué frecuencias eran importantes.
Si no dispone de esa información, puede determinar qué frecuencias son importantes extrayendo las características con Transformada rápida de Fourier. Para comprobar las premisas, aquí tiene el tf.signal.rfft
de la temperatura a lo largo del tiempo. Observe los picos obvios en las frecuencias cercanas a 1/año
y 1/día
:
Dividir los datos
Usará una subdivisión (70%, 20%, 10%)
para los conjuntos de entrenamiento, validación y prueba. Observe que los datos no se barajan aleatoriamente antes de la subdivisión. Esto es por dos motivos:
Garantiza que el troceado de los datos en ventanas de muestreos consecutivos siga siendo posible.
Garantiza que los resultados de la validación/prueba sean más realistas, al evaluarse sobre los datos recopilados después del entrenamiento del modelo.
Normalizar los datos
Es importante escalar las características antes de entrenar una red neuronal. La normalización es una forma habitual de realizar este escalado: resta la media y divide por las desviaciones estándares de cada característica.
La media y la desviación estándar sólo deben calcularse usando los datos de entrenamiento para que los modelos no tengan acceso a los valores de los conjuntos de validación y prueba.
También puede argumentarse que el modelo no debería tener acceso a los valores futuros del conjunto de entrenamiento cuando se está entrenando, y que esta normalización debería usarse usando promedios móviles. Ese no es el enfoque de este tutorial, y los conjuntos de validación y prueba garantizan que se obtengan métricas (algo) honestas. Así que, en aras de la simplicidad, este tutorial usa un promedio simple.
Ahora, observe la distribución de las características. Algunas características tienen colas largas, pero no hay errores obvios como el valor -9999
de la velocidad del viento.
Generar ventanas de datos
Los modelos de este tutorial configurarán un conjunto de predicciones basadas en una ventana de muestreos consecutivos de los datos.
Las principales características de las ventanas de entrada son:
La anchura (número de pasos de tiempo) de las ventanas de entrada y de etiqueta.
La compensación horaria entre ellos.
Qué características se usan como entradas, etiquetas o ambas.
Este tutorial construye una variedad de modelos (incluyendo modelos lineales, DNN, CNN y RNN), y los usa en ambos casos:
Predicciones de salida única, y de salida múltiple.
Predicciones de un solo paso y un solo tiempo y paso de varios tiempos.
Esta sección se centra en implementar la ventana de datos para que pueda reutilizarse en todos esos modelos.
Según la tarea y el tipo de modelo, es posible que desee generar una variedad de ventanas de datos. He aquí algunos ejemplos:
Por ejemplo, para hacer una única predicción 24 horas en el futuro, dadas 24 horas de historia, podría definir una ventana como ésta:
Un modelo que haga una predicción una hora en el futuro, dadas seis horas de historia, necesitaría una ventana como ésta:
El resto de esta sección define una clase WindowGenerator
. Esta clase puede:
Maneje los índices y las compensaciones como se muestra en los diagramas anteriores.
Divida las ventanas de características en pares
(características, etiquetas)
.Trace el contenido de las ventanas resultantes.
Genere eficazmente lotes de estas ventanas a partir de los datos de entrenamiento, evaluación y prueba, usando
tf.data.Dataset
s.
1. Índices y compensaciones
Comience creando la clase WindowGenerator
. El método __init__
incluye toda la lógica necesaria para los índices de entrada y etiqueta.
También toma como entrada los DataFrames de entrenamiento, evaluación y prueba. Estos se convertirán en tf.data.Dataset
s de ventanas más tarde.
Aquí está el código para crear las 2 ventanas mostradas en los diagramas al principio de esta sección:
2. División
Dada una lista de entradas consecutivas, el método split_window
las convertirá en una ventana de entradas y una ventana de etiquetas.
El ejemplo w2
que definió anteriormente se dividirá así:
Este diagrama no muestra el eje features
de los datos, pero esta función split_window
también gestiona las label_columns
, por lo que puede usarse tanto para los ejemplos de salida única como para los de salida múltiple.
Haga la prueba:
Típicamente, los datos en TensorFlow se empaquetan en arreglos donde el índice más externo recorre los ejemplos (la dimensión "lote"). Los índices intermedios son la(s) dimensión(es) "tiempo" o "espacio" (anchura, altura). Los índices más internos son las características.
El código anterior toma un lote de tres ventanas de 7 pasos de tiempo con 19 características en cada uno. Las divide en un lote de entradas de 6 pasos de tiempo con 19 características y una etiqueta de 1 paso de tiempo con 1 característica. La etiqueta sólo tiene una característica porque el WindowGenerator
se inicializó con label_columns=['T (degC)']
. Inicialmente, este tutorial construirá modelos que predicen etiquetas de salida únicas.
3. Graficar
He aquí un método de graficado que permite una visualización sencilla de la ventana dividida:
Este gráfico alinea las entradas, las etiquetas y las predicciones (posteriores) en función del tiempo al que se refiere el artículo:
Puede graficar las otras columnas, pero la configuración de la ventana de ejemplo w2
sólo tiene etiquetas para la columna T (degC)
.
4. Crear tf.data.Dataset
s
Por último, este método make_dataset
tomará un DataFrame de series temporales y lo convertirá en un tf.data.Dataset
de pares (input_window, label_window)
utilizando la función tf.keras.utils.timeseries_dataset_from_array
:
El objeto WindowGenerator
contiene los datos de entrenamiento, validación y prueba.
Añada propiedades para accesarlas como tf.data.Dataset
s usando el método make_dataset
que definió anteriormente. Añada también un lote de ejemplo estándar para facilitar el acceso y la graficación:
Ahora, el objeto WindowGenerator
le da acceso a los objetos tf.data.Dataset
, por lo que puede iterar fácilmente sobre los datos.
La propiedad Dataset.element_spec
le indica la estructura, los tipos de datos y las formas de los elementos del conjunto de datos.
Al iterar sobre un Dataset
se obtienen lotes concretos:
Modelos de un solo paso
El modelo más sencillo que se puede construir con este tipo de datos es el que predice el valor de una sola característica en 1 paso de tiempo (una hora) en el futuro basándose únicamente en las condiciones actuales.
Así pues, empiece construyendo modelos para predecir el valor de T (degC)
una hora en el futuro.
Configure un objeto WindowGenerator
para producir estos pares (input,label)
en un solo paso:
El objeto window
crea tf.data.Dataset
s a partir de los conjuntos de entrenamiento, validación y prueba, lo que le permite iterar fácilmente sobre lotes de datos.
Linea de referencia
Antes de construir un modelo entrenable sería bueno tener una línea de referencia de rendimiento como punto de comparación con los modelos posteriores más complicados.
Esta primera tarea consiste en predecir la temperatura una hora en el futuro, dado el valor actual de todas las características. Los valores actuales incluyen la temperatura actual.
Así pues, empiece con un modelo que sólo devuelva la temperatura actual como predicción, pronosticando "Sin cambios". Se trata de una línea de referencia razonable, ya que la temperatura cambia lentamente. Por supuesto, esta línea de referencia funcionará peor si hace una predicción más lejana en el futuro.
Instanciar y evaluar este modelo:
Eso imprimió algunas métricas de rendimiento, pero no le dan una idea de lo bien que va el modelo.
El WindowGenerator
tiene un método de graficación, pero los gráficos no serán muy interesantes con un solo muestreo.
Por tanto, cree un WindowGenerator
más amplio que genere ventanas de 24 horas de entradas y etiquetas consecutivas a la vez. La nueva variable wide_window
no cambia el funcionamiento del modelo. El modelo sigue haciendo predicciones una hora en el futuro basándose en un único paso de tiempo de entrada. Aquí, el eje time
actúa como el eje batch
: cada predicción se realiza de forma independiente sin interacción entre los pasos de tiempo:
Esta ventana ampliada puede pasarse directamente al mismo modelo baseline
sin ningún cambio de código. Esto es posible porque las entradas y las etiquetas tienen el mismo número de pasos de tiempo, y la línea de referencia sólo reenvía la entrada a la salida:
Al graficar las predicciones del modelo base, observe que se trata simplemente de las etiquetas desplazadas una hora hacia la derecha:
En los gráficos anteriores de tres ejemplos, el modelo de un solo paso se ejecuta en el transcurso de 24 horas. Esto merece una explicación:
La línea azul
Inputs
muestra la temperatura de entrada en cada paso de tiempo. El modelo recibe todas las características, este gráfico sólo muestra la temperatura.Los puntos verdes
Labels
muestran el valor de predicción objetivo. Estos puntos se muestran en el momento de la predicción, no en el momento de la entrada. Por eso el rango de etiquetas está desplazado 1 paso con respecto a las entradas.Las cruces naranjas
Predictions
son las predicciones del modelo para cada paso de tiempo de salida. Si el modelo predijera a la perfección, las predicciones caerían directamente sobre lasLabels
.
Modelo lineal
El modelo entrenable más sencillo que puede aplicar a esta tarea es insertar una transformación lineal entre la entrada y la salida. En este caso, la salida de un paso temporal sólo depende de ese paso:
Una capa tf.keras.layers.Dense
sin un conjunto de activation
es un modelo lineal. La capa sólo transforma el último eje de los datos de (batch, time, inputs)
a (batch, time, units)
; se aplica independientemente a cada artículo a través de los ejes batch
y time
.
Este tutorial entrena muchos modelos, así que empaquete el procedimiento de entrenamiento en una función:
Entrene el modelo y evalúe su rendimiento:
Al igual que el modelo baseline
, el modelo lineal puede invocarse en lotes de ventanas amplias. Usado de esta manera, el modelo configura un conjunto de predicciones independientes en pasos de tiempo consecutivos. El eje time
actúa como otro eje batch
. No hay interacciones entre las predicciones en cada paso de tiempo.
Este es el gráfico de sus predicciones de ejemplo en la wide_window
, observe cómo en muchos casos la predicción es claramente mejor que devolver simplemente la temperatura de entrada, pero en unos pocos casos es peor:
Una ventaja de los modelos lineales es que son relativamente sencillos de interpretar. Puede extraer las ponderaciones de las capas y visualizar la ponderación asignada a cada entrada:
A veces, el modelo ni siquiera pone la mayor ponderación en la entrada T (degC)
. Este es uno de los riesgos de la inicialización aleatoria.
Dense
Antes de aplicar modelos que operen realmente en múltiples pasos de tiempo, vale la pena comprobar el rendimiento de modelos más profundos y potentes de un solo paso de entrada.
Éste es un modelo similar al linear
, salvo que apila varias capas Dense
entre la entrada y la salida:
Dense multipaso
Un modelo de un solo paso de tiempo no tiene contexto para los valores actuales de sus entradas. No puede ver cómo cambian las características de entrada a lo largo del tiempo. Para resolver este problema, el modelo necesita tener acceso a múltiples pasos de tiempo a la hora de hacer predicciones:
Los modelos baseline
, linear
y dense
tratan cada paso de tiempo de forma independiente. Aquí el modelo tomará múltiples pasos de tiempo como entrada para producir una única salida.
Cree un WindowGenerator
que producirá lotes de entradas de tres horas y etiquetas de una hora:
Fíjese en que el parámetro Window
de shift
es relativo al final de las dos ventanas.
Puede entrenar un modelo dense
en una ventana de múltiples pasos de entrada añadiendo un tf.keras.layers.Flatten
como primera capa del modelo:
El principal inconveniente de este enfoque es que el modelo resultante sólo puede ejecutarse en ventanas de entrada de exactamente esta forma.
Los modelos convolucionales de la siguiente sección solucionan este problema.
Red neuronal de convolución
Una capa de convolución (tf.keras.layers.Conv1D
) también toma múltiples pasos de tiempo como entrada para cada predicción.
A continuación se muestra el mismo modelo que multi_step_dense
, reescrito con una convolución.
Observe los cambios:
El
tf.keras.layers.Flatten
y el primertf.keras.layers.Dense
son sustituidos por untf.keras.layers.Conv1D
.El
tf.keras.layers.Reshape
deja de ser necesario puesto que la convolución conserva el eje temporal en su salida.
Ejecútelo en un lote de ejemplo para verificar que el modelo produce salidas con la forma esperada:
Entrénelo y evalúelo en el modelo conv_window
y debería dar un rendimiento similar al modelo multi_step_dense
.
La diferencia entre este modelo conv_model
y el modelo multi_step_dense
es que el modelo conv_model
puede ejecutarse con entradas de cualquier longitud. La capa convolucional se aplica a una ventana deslizante de entradas:
Si lo ejecuta en una entrada más amplia, produce una salida más amplia:
Observe que la salida es más corta que la entrada. Para que el entrenamiento o la graficación funcionen, es necesario que las etiquetas y la predicción tengan la misma longitud. Así que construya un WindowGenerator
para producir ventanas amplias con algunos pasos de tiempo de entrada adicionales para que las longitudes de la etiqueta y la predicción coincidan:
Ahora, puede graficar las predicciones del modelo en una ventana más amplia. Observe los 3 pasos de tiempo de entrada antes de la primera predicción. Cada predicción aquí se basa en los 3 pasos de tiempo precedentes:
Red neuronal recurrente
Una red neuronal recurrente (RNN) es un tipo de red neuronal muy adecuada para los datos de series temporales. Las RNN procesan una serie temporal paso a paso, manteniendo un estado interno de paso de tiempo en paso de tiempo.
Puede obtener más información en el tutorial Generación de texto con una RNN y en la guía Redes neuronales recurrentes (RNN) con Keras.
En este tutorial, usará una capa RNN llamada Memoria a corto-largo plazo (tf.keras.layers.LSTM
).
Un argumento importante del constructor para todas las capas RNN de Keras, como tf.keras.layers.LSTM
, es el argumento return_sequences
. Este parámetro puede configurar la capa de dos maneras:
Si es
False
, el predeterminado, la capa sólo devuelve la salida del último paso de tiempo, dando tiempo al modelo para calibrar su estado interno antes de hacer una sola predicción:
Si es
True
, la capa devuelve una salida para cada entrada. Esto es útil para:Apilar capas RNN.
Entrenar un modelo en múltiples pasos de tiempo simultáneamente.
Con return_sequences=True
, el modelo puede entrenarse con 24 horas de datos cada vez.
Nota: Esto dará una visión pesimista del rendimiento del modelo. En el primer paso de tiempo, el modelo no tiene acceso a los pasos anteriores y, por lo tanto, no puede hacerlo mejor que los modelos simples linear
y dense
mostrados anteriormente.
Rendimiento
Con este conjunto de datos, normalmente cada uno de los modelos obtiene resultados ligeramente mejores que el anterior:
Modelos multisalida
Hasta aquí, todos los modelos predijeron una única característica de salida, T (degC)
, para un único paso de tiempo.
Todos estos modelos pueden convertirse para predecir múltiples características simplemente cambiando el número de unidades en la capa de salida y ajustando las ventanas de entrenamiento para incluir todas las características en el labels
(example_labels
):
Observe arriba que el eje features
de las etiquetas tiene ahora la misma profundidad que las entradas, en lugar de 1
.
Linea de referencia
Aquí se puede usar el mismo modelo de línea de referencia (Baseline
), pero esta vez repitiendo todas las características en lugar de seleccionar una label_index
específica:
Dense
RNN
Advanced: Residual connections
El modelo Baseline
utilizado anteriormente se aprovechó del hecho de que la secuencia no cambia drásticamente de un paso de tiempo a otro. Cada modelo entrenado en este tutorial hasta ahora se inicializó aleatoriamente, y luego tuvo que aprender que la salida es un pequeño cambio desde el paso de tiempo anterior.
Aunque puede evitar este problema con una inicialización cuidadosa, es más sencillo incorporarlo a la estructura del modelo.
En el análisis de series temporales es habitual construir modelos que, en lugar de predecir el valor siguiente, predicen cómo cambiará el valor en el siguiente paso de tiempo. Del mismo modo, las redes residuales (o ResNets) en el aprendizaje profundo se refieren a arquitecturas en las que cada capa contribuye al resultado acumulativo del modelo.
Así es como se aprovecha el conocimiento de que el cambio debiera ser pequeño.
Esencialmente, esto inicializa el modelo para que coincida con la Baseline
. Para esta tarea, ayuda a que los modelos converjan más rápido, con un rendimiento ligeramente mejor.
Puede usar este enfoque junto con cualquier modelo analizado en este tutorial.
Aquí, se está aplicando al modelo LSTM; nótese el uso de los tf.initializers.zeros
para asegurar que los cambios predichos iniciales son pequeños, y no saturan la conexión residual. Aquí no hay problemas de ruptura de simetría para los gradientes, ya que los zeros
sólo se usan en la última capa.
Rendimiento
Aquí se muestra el rendimiento global de estos modelos multisalida.
Los rendimientos anteriores se promedian entre todas las salidas del modelo.
Modelos multipaso
Tanto los modelos de salida única como los de salida múltiple de las secciones anteriores hicieron predicciones de un solo paso de tiempo, una hora en el futuro.
En esta sección se estudia cómo ampliar estos modelos para realizar pronósticos de múltiples pasos de tiempo.
En una predicción multipaso, el modelo necesita aprender a predecir una serie de valores futuros. Así, a diferencia de un modelo de un solo paso, en el que sólo se predice un único punto futuro, un modelo multipaso predice una secuencia de los valores futuros.
A grandes rasgos, existen dos enfoques:
Predicciones en un único impulso, en las que se predice toda la serie temporal de una sola vez.
Predicciones autorregresivas en las que el modelo sólo realiza predicciones de un paso y su salida se realimenta como su entrada.
En esta sección, todos los modelos predecirán todas las características a lo largo de todos los pasos de tiempo de salida.
Para el modelo multipaso, los datos de entrenamiento vuelven a consistir en muestreos horarios. Sin embargo, aquí los modelos aprenderán a predecir 24 horas en el futuro, dadas 24 horas del pasado.
Este es un objeto Window
que genera estos cortes a partir del conjunto de datos:
Lineas de referencia
Una línea de referencia sencilla para esta tarea consiste en repetir el último paso de tiempo de entrada durante el número necesario de pasos de tiempo de salida:
Dado que esta tarea consiste en predecir 24 horas en el futuro, dadas 24 horas del pasado, otro enfoque sencillo es repetir el día anterior, suponiendo que mañana será similar:
Modelos de un solo impulso
Un enfoque de alto nivel para este problema es usar un modelo de "impulso único", en el que el modelo realiza toda la predicción de la secuencia en un solo paso.
Esto puede implementarse eficientemente como una tf.keras.layers.Dense
con OUT_STEPS*features
unidades de salida. El modelo sólo tiene que reestructurar esa salida a la (OUTPUT_STEPS, features)
requerida.
Lineal
Un modelo lineal simple basado en el último paso de tiempo de entrada funciona mejor que cualquiera de las líneas de referencia, pero tiene poca potencia. El modelo necesita predecir OUTPUT_STEPS
pasos de tiempo, a partir de un único paso de tiempo de entrada con una proyección lineal. Sólo puede capturar un fragmento de baja dimensión del comportamiento, probablemente basado principalmente en la hora del día y la época del año.
Dense
Si se añade un tf.keras.layers.Dense
entre la entrada y la salida, el modelo lineal adquiere más potencia, pero sigue basándose en un único paso de tiempo de entrada.
CNN
Un modelo convolucional hace predicciones basándose en un historial de ancho fijo, lo que puede conducir a un mejor rendimiento que el modelo denso, ya que puede ver cómo cambian las cosas con el tiempo:
RNN
Un modelo recurrente puede aprender a usar un largo historial de entradas, si es relevante para las predicciones que el modelo está haciendo. Aquí el modelo acumulará el estado interno durante 24 horas, antes de hacer una única predicción para las 24 horas siguientes.
En este formato de un solo impulso, el LSTM sólo necesita producir una salida en el último paso de tiempo, así que configure return_sequences=False
en tf.keras.layers.LSTM
.
Avanzado: Modelo autorregresivo
Todos los modelos anteriores predicen la secuencia de salida completa en un solo paso.
En algunos casos puede ser útil que el modelo desglose esta predicción en pasos de tiempo individuales. Entonces, la salida de cada modelo puede retroalimentarse a sí misma en cada paso y las predicciones pueden hacerse condicionadas por la anterior, como en el clásico Generación de secuencias con redes neuronales recurrentes.
Una clara ventaja de este estilo de modelo es que puede configurarse para producir una salida con una longitud variable.
Podría tomar cualquiera de los modelos multisalida de un solo paso entrenados en la primera mitad de este tutorial y ejecutarlo en un bucle de retroalimentación autorregresiva, pero aquí centrará su atención en construir un modelo que haya sido entrenado explícitamente para ello.
RNN
Este tutorial sólo construye un modelo RNN autorregresivo, pero este patrón podría aplicarse a cualquier modelo diseñado para dar salida a un único paso de tiempo.
El modelo tendrá la misma forma básica que los modelos LSTM de un solo paso que vimos anteriormente: una capa tf.keras.layers.LSTM
seguida de una capa tf.keras.layers.Dense
que convierte las salidas de la capa LSTM
en predicciones del modelo.
Una tf.keras.layers.LSTM
es una tf.keras.layers.LSTMCell
envuelta en la tf.keras.layers.RNN
de nivel superior que administra el estado y secuencia los resultados por usted (Para más detalles, consulte la guía Redes Neuronales Recurrentes (RNN) con Keras).
En este caso, el modelo tiene que administrar manualmente las entradas de cada paso, por lo que usa tf.keras.layers.LSTMCell
directamente para la interfaz de nivel inferior, de un solo paso de tiempo.
El primer método que necesita este modelo es un método warmup
para inicializar su estado interno en función de las entradas. Una vez entrenado, este estado capturará las partes relevantes del historial de entradas. Esto es equivalente al modelo LSTM
de un solo paso visto anteriormente:
Este método devuelve una predicción de un solo paso de tiempo y el estado interno de la LSTM
:
Con el estado de la RNN
y una predicción inicial, puede ahora continuar iterando el modelo retroalimentando las predicciones en cada paso como entrada.
El enfoque más sencillo para recopilar las predicciones de salida es usar una lista Python y un tf.stack
después del bucle.
Nota: Apilar una lista Python como ésta sólo funciona con eager execution, usando Model.compile(..., run_eagerly=True)
para el entrenamiento, o con una salida de longitud fija. Para una longitud de salida dinámica, tendría que usar un tf.TensorArray
en lugar de una lista de Python, y tf.range
en lugar del range
de Python.
Haga una prueba de este modelo con las entradas del ejemplo:
Ahora entrene el modelo:
Rendimiento
En este problema existen claramente rendimientos decrecientes en función de la complejidad del modelo:
Las métricas de los modelos multisalida de la primera mitad de este tutorial muestran el rendimiento promediado en todas las características de salida. Estos rendimientos son similares pero también están promediados a través de los pasos de tiempo de salida.
Las ganancias conseguidas al pasar de un modelo denso a modelos convolucionales y recurrentes son sólo de unos pocos puntos porcentuales (si acaso), y el modelo autorregresivo funcionó claramente peor. Así que estos enfoques más complejos pueden no valer la pena en este problema, pero no había forma de saberlo sin probar y, además, estos modelos podrían ser útiles para su problema.
Siguientes pasos
Este tutorial fue una rápida introducción a la predicción de series temporales usando TensorFlow.
Para saber más, consulte:
Capítulo 15 de Aprendizaje automático práctico con Scikit-Learn, Keras y TensorFlow, 2ª edición.
Capítulo 6 de Aprendizaje Profundo con Python.
Lección 8 de Introducción de Udacity a TensorFlow para aprendizaje profundo, incluyendo los bloc de notas de ejercicios.
Además, recuerde que puede implementar cualquier modelo clásico de series temporales en TensorFlow; este tutorial sólo se enfoca en la funcionalidad incorporada de TensorFlow.