Como lidar com a previsão de séries temporais online?
9
Eu tenho lidado com o seguinte problema. Eu tenho uma espécie de sistema de tempo real e, a cada período de tempo, leio seu valor atual, criando uma série temporal (como 1, 12, 2, 3, 5, 9, 1, ...). Gostaria de conhecer métodos (estatística e aprendizado de máquina) para prever o próximo valor de maneira on-line (ou seja, toda vez que um novo valor for lido). Eu tentei o ARIMA de R e o SMOreg de Weka, eles resultam em boas previsões, mas são meio lentos, pois toda vez que um novo valor chega, tenho que refazer a matemática.
PS Seria ótimo também se o método tivesse um intervalo de confiança.
No seu sistema em tempo real, os tempos de observação são homogêneos e os dados não estacionários? Se você quiser algo simples e rápido, sugiro usar os operadores não homogêneos do tipo EMA:
com um parâmetro de suavização / sintonia. É uma maneira simples de estimar uma expectativa.τ
Também é possível criar uma estimativa mediana online simples através da atualização
sgmed += s gn ( newData - med )= ϵ( sg - med )
Na prática, você deseja pequeno (ou decadente com mais observações). Idealmente, deve depender de quão desatadas as atualizações estão se tornando; isto é, se realmente igual à mediana, então deve ser uniforme em . Você pode estender isso para uma estrutura de tipo de árvore binária balanceada em profundidade para obter quantis uniformemente espaçados.ϵϵmedsg{ - 1 , 1 }d2d+ 1- 1
A combinação dos itens acima deve fornecer uma distribuição online decente dos seus dados. A árvore é complicada de acertar, eu tenho implementações de ambos em C ++, se você estiver interessado. Eu uso muito na prática (dados financeiros de ticks em tempo real) e eles funcionaram bem.
Oi Murat! Criei um hiperlink para o artigo que você postou e centralizei suas equações. Veja o histórico de postagens se estiver interessado em ver como fazer isso para referência futura. Também existem alguns botões úteis na parte superior da caixa de texto que aparecem quando você está escrevendo uma resposta que fará muitas coisas automaticamente para você (por exemplo, inserir imagens, links, negrito / itálico e muito mais). (+1, btw)
Macro
3
Primeiro, você precisa incorporar seus dados no tempo. Por exemplo, tome como a primeira entrada [1, 12, 2, 3] e a saída correspondente [5] e como a segunda entrada você tome [12, 2, 3, 5] e a saída correspondente [9]. (Isso é incorporado com o atraso 4, mas você pode escolher outro valor que se encaixe melhor.)
Agora você tem um problema de previsão válido. A esses dados, você pode aplicar os Processos Gaussianos Online . Este é um método de aprendizado de máquina que faz exatamente o que você descreve e fornece intervalos de confiança.
Se o seu modelo não for estacionário, você pode tentar a extensão não estacionária, rastreador de mínimos quadrados recursivo do kernel . A propósito, esse documento inclui o código Matlab para casos estacionários e não estacionários.
Esses métodos são razoavelmente rápidos: sua complexidade computacional é quadrática em termos do número de dados armazenados na memória (que geralmente é uma parte pequena e representativa de todos os dados processados). Para métodos mais rápidos, recomendo, por exemplo, o método de mínimos quadrados médios do kernel, mas sua precisão é menor.
O procedimento que você recomendou, informa quando ocorrem mudanças de nível ou mudanças de tendência temporal? Detecta mudanças nos parâmetros ou variações na variação ao longo do tempo? Distingue entre memória auto-regressiva sazonal e manequins sazonais?
precisa saber é o seguinte
@IrishStat Acho que sua pergunta é retórica. Se um modelo pode ter uma recursão simples para atualizar o modelo, não pode ter todas as complexidades que você descreve. Às vezes, é mais importante obter uma resposta correta do que uma resposta rápida que seja ruim. É por isso que na minha resposta eu disse para fazê-lo apenas se o modelo se encaixar bem nos dados!
Michael R. Chernick
1
@IrishStat Esses métodos são "não paramétricos", o que significa que eles não assumem nenhum modelo específico de dados (apenas "ajustam" os dados). Eles não relatam mudanças de tendência. Porém, eles relatam erro de previsão, portanto, se você deseja encontrar alterações de tendência, provavelmente pode simplesmente observar quando o erro de previsão é suficientemente grande.
25412 Steven
Não estou familiarizado com os processos gaussianos esparsos on-line, mas, olhando para o artigo vinculado, não acho certo caracterizá-los como "não paramétricos", pois eles usam processos gaussianos para distribuições anteriores e envolvem vários parâmetros em seus "Kalman". recursão semelhante a um "filtro". Parece que alguma estrutura de modelo deve estar implícita na formulação. Ainda acho que os comentários de IrishStat se aplicam.
Michael R. Chernick
3
O filtro Kalman é um algoritmo recursivo. Ele pega a nova observação e a combina com a previsão anterior. Seria bom usar, mas apenas se for um modelo apropriado para seus dados. Não sei ao certo como é fácil atualizar o intervalo de previsão.
Não sei se você tentou isso, mas em R, quando você usa a função Arima, pode especificar o modelo como uma entrada. Portanto, se você encontrou inicialmente um modelo arima, digamos Arima (1,2,1) com os respectivos componentes de suavização, você pode consertar o modelo em iterações posteriores para que não tente reajustar um modelo. Se seus dados estiverem estacionários nesse caso, as previsões podem ser suficientemente boas para você - e muito mais rápidas.
Primeiro, você precisa incorporar seus dados no tempo. Por exemplo, tome como a primeira entrada [1, 12, 2, 3] e a saída correspondente [5] e como a segunda entrada você tome [12, 2, 3, 5] e a saída correspondente [9]. (Isso é incorporado com o atraso 4, mas você pode escolher outro valor que se encaixe melhor.)
Agora você tem um problema de previsão válido. A esses dados, você pode aplicar os Processos Gaussianos Online . Este é um método de aprendizado de máquina que faz exatamente o que você descreve e fornece intervalos de confiança.
Se o seu modelo não for estacionário, você pode tentar a extensão não estacionária, rastreador de mínimos quadrados recursivo do kernel . A propósito, esse documento inclui o código Matlab para casos estacionários e não estacionários.
Esses métodos são razoavelmente rápidos: sua complexidade computacional é quadrática em termos do número de dados armazenados na memória (que geralmente é uma parte pequena e representativa de todos os dados processados). Para métodos mais rápidos, recomendo, por exemplo, o método de mínimos quadrados médios do kernel, mas sua precisão é menor.
fonte
O filtro Kalman é um algoritmo recursivo. Ele pega a nova observação e a combina com a previsão anterior. Seria bom usar, mas apenas se for um modelo apropriado para seus dados. Não sei ao certo como é fácil atualizar o intervalo de previsão.
fonte
Não sei se você tentou isso, mas em R, quando você usa a função Arima, pode especificar o modelo como uma entrada. Portanto, se você encontrou inicialmente um modelo arima, digamos Arima (1,2,1) com os respectivos componentes de suavização, você pode consertar o modelo em iterações posteriores para que não tente reajustar um modelo. Se seus dados estiverem estacionários nesse caso, as previsões podem ser suficientemente boas para você - e muito mais rápidas.
Espero que isto ajude..
fonte