Predicción de Temperaturas
La idea de este proyecto es predecir las temperaturas desde un set de datos y hacer una comparativa entre distintos modelos de predicción LGBM, Conv1D y GRU. Los datos son extraidos desde los datasets públicos de TensorFlow.
Extraemos data de temperatura, presión, etc...
La cantidad de info en muchísima, consideramos la data cada una hora.
Nos concentramos en la temperatura, creamos un nuevo dataframe llamado temp.
Run to view results
El length de X es el window_size.
El shape de X es (N° de filas, N° de col, elementos). Si vemos el dataframe temp, no concuerda la cantidad de datos (70091) con el shape de X (70086). Esto es, porque los últimos 5 terminos de temp no alcanzan a 'iterar' en la función. Ahora definimos los valores de entrenamiento:
Acá, entrenaremos con los primeros 60000 términos. La segunda línea es de validación 60000-65000, estos datos son ocupados por el algoritmo para ajustar sus propios parámetros en cada 'epoch' y dismimuir el error. La tercera línea es de testeo, la usaremos para ver como predice nuestro forecast respecto a datos reales. Importamos los paquetes necesarios y llamamos a nuestro modelo 'model1' que tendrá los parámetros para realizar el forecast.
Graficamos juntos, los 500 primeros datos reales y datos predichos del entrenamiento.
Creamos un dataframe con los datos de validación que utilizó la red neuronal para disminuir el 'validation loss'. Vemos gráficamente, como se comportan los datos reales con los de validación.
Ahora estudiamos como se comportan los datos predichos con los reales.
Condensamos todo en una sola función, para mostrar el dataframe, el 'mean squared error' y el gráfico.
Diferentes modelos, más variables
Modelo Conv1D
Adición de variables temporales
Agregamos variables temporales adicionales en segundos al dataframe. Esto, porque la variable temporal está claramente correlacionada con la forma que varía la temperatura (por ejemplo en invierno la temperatura es mínima y en verano es máxima). La correlación también se observa en un día, durante el mediodía la temperatura es máxima y en la noche es mínima. La función para transformar la variable temporal, tiene que ser sinusoidal, ya que las temperaturas también siguen esta forma. Si logramos que la variable temporal tenga una correlación con la temperatura, esto ayudará al modelo a decrecer su validation loss de manera más eficiente.
Vemos que los segundos parten desde un valor muy grande. Para nuestro cálculo, no es necesario cambiarlo. Si fuera necesario cambiar el tiempo en segundos, solamente tenemos que hacer un shift de los segundos fijando el cero en el primer término.
Agregamos nuevas columnas al dataframe, donde ponemos las sinusoidales aplicadas a la variable temporal. Aplicamos las función sin y cos en la variable temporal de la siguiente manera:
T_day(t) = Sin(t * 2 pi / day), T_day(t) = Cos(t * 2 pi / day), T_year(t) = Sin(t * 2 pi / year), T_year = Cos(t* 2 pi / year)
Claramente, day y year dentro de las funciones son el período de las funciones temporales.
Run to view results
Como vemos, las funciones temporales sinusoidales, entran solamente a la matriz de entrenamiento. Generamos la matriz X, con el siguiente código:
Transformamos nuestro dataframe y verificamos el shape de la matriz X y el vector a predecir y.
Definimos los valores de entrenamiento, de validación y de testeo. Verificamos el shape de los valores.
Para nuestros datos tenemos que aplicar 'standarization'. Esto es porque los valores de temperatura y de tiempo tienen una disparidad importante. Si aplicamos el modelo de esta forma, durante el entrenamiento podría dar una mayor énfasis a variaciones de temperatura que el resto de variables. Esto es así, porque las variaciones de esas variables de temperatura son mayores. Definimos una función de preprocesamiento de los datos de entrenamiento. Esta función cambia los valores en torno al valor promedio, obteniendo valores similares entre todas las variables.
Vemos como se comporta nuestro forecast:
Vemos un MSE aún mas bajo ~0.5. Ahora introducimos la variable de presión al forecast. En este caso, la presión también será un output, teniendo así 2 outputs del forecast. En este caso también consideraremos las funciones temporales del forecast anterior.
Conclusiones
A continuación hacemos un dataframe comparativo, resumiendo los Mean Squared Error (MSE) de todas nuestras predicciones,
graficando,
Vemos un menor error en el modelo LSTM(32)-LSTM(64)-TF-P, en este modelo aplicamos un forecast en cadena LSTM(32) e inmediatamente después un LSTM(64), en este caso consideramos los outputs a testear Temperatura y Presión. Definitivamente, para cualquiera de estos casos es mandatorio aplicar la función temporal al tiempo, agregar este recurso mejora considerablemente el MSE y el algoritmo toma menos tiempo en converger a un valor de MSE adecuado.