Nachiketa Hebbar

Seguir

18 de setembro, 2020 – 8 min ler

Previsão da série temporal é uma das técnicas mais procuradas da ciência dos dados, seja na negociação de ações, previsão de vendas ou previsão do tempo. É claramente uma habilidade muito útil de se ter e vou equipá-lo com isso mesmo no final deste artigo.

Neste tutorial, vamos construir um modelo ARIMA (não se preocupe se você ainda não sabe exatamente como isso funciona) para prever os valores futuros de temperatura de uma determinada cidade usando python. O link do GitHub para o código e conjunto de dados pode ser encontrado no final deste blog. Eu também anexei meu vídeo do YouTube no final, caso você esteja interessado em uma explicação em vídeo. Então sem perder tempo vamos começar.

O primeiro passo em qualquer série temporal é ler seus dados e ver como eles se parecem. O seguinte trecho de código demonstra como fazer isso.

O código é bem simples. Nós lemos os dados usando pd.read_csv e escrevendo parse_date=True, assegura que pandas entende que está lidando com valores de data e não com valores de string.

Próximo, deixamos cair quaisquer valores faltantes e imprimimos a forma dos dados. df.head() imprime as 5 primeiras linhas do conjunto de dados. Aqui está a saída que você deve ver para isto:

Plot Your data

O próximo é plotar os seus dados. Isto dá-lhe uma ideia se os dados são estacionários ou não. Para aqueles que não sabem o que significa estacionaridade, deixe-me dar-lhe uma ideia geral. Embora eu tenha feito vários vídeos sobre este tópico, tudo se resume a isto:

Todos os dados da série temporal que têm de ser modelados precisam de ser estacionários. Estacionário significa que as suas propriedades estatísticas são mais ou menos constantes com o tempo. Faz sentido, certo? De que outra forma é suposto fazer previsões se as propriedades estatísticas estão a variar com o tempo? Estas são as seguintes propriedades que qualquer modelo de estacionaridade terá:

  1. Média Constante
  2. Variação Constante(Pode haver variações, mas as variações não devem ser irregulares)
  3. Sem sazonalidade(Sem repetição de padrões no conjunto de dados)

Então o primeiro passo é verificar a estacionaridade. Se o seu conjunto de dados não estiver estacionário, você terá que convertê-lo para uma série estacionária. Agora antes de começar a se preocupar com tudo isso, relaxe! Nós temos um teste fácil e fixo para verificar a estacionaridade chamado ADF(Augmented Dickey Fuller Test). Mas antes de mostrar isso, vamos plotar os dados primeiro.

Desde que eu só estou interessado em prever a temperatura média, essa é a única coluna que eu estarei plotando.

df.plot(figsize=(12,5))

Verificando a estacionaridade

Direito fora do taco, podemos ver que parece ter uma média constante em torno de 45. E as flutuações também parecem ser mais ou menos as mesmas. Entretanto, para ter certeza se os dados estão estacionários ou não, nós executamos um teste estatístico fixo usando o seguinte código:

Você terá a saída da seguinte forma:

Você não precisa se preocupar com todas as estatísticas complexas. Para interpretar os resultados do teste, você só precisa olhar para o valor p. E você usa o seguinte método simples:

Se p< 0,05; Os dados são estacionários

se p>0,05; Os dados não são estacionários

Não é uma regra difícil e rápida, mas um dado estacionário deve ter um valor de p pequeno. Um valor de p maior poderia indicar a presença de certas tendências (média variável) ou sazonalidade também.

Finalmente, Decida o seu modelo ARIMA

Agora, embora eu tenha feito vários vídeos do YouTube sobre este tópico, se você não entender completamente o que é um modelo ARIMA, permita-me apresentar uma visão geral fácil:

ARIMA é composto por 3 termos(Auto-Regressão + Integrado+Movendo-Média)

  1. Auto-Regressão:

Isto significa basicamente que você está usando os valores anteriores da série temporal para prever o futuro. Quantos valores passados você usa, determine a ordem do modelo AR. Aqui está como um modelo AR(1) se parece:

Y(t)= Algum_Constante*Y(t-1)+ Outro_Constante +Error(t)

Suficientemente simples, certo?

2. Integrado:

Então, lembre-se da nossa conversa sobre estacionaridade, e como é extremamente importante? Bem, se você é um conjunto de dados não é estacionário, na maioria das vezes você precisa realizar algum tipo de operação de diferença para torná-lo estacionário. Se você estiver diferindo com o valor anterior, sua ordem 1 e assim por diante. Aqui está um exemplo disso:

Perdoe o meu desenho ruim. Mas como você pode a série Y(t) não foi estacionária, por causa de uma tendência crescente resultando em uma média variável. Nós simplesmente o subtraímos dos valores anteriores e voilá! Torna-se estacionária. Dependendo dos seus dados, você pode ter que repetir a diferença para obter uma segunda ordem diferente , terceira ordem e assim por diante..

3. Moving Average:

Isto significa basicamente que você está usando erros anteriores para fazer a previsão futura. Também faz sentido, certo? Ao ver como você estava errado em sua previsão, você leva isso em conta para fazer uma previsão melhor. E tal como num modelo AR, o número de erros anteriores(também chamado de número de desfasamentos) que você usa, determina a ordem do modelo.

Aqui está como a equação de ordem MA(1) se parece:
Y(t)= Mean + Some_Constant*Error(t-1) +Error(t)

Então o nosso trabalho principal é decidir a ordem das peças do AR, I, MA que são doadas por(p,d,q) respectivamente.

E antes que você comece a se preocupar, deixe-me dizer que tudo vai ser feito automaticamente. pmdarima biblioteca vem em nosso socorro! Ela faz o trabalho de descobrir a ordem da ARIMA por si só. Eis como se parece o trecho de código:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Certifique-se de instalar a biblioteca pmdarima primeiro usando pip install pmdarima)

O código é bastante auto-explicativo. Nós simplesmente fornecemos nossos dados para a função auto_arima. A função basicamente usa algo chamado como a pontuação AIC para julgar o quão bom é um modelo de ordem em particular. Ela simplesmente tenta minimizar a pontuação do AIC, e aqui está como a saída parece:

Execução do modelo para diferentes combinações de ordens

Nós podemos ver o melhor modelo ARIMA parece ser da ordem (1,0,5) com a pontuação mínima do AIC=8294.785. Com este conhecimento podemos finalmente proceder ao treinamento e ajuste do modelo para começar a fazer previsões!

Dividir seu conjunto de dados

Antes de realmente treinarmos o modelo, temos que dividir o conjunto de dados em uma seção de treinamento e testes. Fazemos isso porque primeiro treinamos o modelo nos dados e mantemos a seção de testes escondida do modelo. Quando o modelo estiver pronto, pedimos que ele faça previsões nos dados de teste e veja como ele funciona.

O seguinte trecho de código ilustra como fazer isso:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Então, como você provavelmente pode dizer, reservamos os últimos 30 dias dos dados como a seção de testes. Você pode ver as formas dos dados reais, e as seções de teste e treinamento na saída.

Secção de treinamento e teste

Finalmente, chegamos ao Juicy Stuff!

Surpreendentemente, criar o modelo ARIMA é na verdade um dos passos mais fáceis uma vez que você tenha feito todos os pré-requisitos. É tão simples como mostrado no código abaixo:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Como você pode ver, nós simplesmente chamamos a função ARIMA, fornecemos nosso conjunto de dados e mencionamos a ordem do modelo ARIMA que queremos. Você poderá ver o resumo do modelo em sua saída também.

Resumo do modelo

Você pode ver muita informação sobre o seu modelo aqui. Você também poderá ver os coeficientes de cada termo AR e MA. Estes não são nada mais que o valor das variáveis que você viu na equação anterior do modelo AR/MA que foram etiquetadas como ‘Some_Constant’. Geralmente uma maior magnitude desta variável significa que ela tem um impacto maior na saída.

Check How Good Your Model Is

Here onde entram os nossos dados de teste. Primeiro fazemos a previsão da temperatura nos dados do teste. Depois plotamos para ver como nossas previsões são comparadas com os dados reais.

Para fazer previsões de fato, precisamos usar a função model.predict e dizer o índice inicial e final no qual queremos fazer as previsões.

Desde que queremos começar a fazer previsões onde os dados de treinamento terminam , é o que escrevi na variável inicial. Queremos parar de fazer previsões quando o conjunto de dados terminar, o que explica a variável final. Se você quiser fazer previsões futuras também, você pode simplesmente mudar isso de acordo na variável inicial e final para os índices que você quiser. Seu gráfico de saída deve se parecer com o seguinte:

Valores de teste vs. gráfico de previsão

Como você pode ver as previsões faz um bom trabalho de correspondência com a tendência real, embora haja um certo atraso aceitável.

Verifica a tua Métrica de Precisão

Para verificar o quão bom ou mau é o teu modelo, encontramos o erro quadrático médio da raiz para ele. O seguinte trecho de código mostra que:

Primeiro verificamos o valor médio do conjunto de dados que sai como sendo 45. E o erro quadrático médio da raiz para este modelo em particular deve chegar a cerca de 2,3. Também deve preocupar-se que a sua raiz média ao quadrado deve ser muito menor do que o valor médio do conjunto de teste. Neste caso podemos ver que o erro médio será aproximadamente 2,3/45 *100=5,1% do valor real.

Então com isso o seu modelo ARIMA está pronto para ir! Em blogs futuros eu vou falar sobre diferentes modelos e como você pode aumentar ainda mais a precisão do modelo.

Se você estiver interessado na explicação em vídeo do mesmo, vá até o meu canal no YouTube para mais conteúdo! Você pode encontrar o link do GitHub para o código e conjunto de dados aqui: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Sinta-se livre para se conectar comigo também no LinkedIn!