Usando Holt-Winters para pronosticar en Python

8

[Primero publiqué esta pregunta en Stack Overflow aquí, pero no recibí ninguna respuesta, así que pensé en intentarlo aquí. Disculpas si no se permite volver a publicar.]

He estado tratando de usar esta implementación del algoritmo Holt-Winters para pronosticar series temporales en Python, pero me he encontrado con un obstáculo ... básicamente, para algunas series de entradas (positivas), a veces pronostica números negativos, lo que claramente debería No será el caso. Incluso si las predicciones no son negativas, a veces son extremadamente inexactas: órdenes de magnitud más altas / bajas de lo que deberían ser. Darle al algoritmo más períodos de datos para trabajar no parece ayudar, y de hecho a menudo empeora el pronóstico.

Los datos que estoy usando tienen las siguientes características, que pueden ser problemas:

  • Muy frecuentemente muestreado (un punto de datos cada 15 minutos, en oposición a los datos mensuales como se usa en el ejemplo), pero por lo que he leído, el algoritmo Holt-Winters no debería tener un problema con eso. ¿Quizás eso indica un problema con la implementación?

  • Tiene múltiples periodicidades: hay picos diarios (es decir, cada 96 puntos de datos), así como un ciclo semanal de datos de fin de semana que es significativamente menor que los datos de los días de la semana, por ejemplo, los días de la semana pueden alcanzar un máximo de 4000 pero los fines de semana alcanzan un máximo de 1000, pero incluso cuando solo doy En los datos del día de la semana, me encuentro con el problema del número negativo.

¿Hay algo que me falta con la implementación o mi uso del algoritmo Holt-Winters en general? No soy un estadístico, así que estoy usando los valores 'predeterminados' de alfa, beta y gamma indicados en el enlace anterior. ¿Es probable que ese sea el problema? ¿Cuál es una mejor manera de calcular estos valores?

O ... ¿hay un algoritmo mejor para usar aquí que Holt-Winters? En última instancia, solo quiero crear pronósticos razonables a partir de datos históricos aquí. He intentado el suavizado exponencial simple y doble pero (por lo que yo entiendo) tampoco admite la periodicidad en los datos.

También he buscado usar el paquete de pronóstico R en su lugar a través de rpy2, ¿eso me daría mejores resultados? Me imagino que todavía tendría que calcular los parámetros, etc., por lo que sería una buena idea si mi problema actual radica en la implementación del algoritmo ...

Cualquier ayuda / aportación sería muy apreciada!

Wern
fuente

Respuestas:

4

Creo que el paquete de pronóstico R que mencionó es más adecuado para este problema que simplemente usar Holt-Winters. Las dos funciones que le interesan son ets () y auto.arima () . ets () se ajustará a un modelo de suavizado exponencial, incluidos Holt-Winters y varios otros métodos. Escogerá parámetros (alfa, beta y gama) para una variedad de modelos y luego devolverá el que tenga el AIC más bajo (o BIC si lo prefiere). auto.arima () funciona de manera similar.

Sin embargo, como señaló IrishStat, este tipo de modelos puede no ser apropiado para su análisis. En ese caso, intente calcular algunas covariables, como variables ficticias para fines de semana, días festivos y sus interacciones. Una vez que haya especificado covariables que tengan sentido, use auto.arima () para encontrar un modelo ARMAX y luego pronostique () para hacer predicciones. Probablemente terminará con algo mucho mejor que un simple modelo Holt-Winters en Python con parámetros predeterminados.

También debe tener en cuenta que tanto ets () como auto.arima pueden adaptarse a modelos estacionales, pero debe formatear sus datos como una serie temporal estacional. Avísame si necesitas ayuda con eso.

Puede leer más sobre el paquete de pronóstico aquí .

Zach
fuente
¿Cómo puedo hacer para calcular las covariables?
Wern
@Wern: Parece que necesita AL MENOS 2 conjuntos de covariables: un conjunto de variables ficticias para la hora del día y una variable que representa el fin de semana y el día de la semana. En otras palabras, necesita una matriz de las siguientes variables 0/1: H1, H2, H3, H4 ... H23, Día de la semana, donde H1 = 1 si hora == 1, y es 0 de lo contrario. H2 = 2 si la hora == 2, y es 0 de lo contrario, etc. Día de la semana = 1 entre semana y 0 los fines de semana. Además, puede incluir: una interacción entre día de la semana y hora, día de la semana, mes del año, feriado y otras interacciones. Avíseme si necesita ayuda para hacer esto en R. Comience con maniquíes de horas y días laborables.
Zach
@Wern: después de volver a leer su pregunta, parece que tiene datos de 15 minutos, por lo que en lugar de calcular H1-H23, debe calcular I1-I95, donde "intervalo" cuenta los intervalos de 15 minutos desde el comienzo de la día. Además, asegúrese de omitir 1 variable de este conjunto de dummies, por ejemplo, H24 o I96. ¿Qué tipo de datos estás viendo? ¿Tráfico web? Carga de electricidad?
Zach
Hmm, creo que sé a qué te refieres. Lo probaré y te lo haré saber, ¡gracias! Los datos son tráfico web.
Wern
@Compruebe si le gusta mi respuesta (o la de IrishStat) siéntase libre de aceptarla haciendo clic en la marca de verificación verde.
Zach
7

El problema podría ser que Holt-Winters es un formulario de modelo específico y puede no ser aplicable a sus datos. El modelo HW asume, entre otras cosas, lo siguiente. a) una y solo una tendencia b) sin cambios de nivel en los datos, es decir, sin cambios de intercepción 3) que los parámetros estacionales no varían con el tiempo 4) sin valores atípicos 5) sin estructura autorregresiva o estructura de modelo adaptativo 6) errores de modelo que tienen una variación constante Y, por supuesto, 7) que la historia causa el futuro, es decir, no hay incorporación de precios / promociones, eventos, etc. como variables de ayuda

Según su descripción, me parece que podría ser necesario un enfoque de frecuencia mixta. He visto problemas de series de tiempo en los que los efectos de la hora del día y los efectos del día de la semana tienen términos de interacción significativos. Está tratando de forzar sus datos en una estructura inadecuada, es decir, no lo suficientemente generalizada. La estimación de parámetros y la elección de un pequeño conjunto de modelos no reemplaza la identificación del modelo. Es posible que desee leer un artículo sobre los diferentes enfoques del modelado automático en www.autobox.com/pdfs/catchword.pdf. En términos de un enfoque más general, sugeriría que considere un modelo ARMAX, también conocido como Función de Transferencia, que relaja los supuestos antes mencionados.

IrishStat
fuente
Hmm, tienes algunos puntos muy buenos ... mis datos también contienen muchos valores atípicos y están sujetos a variaciones significativas en eventos como Navidad o Año Nuevo. ¿Pero qué quiere decir con "estructura de modelo autorregresivo o adaptativo"? Sin embargo, le daré una oportunidad a ARMAX, ¡gracias!
Wern
@Wern Existe un componente adaptativo / autorregresivo cuando los "predictores" incluyen memoria (valores anteriores) de la serie endógena (Y) o serie exógena O valores rezagados del término de error. Es importante identificar y modelar, con posibles efectos principales, contemporáneos y de retraso en CADA una de las fiestas. Además, puede haber una causa asignable a días específicos del mes, dependiendo del día de la semana. Por ejemplo, el 5 del mes puede ser importante DADO que no fue un fin de semana. Hemos podido modelar / identificar con éxito esta estructura.
IrishStat