Cálculo da precisão da previsão

9

Estamos usando STL (implementação R) para prever dados de séries temporais.

Todos os dias executamos previsões diárias. Gostaríamos de comparar valores de previsão com valores reais e identificar o desvio médio. Por exemplo, executamos a previsão para amanhã e obtivemos pontos de previsão. Gostaríamos de comparar esses pontos de previsão com dados reais que obteremos amanhã. Estou ciente de que os valores das previsões e os dados reais podem não corresponder na maioria das vezes, esse é um dos motivos pelos quais gostaríamos de acompanhar a precisão de cada dia.

Agora estamos tentando identificar qual é a melhor abordagem para resolver esse problema? quaisquer sugestões de ajuda seriam apreciadas.

Eu olhei para a pergunta Medição da precisão da previsão , mas parece que ela está relacionada à comparação de modelos em vez de calcular a precisão com valores reais.

Eu olhei para a implementação da função de precisão em R , mas confundi com duas perguntas:

1) Funcionará com dados reais versus dados de previsão, porque a maioria do tutorial diz como "dados de teste" vs "dados de previsão"

2) Parece que a função de precisão é a matriz de valores em vez de% do desvio.

kosa
fonte
11
Para obter uma ótima resposta, você deve fazer a pergunta certa - e isso pode ser frustrante. Todo mundo quer governar o mundo e isso requer conhecimento prévio. Se eu tivesse um conhecimento perfeito das ações de amanhã, mas tivesse hoje, então eu poderia ganhar uma tonelada de dinheiro / poder / oportunidade / glória / etc. Se estivesse analisando o seu problema, gostaria de ver um histograma (ou eCDF) do erro preditivo. Eu gostaria de "tremer" as entradas da previsão e examinar sua média e variação, e comparar o erro com essas. Você deve entender seu erro para corrigi-lo.
EngrStudent
11
Para os não iniciados, o que é STL?
precisa saber é o seguinte
@EngrStudent: "Você deve entender seu erro para corrigi-lo" - Nesta declaração, temos duas partes. Estou tentando descobrir possíveis abordagens para a primeira seção em si. A metodologia eu escolho vai me ajudar na escolha de estratégias para a parte 2.
kosa
11
Significar não é a mesma coisa que o comportamento de um sistema. O desvio padrão não é o mesmo que o comportamento de um sistema. Essas duas medidas são estatísticas resumidas do comportamento do sistema medido. Erro não é precisão. Erro não é incerteza. Essas duas medidas são estatísticas resumidas para erros análogos à média e desvio padrão. Assim como existem muitas infinidades de medidas de comportamento do sistema, existem muitas infinidades de medidas de comportamento do erro. Qual é a sua rubrica? como você mede uma boa maneira de pensar em erro?
EngrStudent
11
@ Nambari - bem-vindo ao mundo dos "sábios". O começo do conhecimento é saber que você não sabe nada - ser um estudante. Eu tento estar sempre aprendendo a mim mesmo e tento ser corrigível por qualquer pessoa que fale a verdade. Se você brinca com a ferramenta Eureqa e tenta dados de amostra apropriados em todas as formas gerais de "expressão de destino" e em todas as "métricas de erro", você começará a conhecer essa coisa profunda. Eu não tenho uma boa resposta. L'Hospital (aka L'Hopital) formulou a primeira expressão menos quadrática em 1696. Um bom começo é o caso de uso - onde a mente entra. O que é isso?
EngrStudent

Respostas:

13

Existem muitas maneiras diferentes de medir a precisão da previsão, e a accuracy()função do pacote de previsão para R gera várias delas. No seu comentário sobre "% de desvio", parece que você deseja usar o Erro médio percentual absoluto, que é uma das medidas fornecidas por accuracy(). As medidas mais comuns de precisão da previsão são discutidas aqui . Você pode pensar se o MAPE é a medida mais apropriada para o seu problema ou se uma das outras medidas é melhor.

A accuracy()função funciona em dados reais. Os "dados de teste" são aqueles que não foram usados ​​para construir as previsões. Às vezes, eles estão disponíveis, mas não são usados ​​quando as previsões são calculadas (a clássica divisão de dados em conjuntos de treinamento e teste). Em outras situações, todos os dados disponíveis são usados ​​para calcular as previsões e, em seguida, é necessário aguardar até que haja algumas observações futuras disponíveis para serem usadas como dados de teste.

Então, se fé um vetor de previsões e xum vetor de observações correspondentes aos mesmos horários, então

accuracy(f,x)

fará o que você quiser.

Rob Hyndman
fonte
"Medidas baseadas em erros de porcentagem têm a desvantagem de serem infinitas ou indefinidas se yi = 0 para qualquer i no período de interesse e ter valores extremos quando qualquer yi estiver próximo de zero." Eu acho que isso será um problema no meu caso, porque muitos casos reais podem ser ZERO. Estou pensando em calcular o MAE e alterar o número dos resultados para "porcentagem". Isso faz sentido?
kosa
De alguma forma, minha nota de agradecimento sumiu, muito obrigado pelo seu tempo, Dr. Hyndman!
kosa
2

Accuracy=E(f)yPrecision=Var[fy]

MSFE=1ni=1n(fiyi)2fiyi

Aksakal
fonte
Obrigado pela resposta! Sim, não estou me preocupando com precisão neste momento. Só quero saber a precisão, "desvio da previsão em relação aos valores reais". Não estou preocupado em executar alguns modelos, calcular erros de previsão e escolher o melhor modelo. Meu único objetivo é descobrir o desvio entre os valores reais e os previstos. Nosso modelo é constante aqui. Independentemente do nosso modelo é bom ou ruim para o conjunto de dados, precisamos apenas do número de desvio. Esta questão não está relacionada à seleção de modelos de ajuste fino de parâmetros (ou). Espero que agora eu esteja claro. Por favor, deixe-me saber se algo está faltando.
kosa
@ Nambari, se você precisa do "número de desvios", por que não usa o número de desvios? Faça um loop sobre as previsões, compare-as com os valores reais e conte o número de casos em que as previsões diferem dos valores reais.
Roman
2

Eu tenho feito isso em R. Aqui está o meu código para meus dados para dados dentro e fora da amostra:

#accuracy testing for out-of-sample sample#

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
N<-head(M,-horiz)
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)

#Run your forecasting method#
##My forecasting method is arima##

N<-#data#
N<-ts(N,deltat=deltaT,start=startY)
N<-tail(N,horiz)
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY) #where Arimab is the ARIMA model and fArimab<-forecast(Arimab, h=horiz*2, simulate= TRUE, fan=TRUE)
N<-log(N)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA out sample")

#Accuracy testing for the in sample

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)
#run your forecasting method#
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY)
N<-exp(Nu)
fitted<-exp(fitted)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA in sample")

Espero que isso ajude um pouco. Se você quiser o meu código completo eu costumava executar isso, pergunte, pois isso é muito básico

Verão-Jade Gleek'away
fonte
1

A resposta curta: para avaliar a qualidade de suas previsões, use exatamente a mesma medida que você usou no treinamento (ajuste) do seu modelo.

A resposta longa:

Para escolher uma medida para a precisão de suas previsões, sua primeira necessidade é saber como você interpreta suas previsões. Em outras palavras, o que você realmente dá como uma "previsão"? É valor médio? Mediana? Valor mais provável? A resposta a esta pergunta identificará exclusivamente a medida da precisão da previsão. Se você predizer a média, precisará usar o desvio médio quadrático da raiz como a medida da precisão da previsão. Se você prevê mediana, deve usar o desvio médio absoluto como medida de precisão.

Vou elaborar um pouco sobre esse ponto. Vamos supor que você faça uma previsão / previsão para amanhã. Vamos supor também que, para qualquer valor que você possa observar amanhã, você tenha uma probabilidade correspondente a ser observada. Por exemplo, você sabe que pode observar 1 com probabilidade 0,03, 2 com probabilidade 0,07, 3 com probabilidade 0,11 e assim por diante. Portanto, você tem uma distribuição de probabilidades em diferentes valores. Tendo essa distribuição, você pode calcular propriedades diferentes e atribuí-las como suas "previsões". Você pode calcular a média e dar como previsão para amanhã. Como alternativa, você pode usar mediana como sua previsão. Você também pode encontrar o valor mais provável e fornecê-lo como sua previsão para amanhã.

Se você usar o valor médio como previsão, a pergunta "como medir a precisão da minha previsão" deverá ser substituída por "qual é a medida da precisão da média" e a resposta será "desvio médio quadrático entre o valores reais e previsão ". Se você usar mediana como previsões, deverá usar o desvio médio absoluto.

Pode ser que você não saiba se usa mediana, média ou outra coisa. Para descobrir o que você realmente usa como previsões, você precisa saber qual medida você tenta minimizar no treinamento. Se você tentar encontrar parâmetros do modelo que minimizem o desvio do quadrado médio da raiz entre as previsões e os valores-alvo dos dados de treinamento, suas previsões deverão ser tratadas como médias. Se você minimizar os desvios absolutos, treina seu modelo para fornecer medianas e assim por diante.

ADICIONADO

Eu gostaria de enfatizar uma coisa. Como mencionei acima, é importante manter a mesma medida de precisão em "ajuste" e em "previsão". Além disso, gostaria de dizer que você é absolutamente livre na escolha de suas medidas. Não existem medidas "melhores" ou "piores". A medida deve ser determinada pela maneira como você (ou seu cliente) usa suas previsões. Por exemplo, pode ser muito importante (para você ou seu cliente) ter uma correspondência exata e, se você não a tiver, ela não desempenhará nenhum papel se a diferença entre os valores reais e previstos for grande ou pequena. Em outros casos, essa diferença desempenha um papel. A diferença de 1 é melhor que a diferença de 2. Em alguns casos, a diferença de 2 é 2 vezes pior que a diferença de 1. Em outros casos, a diferença igual a 2 é 100 vezes pior que a diferença igual a 1. Você também pode imaginar casos exóticos nos quais você precisa gerar um valor que difere das observações. Portanto, a medida da qualidade dos números que você gera pode ser o que você quiser, dependendo do que você precisa. O que é importante é usar a mesma medida no treinamento (ajuste) e avaliação das previsões.

romano
fonte
(Relacionado ao seu comentário sobre outra resposta) Na maioria dos casos, as previsões diferem dos valores reais, e não acho que possamos obter o ajuste perfeito. Portanto, a abordagem que você sugeriu pode não ser ideal, pois obteremos 100%. Mas o que estou pensando é obter a diferença entre a previsão real e a previsão em porcentagem, que nada mais é do que MAPE. O caso que estamos lidando tem chances muito altas de obter ZERO com muita frequência, devido às circunstâncias, caso em que o MAPE pode não ser a melhor opção porque o percentual será INFINITY. Aqui é onde eu estava preso.
Kosa
Eu sei que o MAPE é o princípio que eu quero, mas meu conjunto de dados tem esse caso infeliz em que os valores REAL em série podem ser ZERO com muita frequência.
Kosa