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.
Extraemos data de temperatura, presión, etc...
Nos concentramos en la temperatura, creamos un nuevo dataframe llamado temp.
Vemos que los datos tienen cierta regularidad. Debería ser posible hacer una predicción. Preparando la data para el forecast, tenemos que lograr esto, en nuestra serie de tiempo:
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.
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
Conv es un modelo para matrices en 2d pero podemos utilizarlo en 1d también, tenemos que considerar los parámetros correctos (Los parámetros pueden ser consultados ejecutando model.summary()). La ventaja es que la cantidad de parámetros de este modelo es más baja, con respecto a LSTM. Esto nos da ventaja desde el punto de vista computacional (se ejecuta más rápido).
Modelo GRU
Consideramos un nuevo modelo, GRU. Este modelo tiene menos parámetros respecto a LSTM, pero más respecto a 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.
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.