with winters scikit learn holt forecast python statistics forecasting

python - winters - time series forecasting methods



Usando Holt-Winters para pronosticar en Python (5)

He estado tratando de usar esta implementación del algoritmo Holt-Winters para el pronóstico de series de tiempo en Python, pero me he topado con un obstáculo ... básicamente, para algunas series de entradas (positivas), a veces pronostica números negativos, lo que claramente debería no sea el caso Incluso si los pronósticos no son negativos, a veces son muy imprecisos, órdenes de magnitud más altas / bajas de lo que deberían ser. Darle al algoritmo más períodos de datos con los que 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:

  • Muestreo con mucha frecuencia (un punto de datos cada 15 minutos, a diferencia de los datos mensuales que utiliza el ejemplo), pero por lo que he leído, el algoritmo de Holt-Winters no debería tener problemas con eso. Tal vez eso indica un problema con la implementación?

  • Tiene varias periodicidades: hay picos diarios (es decir, cada 96 puntos de datos), así como un ciclo semanal de datos de fin de semana que son significativamente más bajos que los datos de los días de la semana. En los datos del día de la semana, me encuentro con el problema del número negativo.

¿Hay algo que me esté faltando de la implementación o de mi uso del algoritmo de 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 y hay una mejor manera de calcular esos valores?

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

Cualquier ayuda / entrada sería muy apreciada!


Creo que el problema con este método es cómo calculan los valores iniciales. Parece que están usando un modelo lineal cuando:

Este es un método muy deficiente que no debe usarse, ya que la tendencia estará sesgada por el patrón estacional. Imagine un patrón estacional, por ejemplo, donde el último período del año es siempre el mayor valor para el año. Entonces la tendencia será sesgada hacia arriba. Desafortunadamente, Bowerman, O''Connell y Koehler (2005) no están solos en recomendar malos métodos. He visto procedimientos similares y, lo que es peor, recomendados en otros libros. [1]

Un mejor método para descomponer las series temporales en tendencia y estacionalidad [1]

[1] http://robjhyndman.com/hyndsight/hw-initialization/


El hecho de que observe que hay periodicidades en sus datos significa que también debe intentar usar un modelo que pueda expresar dichas características.

Holt-Winters es un modelo de suavizado simple que no puede expresar esto.

El enfoque clásico es observar el modelo ARMA (Media Móvil Autoregresiva), y su extensión natural, el modelo SARIMA (Ajuste estacional ...).

Conclusión: esta es realmente una pregunta estadística. Uno de los mejores textos sobre el tema es Econometrics by Maddala.


En primer lugar, si no está seguro de su implementación específica del algoritmo, le recomiendo que cree un caso de prueba para eso. Tome otra implementación, tal vez matlab, lo que sea, cualquier cosa que sepa que funciona. Genere algunas entradas, aliméntela a la referencia y a su implementación, y debe ser idéntica. He traducido y verificado algunos algoritmos de matlab de esa manera. scipy.io.loadmat es ideal para eso.

Acerca de su uso del algoritmo: está hablando de periodicidades en días y semanas, y alimenta datos en una escala de tiempo de minutos. No sé si este algoritmo específico lo maneja bien, pero en cualquier caso sugeriría probar un filtro de paso bajo y luego introducirlo en el algoritmo cada hora, o incluso más lento. Casi 700 pasos de tiempo durante un período podría ser demasiado para reconocer. Los datos que usted alimenta también deben contener un mínimo de dos períodos completos de su serie temporal. Si su algoritmo es compatible con la periodicidad, también debe proporcionarle los datos de manera adecuada, para que pueda ver la periodicidad. El hecho de que obtenga estos valores extremos podría ser un indicio, de que el algoritmo solo tiene fecha para una tendencia constante en una dirección.

Tal vez también desee separar sus predicciones para tener una optimizada para la predicción semanal, y la otra intradía, y las combine de nuevo al final.


Es importante analizar las propiedades de las series de tiempo antes de elegir un método de pronóstico adecuado.

1 - Antes de aplicar Holt-Winters, puede ser importante verificar si su serie de tiempo es estacionaria y, si no lo es, diferenciarla para lograr esta propiedad, lo que ayuda con la precisión.

2 - Los datos pueden cambiar periódicamente con el tiempo, y lo que parece ser una tendencia en realidad podría ser parte de un gran período estacional. Si ese es su caso (y lo es), tal vez debería aplicar Holt-Winters dos veces, una por cada período estacional, ya que no puede manejar múltiples periodicidades, y luego analizar qué encaja mejor en su situación.

3 - Experimentar diferentes parámetros de suavizado (alfa, beta y gamma) puede ser importante. Cuanto más grandes son, más importantes son las últimas observaciones y los últimos componentes computados. Intente encontrar una implementación adaptativa de Holt-Winters, que adapte estos parámetros automáticamente, para ver qué sucede.

Le recomiendo usar el lenguaje R, que contiene una implementación de Holt-Winters adaptable y fácil de usar, que se proporciona a través del paquete de pronóstico, para que pueda experimentar fácilmente diferentes configuraciones.


Intenté generar datos aleatorios hasta obtener resultados interesantes. Aquí introduje todos los números positivos y obtuve pronósticos negativos:

y = [0.92, 0.78, 0.92, 0.61, 0.47, 0.4, 0.59, 0.13, 0.27, 0.31, 0.24, 0.01] holtwinters(y, 0.2, 0.1, 0.05, 4) ... forecast: -0.104857182966 forecast: -0.197407475203 forecast: -0.463988558577 forecast: -0.258023593197

pero tenga en cuenta que el pronóstico se ajusta a la pendiente negativa de los datos.

Estas podrían ser las órdenes de magnitud de las que hablabas:

y = [0.1, 0.68, 0.15, 0.08, 0.94, 0.58, 0.35, 0.38, 0.7, 0.74, 0.93, 0.87] holtwinters(y, 0.2, 0.1, 0.05, 4) ... forecast: 1.93777559066 forecast: 3.11109138055 forecast: 0.910967977635 forecast: 0.684668348397

Pero no estoy seguro de cómo lo consideraría muy impreciso o juzgaría que "debería ser" más bajo.

Cada vez que extrapolas datos, obtendrás resultados un tanto sorprendentes. ¿Le preocupa más que la implementación pueda ser incorrecta o que la salida no tenga buenas propiedades para su uso específico?