>
Dar uma série temporal, prever o próximo valor é um problema que fascinou muitos programadores durante muito tempo. Obviamente, uma razão chave para esta atenção são as bolsas de valores, que prometiam riquezas incalculáveis se você pudesse quebrá-lo. Entretanto, exceto por poucos (veja Uma rara entrevista com o matemático que decifrou Wall Street), essas riquezas provaram ser esquivas.
Obrigado a IoT (Internet das Coisas), a análise das séries temporais está pronta para voltar aos holofotes. IoT deixe-nos colocar sensores omnipresentes em toda parte, coletar dados, e agir sobre esses dados. Os dispositivos IoT coletam dados através do tempo e os dados resultantes são quase sempre dados de séries temporais.
Seguir são poucos os casos de uso para previsão de séries temporais.
- Previsão de carga de energia
- Previsão de demanda para lojas de varejo
- Serviços (por exemplo balcões de check-in das companhias aéreas, escritórios governamentais) previsão do cliente
- Previsão de receitas
- Vigilância dos cuidados da UCI
- Previsão do rendimento e das colheitas
>
>
Vamos explorar as técnicas disponíveis para previsões de séries temporais.
>
A primeira questão é que “não é a regressão?”. Está perto, mas não é a mesma coisa que a regressão. Em uma série temporal, cada valor é afetado pelos valores que antecedem este valor. Por exemplo, se houver muito tráfego a 4,55 em um cruzamento, é provável que haja algum tráfego a 4,56 também. Isto é chamado de autocorrelação. Se você estiver fazendo regressão, você só considerará x(t) enquanto devido à autocorrelação, x(t-1), x(t-2), … também afetará o resultado. Então podemos pensar em previsões de séries temporais como regressão esse fator na autocorrelação também.
Para esta discussão, vamos considerar “Conjunto de dados de consumo individual de energia elétrica doméstica”, que são dados coletados de uma família ao longo de quatro anos, em intervalos de um minuto. Vamos considerar apenas três campos, e o conjunto de dados será parecido com o seguinte.
A primeira pergunta é: como medimos o sucesso? Fazemos isso através de uma função de perda, onde tentamos minimizar a função de perda. Existem várias funções de perda, e são diferentes prós e contras.
- MAE ( Erro médio absoluto) – aqui todos os erros, grandes e pequenos, são tratados igualmente
- Root Mean Square Error (RMSE) – isto penaliza erros grandes devido ao termo quadrado. Por exemplo, com erros e , MSE para ambos será 0,5 enquanto RMSE é 0,5 e. 0.45.
- MAPE ( Average Absolute Percentage Error) – Como #1 e #2 dependendo do intervalo de valores da variável alvo, eles não podem ser comparados entre conjuntos de dados. Em contraste, MAPE é uma porcentagem, portanto relativa. É como precisão em um problema de classificação, onde todos sabem que 99% de precisão é bastante boa.
- RMSEP ( Root Mean Square Percentage Error) – Este é um híbrido entre #2 e #3.
- Almost correct Predictions Error rate (AC_errorRate) – a percentagem de previsões que está dentro da percentagem %p do valor verdadeiro
Se estamos a tentar prever o próximo valor, temos várias escolhas.
O padrão ouro para este tipo de problemas é o modelo ARIMA. A idéia central por trás do ARIMA é quebrar a série temporal em diferentes componentes, tais como componente de tendência, componente de sazonalidade, etc e estimar cuidadosamente um modelo para cada componente. Veja Usando R para Análise de Séries Temporais para uma boa visão geral.
No entanto, o ARIMA tem um problema infeliz. Ele precisa de um especialista (um bom diploma de estatística ou um estudante de graduação) para calibrar os parâmetros do modelo. Se você quiser fazer ARIMA multivariado, isto é, fatorar em múltiplos campos, então as coisas ficam ainda mais difíceis.
No entanto, R tem uma função chamada auto.arima, que estima os parâmetros do modelo para você. Eu tentei isso.
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)
Você pode encontrar discussão detalhada sobre como fazer ARIMA a partir dos links acima. Eu usei apenas 200k do conjunto de dados, pois nosso foco são conjuntos de dados de tamanho médio. Ele deu um MAPE de 19.5.
Temporal Features
A segunda abordagem é apresentar uma lista de características que captura os aspectos temporais para que a informação da autocorrelação não seja perdida. Por exemplo, a análise técnica da Bolsa de Valores utiliza recursos construídos utilizando médias móveis. No caso simples, um analista irá rastrear médias móveis de 7 e 21 dias e tomar decisões baseadas em pontos cruzados entre esses valores.
Seguindo algumas idéias de características
- colhimento de médias móveis/medianas(e.g. 7, 14, 30, 90 dia)
- Tempo desde um certo evento
- Tempo entre dois eventos
- Medidas matemáticas como Entropia, Z-scores etc.
- X(t) elevado a funções como power(X(t),n), cos((X(t)/k)) etc
Truque comum que as pessoas usam é aplicar aquelas características com técnicas como Floresta Aleatória e Impulso Gradiente, que podem fornecer a importância relativa da característica. Podemos usar esses dados para manter boas características e deixar cair características ineficazes.
Não vou me deter muito tempo sobre este tópico. No entanto, com algum trabalho duro, este método tem mostrado dar muito bons resultados. Por exemplo, a maioria das competições são ganhas usando este método (e.g.http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
O lado negativo, no entanto, é que as funcionalidades são uma arte negra. É preciso muito trabalho e experiência para criar as características.
Rolling Windows-based Regression
Agora chegamos à parte interessante. Parece que há outro método que dá bons resultados sem muita mão.
Idea é prever X(t+1), próximo valor numa série temporal, alimentamos não só X(t), mas X(t-1), X(t-2) etc. ao modelo. Uma idéia similar tem sido discutida em Análise Rolante de Séries Temporais embora seja usada para resolver um problema diferente.
Vejamos um exemplo. Digamos que precisamos de prever x(t+1) dado X(t). Então as variáveis de origem e destino serão parecidas com as seguintes.
O conjunto de dados seria parecido com o seguinte depois de transformado com janela rolante de três.
Então, usaremos o conjunto de dados transformado com um conhecido algoritmo de regressão, como a regressão linear e a Regressão Florestal Aleatória. A expectativa é que o algoritmo de regressão irá calcular os coeficientes de autocorrelação de X(t-2) a X(t).
Por exemplo, com o conjunto de dados acima, aplicando a regressão linear no conjunto de dados transformado usando uma janela rolante de 14 pontos de dados fornecidos após os resultados. Aqui AC_errorRate considera a previsão correta se ela estiver dentro de 10% do valor real.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Isso é bastante interessante, pois bate o auto ARIMA da maneira correta ( MAPE 0.19 vs 0.13 com janelas rolantes).
Então nós só tentamos a regressão linear até agora. Então eu tentei vários outros métodos, e os resultados são dados abaixo.
Regessão linear ainda faz muito bem, no entanto, é fraca em manter a taxa de erro dentro de 10%. O aprendizado profundo é melhor nesse aspecto, no entanto, levou alguns ajustes sérios. Observe que os testes são feitos com 200k pontos de dados, pois meu foco principal é em pequenos conjuntos de dados.
Obtive os melhores resultados de uma rede neural com 2 camadas ocultas de tamanho 20 unidades em cada camada com zero dropouts ou regularização, função de ativação “relu”, e otimizador Adam(lr=0,001) rodando por 500 épocas. A rede é implementada com Keras. Durante o ajuste, encontrei artigos e bastante úteis.
Então experimentei a mesma ideia com mais alguns conjuntos de dados.
- Dataset de produção de leite ( pequeno < 200 pontos de dados)
- Dataset de compartilhamento de dados de bicicleta (cerca de 18.000 pontos de dados)
- Taxa de câmbio USD para Euro ( cerca de 6500 pontos de dados)
- Preços das ações da Apple (cerca de 13000 pontos de dados)
As previsões são feitas como séries cronológicas univariadas. Isto é, consideramos apenas os carimbos temporais e o valor que estamos a prever. Qualquer valor em falta é imputado através de preenchimento (usando o valor mais recente). Para todos os testes, nós usamos uma janela de tamanho 14 para como a janela rolante.
As tabelas seguintes mostram os resultados. Aqui exceto para Auto.Arima, outros métodos usando um conjunto de dados baseado em janela rolante.