Usando Holt-Winters para previsão em Python

8

[Eu publiquei essa pergunta no Stack Overflow aqui, mas não recebi nenhuma resposta, então pensei em tentar aqui. Desculpas se a publicação não for permitida.]

Eu tenho tentado usar esta implementação do algoritmo Holt-Winters para previsão de séries temporais em Python, mas encontrei um obstáculo ... basicamente, para algumas séries de entradas (positivas), às vezes ela prevê números negativos, o que deve claramente não seja o caso. Mesmo que as previsões não sejam negativas, às vezes são extremamente imprecisas - ordens de magnitude maiores / menores do que deveriam. Fornecer ao algoritmo mais períodos de dados para trabalhar não parece ajudar e, de fato, muitas vezes piora a previsão.

Os dados que estou usando têm as seguintes características, que podem ser problemas:

  • Amostragem com muita frequência (um ponto de dados a cada 15 minutos, em oposição aos dados mensais como o exemplo usa) - mas pelo que li, o algoritmo Holt-Winters não deve ter problemas com isso. Talvez isso indique um problema com a implementação?

  • Possui várias periodicidades - há picos diários (ou seja, a cada 96 pontos de dados), além de um ciclo semanal de dados de fim de semana ser significativamente menor que os dados dos dias da semana - por exemplo, os dias da semana podem atingir o pico em torno de 4000, mas o pico nos fins de semana em 1000 - mas mesmo quando eu dou apenas nos dados do dia da semana, encontro o problema do número negativo.

Há algo que me falta na implementação ou no uso do algoritmo Holt-Winters em geral? Como não sou um estatístico, estou usando os valores 'padrão' de alfa, beta e gama indicados no link acima - é provável que esse seja o problema? Qual é a melhor maneira de calcular esses valores?

Ou ... existe um algoritmo melhor para usar aqui do que Holt-Winters? Por fim, só quero criar previsões sensatas a partir de dados históricos aqui. Eu tentei a suavização exponencial única e dupla, mas (tanto quanto eu entendi) nem suporta periodicidade nos dados.

Também procurei usar o pacote de previsão R por meio do rpy2 - isso me daria melhores resultados? Eu imagino que ainda precisaria calcular os parâmetros e assim por diante, então seria apenas uma boa idéia se meu problema atual residir na implementação do algoritmo ...?

Qualquer ajuda / entrada seria muito apreciada!

Wern
fonte

Respostas:

4

Eu acho que o pacote de previsão R que você mencionou é mais adequado para esse problema do que apenas usar Holt-Winters. As duas funções nas quais você está interessado são ets () e auto.arima () . O ets () ajustará um modelo de suavização exponencial, incluindo Holt-Winters e vários outros métodos. Ele escolherá parâmetros (alfa, beta e gama) para uma variedade de modelos e, em seguida, retornará aquele com o AIC mais baixo (ou BIC, se preferir). auto.arima () funciona de maneira semelhante.

No entanto, como o IrishStat apontou, esses tipos de modelos podem não ser apropriados para sua análise. Nesse caso, tente calcular algumas covariáveis, como variáveis ​​fictícias para fins de semana, feriados e suas interações. Depois de especificar as covariáveis ​​que fazem sentido, use auto.arima () para encontrar um modelo ARMAX e, em seguida, preveja () para fazer previsões. Você provavelmente terminará com algo muito melhor do que um modelo simples de Holt-Winters em python com parâmetros padrão.

Você também deve observar que ets () e auto.arima podem se ajustar a modelos sazonais, mas é necessário formatar seus dados como uma série temporal sazonal. Deixe-me saber se você precisar de alguma ajuda com isso.

Você pode ler mais sobre o pacote de previsões aqui .

Zach
fonte
Como posso calcular covariáveis?
Wern
@ Wern: Parece que você precisa, pelo menos, de dois conjuntos de covariáveis: um conjunto de variáveis ​​fictícias para a hora do dia e uma variável que representa final de semana versus dia da semana. Em outras palavras, você precisa de uma matriz das seguintes variáveis ​​0/1: H1, H2, H3, H4 ... H23, Dia da semana, em que H1 = 1 se hora == 1 e, caso contrário, for 0. H2 = 2 se hora == 2 e, caso contrário, for 0, etc. Dia da semana = 1 nos dias da semana e 0 nos finais de semana. Além disso, você pode incluir: uma interação entre dia da semana e hora, dia da semana, mês do ano, feriado e outras interações. Informe-me se precisar de ajuda para fazer isso em R. Comece com manequins de hora e dia da semana.
Zach
@Wern: Depois de reler sua pergunta, parece que você tem dados de 15 minutos; portanto, em vez de calcular o H1-H23, você deve calcular o I1-I95, em que o "intervalo" conta os intervalos de 15 minutos desde o início do dia. Além disso, certifique-se de omitir 1 variável desse conjunto de manequins, por exemplo, H24 ou I96. Que tipo de dados você está vendo? Tráfego na Web? Carga de eletricidade?
Zach
Hmm, acho que sei o que você quer dizer. Vou experimentar e informar você - obrigado! Os dados são tráfego da web.
Wern
@Wern, se você gosta da minha resposta (ou da IrishStat), sinta-se à vontade para aceitar uma clicando na marca de seleção verde.
Zach
7

O problema pode ser que Holt-Winters é um formulário de modelo específico e pode não ser aplicável aos seus dados. O Modelo HW assume, entre outras coisas, o seguinte. a) uma e apenas uma tendência b) nenhuma mudança de nível nos dados, ou seja, nenhuma alteração de interceptação 3) que os parâmetros sazonais não variem ao longo do tempo 4) nenhum outliers 5) nenhuma estrutura autoregressiva ou estrutura de modelo adaptável 6) erros de modelo que apresentam variação constante E, é claro, 7) que a história causa o futuro, ou seja, nenhuma incorporação de preço / promoções. Eventos etc. como variáveis ​​de ajuda

Pela sua descrição, parece-me que uma abordagem de frequência mista pode ser necessária. Vi problemas de séries temporais em que os efeitos da hora do dia e do dia da semana têm termos de interação significativos. Você está tentando forçar seus dados a uma estrutura insuficiente, isto é, não generalizada. Estimar parâmetros e escolher entre um pequeno conjunto de modelos não substitui a Identificação do modelo. Você pode ler um artigo sobre as diferentes abordagens da Modelagem Automática em www.autobox.com/pdfs/catchword.pdf. Em termos de uma abordagem mais geral, sugiro que você considere um modelo ARMAX, também conhecido como Função de Transferência, que relaxa as suposições mencionadas acima.

IrishStat
fonte
Hmm, você tem alguns pontos muito bons ... meus dados também contêm muitos valores discrepantes e estão sujeitos a variações significativas em eventos como Natal ou Ano Novo. Mas o que você quer dizer com 'estrutura de modelo auto-regressiva ou adaptativa'? Vou dar uma chance ao ARMAX, obrigado!
Wern
@Wern Existe um componente adaptativo / autorregressivo quando os "preditores" incluem memória (valores anteriores) da série endógena (Y) ou série exógena OU valores defasados ​​do termo de erro. É importante identificar e modelar, com possíveis efeitos de chumbo, contemporâneo e lag, em torno de CADA Feriado. Além disso, pode haver uma causa atribuível a dias do mês específicos, dependendo do dia da semana. Por exemplo, o dia 5 do mês pode ser importante Dado que não foi um fim de semana. Conseguimos modelar com sucesso / identificar automaticamente essa estrutura.
IrishStat