Regresión de ventana rodante: a Simple Approach for Time Series Next value Predictions

Srinath Perera
Srinath Perera

Follow

Jun 3, 2016 – 7 min read

Dada una serie temporal, predecir el siguiente valor es un problema que fascinó a muchos programadores durante mucho tiempo. Obviamente, una razón clave para esta atención son los mercados de valores, que prometían riquezas incalculables si se podía descifrar. Sin embargo, salvo para unos pocos (véase Una rara entrevista con el matemático que descifró Wall Street), esas riquezas han resultado esquivas.

Gracias al IoT (Internet de las cosas), el análisis de series temporales está a punto de volver a la palestra. El IoT nos permite colocar sensores omnipresentes en todas partes, recoger datos y actuar sobre ellos. Los dispositivos de IoT recogen datos a lo largo del tiempo y los datos resultantes son casi siempre datos de series temporales.

Los siguientes son algunos casos de uso para la predicción de series temporales.

  1. Predicción de la carga de energía
  2. Predicción de la demanda para tiendas minoristas
  3. Servicios (por ejemplo mostradores de facturación de aerolíneas, oficinas gubernamentales) predicción de clientes
  4. Previsión de ingresos
  5. Monitoreo vital de cuidados en la UCI
  6. Predicción de rendimientos y cultivos

Exploremos las técnicas disponibles para la predicción de series temporales.

La primera pregunta es que «¿no es la regresión?». Está cerca, pero no es lo mismo que la regresión. En una serie temporal, cada valor se ve afectado por los valores que le preceden. Por ejemplo, si hay mucho tráfico a las 4.55 en un cruce, lo más probable es que también haya algo de tráfico a las 4.56. Esto se llama autocorrelación. Si hacemos una regresión, sólo tendremos en cuenta x(t), mientras que, debido a la autocorrelación, x(t-1), x(t-2), … también afectarán al resultado. Así que podemos pensar en las previsiones de series temporales como una regresión que tiene en cuenta también la autocorrelación.

Para esta discusión, vamos a considerar el «Conjunto de datos de consumo de energía eléctrica de un hogar individual», que son datos recogidos de un hogar durante cuatro años en intervalos de un minuto. Consideremos sólo tres campos, y el conjunto de datos tendrá el siguiente aspecto.

La primera pregunta es cómo medimos el éxito. Lo hacemos a través de una función de pérdida, donde tratamos de minimizar la función de pérdida. Hay varias funciones de pérdida, y son diferentes pros y contras.

  1. MAE ( Error medio absoluto) – aquí todos los errores, grandes y pequeños, son tratados por igual
  2. Error cuadrático medio (RMSE) – esto penaliza los errores grandes debido al término cuadrado. Por ejemplo, con errores y , el MSE para ambos será 0,5 mientras que el RMSE es 0,5 y. 0,45.
  3. MAPE («Mean Absolute Percentage Error») – Dado que #1 y #2 dependen del rango de valores de la variable objetivo, no pueden compararse entre conjuntos de datos. En cambio, el MAPE es un porcentaje, por lo tanto, relativo. Es como la precisión en un problema de clasificación, donde todo el mundo sabe que una precisión del 99% es bastante buena.
  4. RMSEP («Root Mean Square Percentage Error») – Es un híbrido entre el #2 y el #3.
  5. Tasa de error de predicciones casi correctas (AC_errorRate) – el porcentaje de predicciones que está dentro del porcentaje %p del valor verdadero

Si estamos tratando de pronosticar el siguiente valor, tenemos varias opciones.

El estándar de oro para este tipo de problemas es el modelo ARIMA. La idea central detrás de ARIMA es dividir la serie de tiempo en diferentes componentes como el componente de tendencia, el componente de estacionalidad, etc. y estimar cuidadosamente un modelo para cada componente. Ver Using R for Time Series Analysis para una buena visión general.

Sin embargo, ARIMA tiene un problema desafortunado. Necesita un experto ( un buen grado de estadística o un estudiante de posgrado) para calibrar los parámetros del modelo. Si quieres hacer ARIMA multivariante, es decir, factorizar múltiples campos, entonces las cosas se ponen aún más difíciles.

Sin embargo, R tiene una función llamada auto.arima, que estima los parámetros del modelo por ti. Probé eso.

library("forecast")
....
x_train <- train data set
X-test <- test data set
..
powerTs <- ts(x_train, frequency=525600, start=c(2006,503604))
arimaModel <- auto.arima(powerTs)
powerforecast <- forecast.Arima(arimaModel, h=length(x_test))
accuracy(powerforecast)

Puedes encontrar una discusión detallada sobre cómo hacer ARIMA desde los enlaces dados anteriormente. Sólo utilicé 200k del conjunto de datos como nuestro enfoque es conjuntos de datos de tamaño medio. Dio un MAPE de 19,5.

Características temporales

El segundo enfoque es llegar a una lista de características que captura los aspectos temporales para que la información de autocorrelación no se pierde. Por ejemplo, el análisis técnico bursátil utiliza características construidas a partir de medias móviles. En el caso simple, un analista rastreará las medias móviles de 7 y 21 días y tomará decisiones basándose en los puntos de cruce entre esos valores.

Las siguientes son algunas ideas de características

  1. colección de medias móviles/medias(e.ej. 7, 14, 30, 90 días)
  2. Tiempo desde un determinado evento
  3. Tiempo entre dos eventos
  4. Medidas matemáticas como Entropía, puntuaciones Z, etc.
  5. X(t) elevado a funciones como power(X(t),n), cos((X(t)/k)) etc

El truco común que utiliza la gente es aplicar esas características con técnicas como Random Forest y Gradient Boosting, que pueden proporcionar la importancia relativa de la característica. Podemos utilizar esos datos para mantener las buenas características y eliminar las ineficaces.

No me detendré demasiado en este tema. Sin embargo, con algo de trabajo, este método ha demostrado dar muy buenos resultados. Por ejemplo, la mayoría de los concursos se ganan con este método (por ejemplo, http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).

El inconveniente, sin embargo, es que la elaboración de características es un arte negro. Se necesita mucho trabajo y experiencia para elaborar las características.

Regresión basada en Windows

Ahora llegamos a la parte interesante. Parece que hay otro método que da muy buenos resultados sin un montón de mano-holding.

Idea es predecir X(t+1), el siguiente valor en una serie de tiempo, alimentamos no sólo X(t), pero X(t-1), X(t-2) etc. al modelo. Una idea similar se ha discutido en Rolling Analysis of Time Series aunque se utiliza para resolver un problema diferente.

Veamos un ejemplo. Digamos que necesitamos predecir x(t+1) dado X(t). Entonces las variables de origen y destino tendrán el siguiente aspecto.

El conjunto de datos tendría el siguiente aspecto después de ser transformado con ventana móvil de tres.

Entonces, utilizaremos el conjunto de datos transformado con un algoritmo de regresión bien conocido, como la regresión lineal y la regresión Random Forest. La expectativa es que el algoritmo de regresión descubra los coeficientes de autocorrelación de X(t-2) a X(t).

Por ejemplo, con el conjunto de datos anterior, la aplicación de la regresión lineal en el conjunto de datos transformado utilizando una ventana móvil de 14 puntos de datos proporcionó los siguientes resultados. Aquí AC_errorRate considera que el pronóstico es correcto si está dentro del 10% del valor real.

LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307

Esto es bastante interesante ya que esto supera al auto ARIMA de manera correcta ( MAPE 0.19 vs 0.13 con ventanas móviles).

Así que sólo probamos la regresión Lineal hasta ahora. Luego probé varios otros métodos, y los resultados se dan a continuación.

La regresión lineal todavía lo hace bastante bien, sin embargo, es débil en mantener la tasa de error dentro del 10%. El aprendizaje profundo es mejor en ese aspecto, sin embargo, tomó algunos ajustes serios. Tenga en cuenta que las pruebas se realizan con 200k puntos de datos como mi enfoque principal es en pequeños conjuntos de datos.

Obtuve los mejores resultados de una red neuronal con 2 capas ocultas de tamaño 20 unidades en cada capa con cero abandonos o regularización, función de activación «relu», y optimizador Adam(lr=0.001) corriendo por 500 épocas. La red está implementada con Keras. Mientras afinaba, encontré artículos y bastante útiles.

Luego probé la misma idea con algunos conjuntos de datos más.

  1. Dataset de producción de leche ( pequeño < 200 puntos de datos)
  2. Dataset de intercambio de bicicletas (unos 18.000 puntos de datos)
  3. Tipo de cambio USD a Euro ( unos 6500 puntos de datos)
  4. Precios de las acciones de Apple (unos 13000 puntos de datos)

Las previsiones se hacen como series temporales univariantes. Es decir, sólo tenemos en cuenta las marcas de tiempo y el valor que estamos pronosticando. Cualquier valor que falte se imputa mediante un relleno (utilizando el valor más reciente). Para todas las pruebas, hemos utilizado una ventana de tamaño 14 para como la ventana de balanceo.

Las siguientes tablas muestran los resultados. Aquí, a excepción de Auto.Arima, otros métodos que utilizan un conjunto de datos basado en la ventana móvil.

No hay un claro ganador. Sin embargo, el método de la ventana rodante que discutimos junto con un algoritmo de regresión parece funcionar bastante bien.

Conclusión

Hemos discutido tres métodos: ARIMA, Uso de características para representar los efectos del tiempo, y Ventanas rodantes para hacer pronósticos del próximo valor de la serie de tiempo con conjuntos de datos de tamaño medio.

Entre los tres, el tercer método proporciona buenos resultados comparables con el modelo auto ARIMA aunque necesita una mínima ayuda por parte del usuario final.

Por lo tanto, creemos que la «regresión basada en la ventana móvil» es una adición útil para la bolsa de trucos del pronosticador.

Sin embargo, esto no desacredita a ARIMA, ya que con un ajuste experto, lo hará mucho mejor. Al mismo tiempo, con características artesanales, los métodos dos y tres también lo harán mejor.

Una consideración crucial es elegir el tamaño de la ventana para el método de ventana rodante. A menudo podemos obtener una buena idea del dominio. El usuario también puede hacer una búsqueda de parámetros sobre el tamaño de la ventana.

Lo siguiente son algunas cosas que necesitan más exploración.

  • ¿Podemos usar RNN y CNN? Probé RNN, pero no pude obtener buenos resultados hasta ahora.
  • Podría ser útil alimentar otras características como la hora del día, el día de la semana, y también los promedios móviles de diferentes ventanas de tiempo.
  1. Una visión general de los algoritmos de optimización de descenso de gradiente
  2. CS231n Redes Neuronales Convolucionales para el Reconocimiento Visual

Si te ha gustado este post puede que también te interesen los siguientes.

  • Introducción a la Detección de Anomalías: Conceptos y Técnicas
  • Crónica del Big Data: Una Comedia Técnica

Además, revisa algunos de mis posts más leídos y mis charlas (videos). Habla conmigo en @srinath_perera o búscame.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.