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.
- Predicción de la carga de energía
- Predicción de la demanda para tiendas minoristas
- Servicios (por ejemplo mostradores de facturación de aerolíneas, oficinas gubernamentales) predicción de clientes
- Previsión de ingresos
- Monitoreo vital de cuidados en la UCI
- 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.
- MAE ( Error medio absoluto) – aquí todos los errores, grandes y pequeños, son tratados por igual
- 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.
- 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.
- RMSEP («Root Mean Square Percentage Error») – Es un híbrido entre el #2 y el #3.
- 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
- colección de medias móviles/medias(e.ej. 7, 14, 30, 90 días)
- Tiempo desde un determinado evento
- Tiempo entre dos eventos
- Medidas matemáticas como Entropía, puntuaciones Z, etc.
- 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.