Estou trabalhando em um pequeno projeto em que estamos tentando prever os preços de commodities (petróleo, alumínio, estanho, etc.) nos próximos 6 meses. Eu tenho 12 variáveis para prever e tenho dados de abril de 2008 a maio de 2013.
Como devo fazer previsões? Eu fiz o seguinte:
- Dados importados como um conjunto de dados do Timeseries
- A sazonalidade de todas as variáveis tende a variar com a Tendência, então eu vou para o modelo multiplicativo.
- Peguei o log da variável para converter em modelo aditivo
- Para cada variável decompôs os dados usando STL
Estou planejando usar a suavização exponencial de Holt Winters, o ARIMA e a rede neural para prever. Dividi os dados como treinamento e teste (80, 20). Planejando escolher o modelo com menos MAE, MPE, MAPE e MASE.
Eu estou fazendo a coisa certa?
Também uma pergunta que eu tinha era: antes de passar para o ARIMA ou para a rede neural, devo suavizar os dados? Se sim, usando o que? Os dados mostram sazonalidade e tendência.
EDITAR:
Anexando a plotagem e os dados das séries temporais
Year <- c(2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2009, 2009,
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2010,
2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
2011, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,
2012, 2012, 2013, 2013)
Month <- c(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2)
Coil <- c(44000, 44500, 42000, 45000, 42500, 41000, 39000, 35000, 34000,
29700, 29700, 29000, 30000, 30000, 31000, 31000, 33500, 33500,
33000, 31500, 34000, 35000, 35000, 36000, 38500, 38500, 35500,
33500, 34500, 36000, 35500, 34500, 35500, 38500, 44500, 40700,
40500, 39100, 39100, 39100, 38600, 39500, 39500, 38500, 39500,
40000, 40000, 40500, 41000, 41000, 41000, 40500, 40000, 39300,
39300, 39300, 39300, 39300, 39800)
coil <- data.frame(Year = Year, Month = Month, Coil = Coil)
EDIT 2: Uma pergunta, você pode me dizer se meus dados têm alguma sazonalidade ou tendência? E também, por favor, me dê algumas dicas sobre como identificá-las.
fonte
Respostas:
Você deve usar o pacote de previsão , que suporta todos esses modelos (e mais) e facilita o encaixe deles:
Eu recomendaria não suavizar os dados antes de ajustar seu modelo. Seu modelo tentará inerentemente suavizar os dados; portanto, a pré-suavização apenas complica as coisas.
Edite com base em novos dados:
Na verdade, parece que o arima é um dos piores modelos que você pode escolher para este treinamento e conjunto de testes.
Salvei seus dados em uma chamada de arquivo
coil.csv
, carreguei-os no R e os dividi em um conjunto de treinamento e teste:Em seguida, ajustei vários modelos de séries temporais: arima, suavização exponencial, rede neural, tbats, morcegos, decomposição sazonal e séries temporais estruturais:
Então eu fiz algumas previsões e comparei com o conjunto de testes. Incluí uma previsão ingênua que sempre prevê uma linha horizontal plana:
Como você pode ver, o modelo Arima erra a tendência, mas eu meio que gosto da aparência do "Modelo estrutural básico"
Por fim, medi a precisão de cada modelo no conjunto de testes:
As métricas utilizadas são descritas em Hyndman, RJ e Athanasopoulos, G. (2014) "Forecasting: princípios e práticas" , que também são os autores do pacote de previsão. Eu recomendo que você leia o texto deles: está disponível gratuitamente online. A série temporal estrutural é o melhor modelo para várias métricas, incluindo MASE, que é a métrica que eu prefiro para a seleção de modelos.
Uma pergunta final é: o modelo estrutural teve sorte com este conjunto de testes? Uma maneira de avaliar isso é olhar para os erros do conjunto de treinamento. Os erros do conjunto de treinamento são menos confiáveis do que os erros do conjunto de teste (porque eles podem ter excesso de ajuste), mas, neste caso, o modelo estrutural ainda se destaca:
(Observe que a rede neural superajustada, executando excelente no conjunto de treinamento e mal no conjunto de teste)
Por fim, seria uma boa idéia validar cruzadamente todos esses modelos, talvez treinando em 2008-2009 / testando em 2010, treinando em 2008-2010 / testando em 2011, treinando em 2008-2011 / testando em 2012, treinando em 2008-2012 / testes em 2013, e a média de erros em todos esses períodos. Se você deseja seguir esse caminho, eu tenho um pacote parcialmente completo para validação cruzada de modelos de séries temporais no github que eu adoraria que você experimentasse e me desse feedback / solicitações sobre:
Edit 2: Vamos ver se me lembro de como usar meu próprio pacote!
Primeiro, instale e carregue o pacote no github (veja acima). Em seguida, valide cruzadamente alguns modelos (usando o conjunto de dados completo):
(Observe que reduzi a flexibilidade do modelo de rede neural, para tentar evitar que ele se encaixe demais)
Depois de ajustar os modelos, podemos compará-los pelo MAPE (o cv.ts ainda não suporta o MASE):
Ai. Parece que nossa previsão estrutural teve sorte. A longo prazo, a ingênua previsão faz as melhores previsões, com média em um horizonte de 12 meses (o modelo arima ainda é um dos piores modelos). Vamos comparar os modelos em cada um dos 12 horizontes de previsão e ver se algum deles superou o modelo ingênuo:
De maneira reveladora, o modelo de suavização exponencial está sempre escolhendo o modelo ingênuo (a linha laranja e a linha azul se sobrepõem 100%). Em outras palavras, a ingênua previsão de "preços da bobina no próximo mês será igual à da bobina deste mês" é mais precisa (em quase todos os horizontes previstos) do que 7 modelos de séries temporais extremamente sofisticados. A menos que você tenha alguma informação secreta que o mercado de bobinas ainda não conhece, vencer a ingênua previsão de preço da bobina será extremamente difícil .
Nunca é a resposta que alguém deseja ouvir, mas se a precisão da previsão for o seu objetivo, use o modelo mais preciso. Use o modelo ingênuo.
fonte
A abordagem que você adotou é razoável. Se você é novo na previsão, recomendo os seguintes livros:
O primeiro livro é um clássico que eu recomendo fortemente. O segundo livro é um livro de código aberto que você pode consultar para métodos de previsão e como é aplicado usando a previsão de
R
pacotes de software de código aberto . Ambos os livros fornecem bons antecedentes sobre os métodos que usei. Se você é sério em relação à previsão, eu recomendaria Princípios de Previsão por Armstrong, que é uma coleção de uma tremenda quantidade de pesquisas na previsão de que os profissionais podem achar isso muito útil.Chegando ao seu exemplo específico de bobina, ele me lembra um conceito de previsibilidade que a maioria dos livros didáticos geralmente ignora. Algumas séries, como a sua, simplesmente não podem ser previstas porque são menos padronizadas, pois não apresentam padrões de tendência ou sazonais ou qualquer variação sistemática. Nesse caso, eu categorizaria uma série como menos previsível. Antes de me aventurar nos métodos de extrapolação, eu examinava os dados e fazia a pergunta: minha série é previsível? Neste exemplo específico, uma extrapolação simples, como a previsão de caminhada aleatória, que usa o último valor da previsão, é mais precisa .
Também um comentário adicional sobre a rede neural: sabe-se que as redes neurais falham em competições empíricas . Eu tentaria métodos estatísticos tradicionais para séries temporais antes de tentar usar redes neurais para tarefas de previsão de séries temporais.
Tentei modelar seus dados
R's forecast package
, espero que os comentários sejam auto-explicativos.Usando o MAE nos dados de espera, eu escolheria o ARIMA para previsão de curto prazo (1 a 12 meses). a longo prazo, eu confiaria na previsão aleatória da caminhada. Observe que o ARIMA escolheu um modelo de passeio aleatório com desvio (0,1,0) + desvio, que tende a ser muito mais preciso do que o modelo de passeio aleatório puro nesse tipo de problema especificamente a curto prazo. Veja o gráfico abaixo. Isso se baseia na função de precisão, como mostrado no código acima.
Respostas específicas para suas perguntas específicas: Também uma pergunta que eu tinha era, antes de passar para o ARIMA ou para a rede neural, devo suavizar os dados? Se sim, usando o que?
Os dados mostram sazonalidade e tendência.
Dicas práticas para melhorar a precisão:
Combine vários métodos de previsão: - Você pode tentar usar métodos de não extrapolação, como previsão por analogia , previsão de julgamento ou outras técnicas e combiná-los com seus métodos estatísticos para fornecer previsões precisas. Consulte este artigo para obter os benefícios da combinação. Tentei combinar os 5 métodos acima, mas as previsões não eram precisas como métodos individuais, um possível motivo é que a previsão individual é semelhante. Você colhe os benefícios da combinação de previsão ao combinar diversos métodos, como previsões estatísticas e de julgamento.
Detectar e entender discrepantes: - Os dados do mundo real são preenchidos com discrepantes. Identifique e trate apropriadamente os discrepantes em séries temporais. Recomende a leitura deste post . Ao olhar para os dados da bobina, a queda anterior a 2009 é um desvio?
Editar
Os dados parecem estar seguindo algum tipo de tendência macroeconômica. Meu palpite é que a tendência de queda observada antes de 2009 segue uma queda na economia observada entre 2008 - 2009 e começa a melhorar após 2009. Se esse for o caso, eu evitaria o uso de métodos de extrapolação e, em vez disso, confiaria na teoria sólida de como essas tendências econômicas se comportam como a mencionada por @GraemeWalsh.
Espero que isto ajude
fonte