Los problemas de series temporales son muy frecuentes, como por ejemplo la predicción de ventas, la demanda de energía, valoración de activos, predicción meteorológica, etc. El factor temporal las hace particulares con problemas y soluciones propias.
El interés por las series temporales ha aumentado a lo largo de los años, pero no ha crecido de manera exponencial como sí lo han hecho áreas como el Machine Learning o el Deep Learning. Esto nos hace plantearnos… “¿Por qué el interés por las time- series no ha crecido de la misma forma en la que lo ha hecho Deep Learning o Machine Learning?
Una posible respuesta a la pregunta anterior es que el efecto que las series temporales tienen como resultado es menos “impactante” que las respuestas que se podrían tener con otros modelos. Pero sin duda, la primera teoría que responde a la pregunta es que las series temporales tienen particularidades que hacen que su procedimiento de trabajo sea más tedioso. A continuación, veremos una a una esas particularidades que complican trabajar con series temporales y cómo afrontarlas.
Entrenamiento con pocos ejemplos
Las series temporales se entrenan con pocos ejemplos, pocas series para cada modelo. El problema es que ante pocos datos de validación es fácil que existan problemas de generalización y de sobre entrenamiento de los modelos.
Para solucionar este problema se puede extender la validación realizando una validación cruzada. Para usar esta validación cruzada se utiliza un periodo de validación de tamaño constante que se va moviendo y el periodo de entrenamiento es todo lo anterior a ese periodo de validación. Otra opción es utilizar una ventana deslizante, en esta el periodo de entrenamiento es del mismo tamaño en cada una de las veces de los folds de validación.
Si se utiliza realizando la validación cruzada, la ventaja es que el modelo probablemente sea mejor ya que los periodos de entrenamiento son de distinto tamaño, aquel modelo con entrenamiento más largo será mejor. Con la ventana deslizante dejamos atrás datos que luego en el modelo real no se deja atrás, aunque la solución siempre dependerá del tipo de datos que se tengan.
También cabe la posibilidad de utilizar modelos más sencillos (modelos que no sobreentrenen) como por ejemplo la regresión lineal que en otros modelos como Machine Learning ya casi no se utilizan.
Por supuesto es importante gestionar las expectativas. Hay que ser conscientes de que con pocos datos no se puede hacer una gran predicción.
Sparsity
Muchas veces en las series temporales nos encontramos con períodos sin datos, por ejemplo, si hablamos de los pedidos a un almacén, habrá días en los que no haya pedidos y por lo tanto no haya datos.
Para solucionar este problema se puede utilizar un zero- inflated regression, un modelo que se basa en suponer que los datos que no son 0 siguen una determinada distribución, entrenar un modelo con los no nulos y añadir los ceros, utilizar una función de pérdida tweedie (esta función de pérdida se basa en una distribución de probabilidad con muchos ceros) o hablar con cliente para ver si interesa hacer una aproximación top- down o una agregación temporal (por ejemplo, predecir por semanas en vez de por días).
Series distintas a predecir
A veces hay que predecir muchas series temporales y pueden ser muy diferentes en la dinámica, predictibilidad, problema a resolver, etc.
En estos casos suelen utilizarse diferentes técnicas, modelos y parámetros para las distintas series temporales. Otra opción sería utilizar un modelo de clustering para poder detectar qué series son más similares entre sí, para poder usar un mismo modelo con estas series y así contar con un mayor entrenamiento que si utilizáramos un único modelo para cada serie temporal. Por último, también se pueden separar las series temporales con mejores resultados y las que obtienen las peores predicciones, para entrenar las buenas únicamente entre ellas y que no se contaminen con las series temporales malas, y entrenar las time-series con peores resultados con todos los datos de manera conjunta.
Efecto mariposa
En las series temporales al predecir una muestra a partir de la anterior, el error de la anterior puede recaer sobre la actual debido a la retroalimentación. Así, el error se acumula y arrastra hacia adelante, creciendo descontroladamente. Este efecto es más probable que ocurra cuanto más impredecible sea la serie temporal.
Para solucionar este problema se pueden crear modelos para predecir el valor con distintos horizontes. Es decir, tener diferentes modelos para cada horizonte de predicción, para así no retroalimentar el error. La desventaja de este método es que tendríamos que crear y entrenar más modelos. Otra opción es tener un modelo en el que la salida sea un vector de la dimensión de los horizontes que queremos predecir. En este caso el modelo sería más complejo, pero solucionaría el problema de la propagación del error.
Valores nulos
Es muy frecuente que nos encontremos con valores nulos en las series temporales, pero a diferencia de otros problemas, normalmente no se pueden descartar las series temporales que tengan estos valores. Si quitáramos esta información nos quedaríamos sin datos. Por eso, lo que se suele hacer es rellenar esos valores nulos. Rellenar valores sueltos es sencillo, pero es una labor que se complica si son tandas largas o estos datos se encuentran al principio o al final de la serie.
Una opción si tenemos valores nulos aislados es utilizar una ventana deslizante y rellenar con la media o la mediana. Si por el contrario tenemos que rellenar tandas largas, podríamos utilizar la interpolación interpolación lineal (uniendo de manera lineal los puntos anterior y posterior a ese período con valores nulos), o con Splines. Esta técnica tiene la ventaja de proporcionar la continuidad (en el caso de Splines permite mantener la continuidad de la derivada de la serie), pero puede cambiar totalmente la dinámica de la serie. Por eso, normalmente lo que se hace en estos casos es utilizar un propio modelo de predicción temporal para rellenar estos valores nulos. De esta manera se puede asegurar que la tendencia y la estacionalidad de los valores que hemos rellenado es la misma que en el resto de la serie.
Valores anómalos (outliers)
De nuevo, cuando nos encontramos con valores anómalos en una serie temporal, no podemos descartar estos datos. Una vez detectados los outliers, si se identifican como errores, pasarían a ser valores nulos y podrían tratarse de la manera que hemos visto en el punto anterior. De todas maneras, es importante remarcar que en las series temporales no se pueden detectar valores erróneos por su valor absoluto (porque sean valores muy altos o bajos en comparación con el resto de los valores de la serie), sino que es necesario detectarlo respecto a un contexto temporal (que el valor sea significativamente alto o bajo respecto al valor esperado por los patrones y tendencias de la serie).
Una posible solución a este problema sería descomponer la serie en sus tres componentes: estacionalidad, tendencia y residuo, analizar el residuo y detectar como outlier el residuo que supere un cierto umbral. Otra solución que es muy frecuente es utilizar el filtro de Hampel, en el que para cada punto se calcula la mediana de su ventana móvil y la desviación estándar. Aquí el outlier será el punto cuyo valor difiera de la mediana más de X desviaciones estándar. Una vez detectados los outliers se pueden imputar con la mediana. Por último, otras soluciones son utilizar Generalized Extreme Studientized Deviate (ESD), Exponentially Weighted Moving Average, o Isolation Forest para predecir outliers.
Valores de entrada
Otro problema que podemos tener es definir qué entradas utilizar en nuestro modelo de series temporales.
Se puede incluir información externa o interna relevante como entrada (histórico anterior, modificaciones de variables disponibles, información ya disponible en las propias series temporales, etc.). Por ejemplo, para una predicción de ventas de sombrillas de playa puede interesarnos utilizar datos de entrada como: las ventas del mismo periodo del año anterior, la probabilidad de que haga sol o si se venden más o menos sombrillas en el fin de semana (esta era una información que se podía observar por tendencia en la propia serie temporal).
Diferentes períodos de validación y test
En los problemas de series temporales se utiliza un periodo de validación y otro de test. El periodo de validación se utiliza durante el entrenamiento para ajustar los hiperparámetros del modelo y encontrar el mejor modelo. Se suele dividir en conjuntos de entrenamiento y validación.
Una vez elegidos los hiperparámetros que mejor ajustan el modelo, se vuelve a entrenar con el conjunto de entrenamiento + validación. Finalmente, usamos el periodo de test para evaluar cómo se desempeña el modelo en datos no vistos.
Debido a la temporalidad de los datos, el periodo de validación y de test no puede ser el mismo. El periodo de test es posterior en el tiempo al periodo de validación.
Días especiales (festivos o eventos)
Estos acontecimientos pueden afectar mucho a la serie temporal y, por tanto, al error de predicción. Normalmente estas fechas no siguen un patrón completamente regular. Algunos siguen un patrón regular como festivos anuales (por ejemplo, todos los años es festivo en 12 octubre), pero dependiendo del día de la semana en el que caiga, puede constituir un puente cambiando la dinámica de comportamiento de los datos. También hay que considerar que festivos nacionales o locales pueden tener repercusiones diferentes. Por otro lado, las campañas de marketing o promociones también habría que tenerlas en cuenta, ya que afectan por ejemplo si tratamos de predecir las ventas de un producto.
Para poder abordar este problema es necesario revisar el histórico y ver si los días especiales han afectado o no a la serie temporal que se quiere predecir. Es importante saber que algunas librerías incluyen calendarios, lo que puede resultar muy útil. También se pueden utilizar las características de días similares como entrada (un día que tenga mucha correlación y un comportamiento parecido de los datos con el día que queremos predecir). Otra opción es utilizar modelos diferentes para predecir días normales y días especiales.
En este punto por supuesto es importante ser realistas y entender cuando un evento así es o no predecible, por ejemplo, los eventos espontáneos.
Los grupos de modelos más frecuentes para aplicar en problemas con series temporales son: modelos de Regresión Lineal (son muy rápidos y fáciles de entrenar), ARIMA (tiene en cuenta la estacionalidad y la tendencia), Prophet (además de tener en cuenta la estacionalidad y la tendencia, cuenta con un calendario de vacaciones y con un tratamiento de datos erróneos y nulos bastante bueno), Redes Neuronales Recurrentes como GRU o LSTM (guardan un estado interno en el que tienen información del histórico, pudiendo hacer mejores predicciones en el caso de que el histórico sea importante), modelos de Boosting como XGBoost o Catboost (son capaces de ver las relaciones complejas que hay entre las entradas y el target), N-BEATS/N-HITS (Redes Neuronales con cierta interpretabilidad) y modelos TFT (basados en Transformers, son interpretables, multi-horizonte y muchas más ventajas). Es importante conocerlos para entender cual de ellos viene mejor utilizar dependiendo de los datos de entrada que tengamos, el tiempo del que dispongamos para realizar las predicciones, etc.
Está claro que el factor tiempo añade un plus de dificultad a los problemas con series temporales. Por eso en este tipo de modelos es necesario realizar un buen análisis y preprocesamiento de los datos. La calidad de las predicciones dependerá mucho más de estas fases previas que del modelo que finalmente se utilice. Cuanto mayor conocimiento se tenga de los datos (qué entradas utilizar, qué eventos afectan o no a la serie, etc.), mejor serán las predicciones.
Puedes ver la charla “Dominando el Tiempo: Cómo abordar tus problemas de predicción de series temporales sin morir en el intento” que expusimos en la PyCon ES 2023 aquí