Estás leyendo la publicación: Modelado estructural de series temporales con TensorFlow Probability
Sería realmente fascinante si conociéramos el futuro de nosotros mismos, pero predecir eventos futuros es muy incierto. Esta incertidumbre podría disminuir pronosticando eventos futuros, que es una de las partes críticas de la predicción. Los datos que varían con el tiempo podrían ayudar a comprender las tendencias, la estacionalidad y las fluctuaciones cíclicas de los desarrollos históricos. Un modelo de serie temporal estructural es uno que se construye a partir de partes que pueden interpretarse directamente. Este artículo se centrará en la construcción de un modelo de pronóstico con el modelado de probabilidad de TensorFlow. Los siguientes son los temas a tratar.
Tabla de contenido
- Serie temporal estructural
- Probabilidad de TensorFlow
- Construyendo un modelo de pronóstico bayesiano con Tensorflow
Hacer predicciones científicas basadas en datos con marcas de tiempo históricas se conoce como pronóstico de series de tiempo. Comprendamos los conceptos básicos de las series de tiempo estructurales.
Serie temporal estructural
El enfoque más popular para predecir una serie de tiempo que ha sido autorregresiva integrada con la metodología de promedio móvil (ARIMA) se llama Serie de tiempo, que es un proceso estocástico indexado por tiempo. El método ARIMA convencional solo depende de datos sin entender el método a través del cual se obtienen los datos. Los modelos estructurales, por otro lado, investigan si los patrones previstos por cada componente (lineal, estacional, aleatorio) son precisamente lo que se requiere. Los modelos de estructura son más adaptables en el proceso de predicción debido a esta característica.
En el modelo de serie temporal estructural, los datos observados se crean a partir del espacio de estados, un proceso no observado, y los datos observados se forman a partir del espacio de estados con ruido adicional. Las series de tiempo estructurales modelan este espacio de estado invisible en lugar de los datos observables. Antes de incorporarse a un modelo de espacio de estados, los componentes no observados subyacentes, incluida la tendencia, la estacionalidad, el ciclo y los impactos de las variables explicativas y de intervención, se identifican por separado.
Hay cuatro componentes en una tendencia de datos de series de tiempo, estacionalidad, efectos de impacto y ruido. Estos componentes se combinan para formar una observación.
Tendencia
La tendencia revela un patrón típico en los datos. Durante un período de tiempo determinado y prolongado, podría aumentar, disminuir, subir o bajar. La tendencia es una dirección general consistente a largo plazo del flujo de datos. No es necesario que los datos se muevan de la misma manera para que haya una tendencia. Durante un período de tiempo prolongado, el movimiento o la dirección pueden fluctuar, pero la tendencia subyacente no debe cambiar en una tendencia.
estacionalidad
Las variaciones estacionales son cambios a corto plazo, a menudo en menos de un año, en series temporales. En el transcurso de los 12 meses de la serie temporal, a menudo exhiben la misma tendencia de crecimiento, ya sea hacia arriba o hacia abajo. Los horarios por horas, días, semanas, trimestres y meses se utilizan con frecuencia para realizar un seguimiento de estas variaciones.
Efectos de impacto
Los efectos de impacto son variaciones de series de tiempo que duran más de un año y ocurren por sí solas. Tales oscilaciones temporales sustanciales suelen durar más de un año. Un ciclo o “ciclo económico” es el nombre de un tiempo operativo completo.
Ruido
En el caso de las series temporales, se puede observar un tipo adicional de movimiento. Es un movimiento puramente errático e irregular. No se puede utilizar ninguna tendencia o hipótesis, como su nombre lo indica, para inferir movimientos erráticos o aleatorios en una serie de tiempo. Estos resultados son caóticos, impredecibles, inmanejables e inesperados.
¿Está buscando un repositorio completo de bibliotecas de Python utilizadas en ciencia de datos, echa un vistazo aquí.
Probabilidad de TensorFlow
La probabilidad de TensorFlow se basa en la red neuronal bayesiana, que utiliza la probabilidad bayesiana como núcleo de los cálculos. Para evitar el sobreajuste, las redes neuronales bayesianas (BNN) son redes neuronales convencionales que se han ampliado con inferencia posterior. Desde un punto de vista más amplio, el enfoque bayesiano utiliza métodos estadísticos de modo que todas las variables, incluidos los parámetros del modelo, están asociadas con una distribución de probabilidad (pesos y sesgos en las redes neuronales). Las variables en los lenguajes de programación que aceptan un valor específico producen el mismo resultado cada vez que se accede a ellas. Comencemos actualizando un modelo lineal básico que utiliza la suma ponderada de varias características de entrada para predecir la salida.
Para leer más sobre la probabilidad de TensorFlow, puede leer aquí.
Construyendo un modelo de pronóstico bayesiano con Tensorflow
Para este artículo, crear datos personalizados y considerarlos como un índice de precios de acciones para una empresa del año 2000 al 2021. Como el enfoque principal de este artículo es construir un modelo de pronóstico bayesiano para no perder mucho tiempo en el análisis de los componentes estructurales de la serie temporal.
Comencemos con la importación de las dependencias necesarias.
import matplotlib.pyplot as plt import seaborn as sns import matplotlib.dates as mdates import numpy as np import pandas as pd import tensorflow.compat.v2 as tf import tensorflow_probability as tfp from tensorflow_probability import distributions as tfd from tensorflow_probability import sts tf.enable_v2_behavior( )
El dispositivo GPU es opcional, si está conectado, el modelo se procesará rápido y, de lo contrario, llevará tiempo procesarlo, pero en ambos escenarios, el trabajo estaría hecho.
Crear los datos personalizados
compartir_por_mes = np.array(‘320.62,321.60,322.39,323.70,324.08,323.75,322.38,320.36,318.64,318.10,319.78,321.03.split(‘,’)).astype(np.float32) num_fore cast_steps = 120 datos_entrenamiento = compartir_por_mes[:num_forecast_steps]
start_date= “2000-01” end_date = “2021-02″ share_dates = np.arange(start_date, end_date, dtype=”datetime64[M]”)
No se puede mostrar el conjunto porque es una matriz que hace referencia al cuaderno de Colab en la sección de referencias. Visualicemos los datos.
plt.figure(figsize=(12, 6)) sns.lineplot(x=share_dates[:num_forecast_steps]y=datos_de_entrenamiento, lw=2, label=”datos de entrenamiento”) plt.ylabel(“Precio de la acción por unidad (rupias)”) plt.xlabel(“Año”) plt.title(“Precio de la acción en los últimos 10 años” , tamaño de fuente=15) plt.mostrar()
Los datos están listos, ahora es el momento de definir los componentes del modelo. Como sabemos, el modelo de serie temporal se compone de varios componentes, como la tendencia y la estacionalidad. En los datos utilizados para este artículo, la tendencia es un incremento lineal y para la estacionalidad queremos que el modelo aprenda los cambios anuales, por lo que establece la temporada en ’12’.
def definición_componentes(serie_tiempo_observado): tendencia = sts.LocalLinearTrend(serie_tiempo_observado=serie_tiempo_observado) estacional = tfp.sts.Seasonal( num_temporadas=12, serie_tiempo_observado=serie_tiempo_observado) modelo = sts.Sum([trend, seasonal]observado_tiempo_series=observado_tiempo_series) modelo de retorno
Usaremos la inferencia variacional para ajustar el modelo. Esto implica el uso de un optimizador para reducir una función de pérdida variacional, el límite inferior para evidencia negativa (ELBO). Esto se ajusta a una serie de distribuciones posteriores estimadas para los parámetros (en la práctica, asumimos que son normales independientes transformadas en el espacio de soporte de cada parámetro).
variaciones_posteriores = tfp.sts.build_factored_surrogate_posterior( model=ts_share_model) elbo_loss_curve = tfp.vi.fit_surrogate_posterior( target_log_prob_fn=ts_share_model.joint_distribution(observed_time_series=training_data).log_prob, surrogate_posterior=variational_posteriors, Optimizer=tf.optimizers. Adán(tasa_de_aprendizaje=0.1), num_steps=num_variational_steps, jit_compile=True)
Como se observa con 200 iteraciones se ha alcanzado la pérdida mínima. Se puede experimentar con el número de iteraciones según los datos.
Ahora vamos a crear un pronóstico utilizando el modelo ajustado. La distribución pronosticada en los próximos períodos de tiempo está representada por una instancia de distribución de TensorFlow devuelta por la simple llamada “tfp.sts.forecast”.
num_samples=120 pred, pred_std, Forecast_samples = ( share_forecast_dist.mean().numpy()[…, 0]share_forecast_dist.stddev().numpy()[…, 0]share_forecast_dist.sample(num_samples).numpy()[…, 0])
En particular, la media y la desviación estándar de la distribución del pronóstico nos brindan una predicción con poca incertidumbre en cada paso de tiempo, y también podemos crear muestras de futuros potenciales.
La parte naranja son las previsiones y la parte azul son los datos reales. Como se observa, la desviación del pronóstico aumenta con el tiempo. El valor medio del pronóstico está representado por la línea de puntos.
errores_predicción=datos_entrenamiento-pred errores_promedio = errores_predicción.promedio() errores_std = errores_predicción.std()
Como se observa en el gráfico anterior, la distribución del error está muy sesgada con la parte negativa. Esto significa que los valores pronosticados son mucho más altos que los observados, lo que también podría verse en el pronóstico. Este modelo definitivamente necesita mejoras.
Conclusión
Los modelos diseñados utilizando programación probabilística ayudan en la toma de decisiones en condiciones inciertas. Un modelo conocido como Serie temporal estructural bayesiana se crea cuando se aplica la probabilidad bayesiana a la serie temporal estructural. Se expresa como un total de varios elementos, incluidas tendencias, patrones estacionales, ciclos y residuos. Con este artículo hemos entendido el modelado probabilístico en datos de series temporales estructurales.