Prever uma única série temporal com um modelo univariado


Neste tutorial, você vai aprender a usar um modelo de série temporal univariado para prever o valor futuro de uma determinada coluna com base nos valores históricos dela.

Neste tutorial, você vai aprender a fazer a previsão de uma única série temporal. Os valores previstos são calculados uma vez para cada ponto de tempo nos dados de entrada.

Este tutorial usa dados da tabela de amostra bigquery-public-data.google_analytics_sample.ga_sessions pública. Esta tabela contém dados ofuscados de e-commerce da Google Merchandise Store.

Objetivos

Este tutorial vai orientar você nas seguintes tarefas:

Custos

Neste tutorial, usamos componentes faturáveis do Google Cloud, incluindo:

  • BigQuery
  • BigQuery ML

Para mais informações sobre os custos do BigQuery, consulte a página de preços.

Para mais informações sobre os custos do BigQuery ML, consulte os preços do BigQuery ML.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. O BigQuery é ativado automaticamente em novos projetos. Para ativar o BigQuery em um projeto preexistente, acesse

    Enable the BigQuery API.

    Enable the API

Permissões exigidas

  • Para criar o conjunto de dados, é preciso ter a permissão de IAM bigquery.datasets.create.

  • Para criar o modelo, você precisa das seguintes permissões:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para executar a inferência, você precisa das seguintes permissões:

    • bigquery.models.getData
    • bigquery.jobs.create

Para mais informações sobre os papéis e as permissões do IAM no BigQuery, consulte Introdução ao IAM.

Criar um conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar seu modelo de ML.

Console

  1. No Console do Google Cloud, acesse a página BigQuery.

    Acesse a página do BigQuery

  2. No painel Explorer, clique no nome do seu projeto.

  3. Clique em Conferir ações > Criar conjunto de dados.

    Opção do menu "Criar conjunto de dados".

  4. Na página Criar conjunto de dados, faça o seguinte:

    • Para o código do conjunto de dados, insira bqml_tutorial.

    • Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).

    Os conjuntos de dados públicos são armazenados na multirregião US. Para simplificar, armazene seus conjuntos de dados no mesmo local.

    • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

    Página "Criar conjunto de dados" com os valores preenchidos.

bq

Para criar um novo conjunto de dados, utilize o comando bq mk com a sinalização --location. Para obter uma lista completa de parâmetros, consulte a referência comando bq mk --dataset.

  1. Crie um conjunto de dados chamado bqml_tutorial com o local de dados definido como US e uma descrição de BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Em vez de usar a flag --dataset, o comando usa o atalho -d. Se você omitir -d e --dataset, o comando vai criar um conjunto de dados por padrão.

  2. Confirme se o conjunto de dados foi criado:

    bq ls

API

Chame o método datasets.insert com um recurso de conjunto de dados definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

Visualizar os dados de entrada

Antes de criar o modelo, você pode visualizar os dados de série temporal de entrada para ter uma ideia da distribuição. Faça isso usando o Looker Studio.

Siga estas etapas para visualizar os dados da série temporal:

SQL

Na consulta GoogleSQL a seguir, a instrução SELECT analisa a coluna date da tabela de entrada para o tipo TIMESTAMP e a renomeia como parsed_date. Além disso, ela usa as cláusulas SUM(...) e GROUP BY date para criar um valor totals.visits diário.

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date;
    1. Quando a consulta for concluída, clique em Explorar dados > Explorar com o Looker Studio. O Looker Studio é aberto em uma nova guia. Conclua as etapas a seguir na nova guia.

    2. No Looker Studio, clique em Inserir > Gráfico de série temporal.

    3. No painel Gráfico, escolha a guia Configuração.

    4. Na seção Métrica, adicione o campo total_visits e remova a métrica padrão Contagem de registros. O gráfico resultante é semelhante a este:

      Result_visualization

      Analisando o gráfico, é possível ver que a série temporal de entrada tem um padrão sazonal semanal.

BigQuery DataFrames

Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

import bigframes.pandas as bpd

# Start by loading the historical data from BigQuerythat you want to analyze and forecast.
# This clause indicates that you are querying the ga_sessions_* tables in the google_analytics_sample dataset.
# Read and visualize the time series you want to forecast.
df = bpd.read_gbq("bigquery-public-data.google_analytics_sample.ga_sessions_*")
parsed_date = bpd.to_datetime(df.date, format="%Y%m%d", utc=True)
parsed_date.name = "parsed_date"
visits = df["totals"].struct.field("visits")
visits.name = "total_visits"
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# parsed_date
# 2016-08-01 00:00:00+00:00    1711
# 2016-08-02 00:00:00+00:00    2140
# 2016-08-03 00:00:00+00:00    2890
# 2016-08-04 00:00:00+00:00    3161
# 2016-08-05 00:00:00+00:00    2702
# Name: total_visits, dtype: Int64

total_visits.plot.line()

O resultado será semelhante ao seguinte: Result_visualization

Criar o modelo de série temporal

Crie um modelo de série temporal para prever o total de visitas ao site, conforme representado pela coluna totals.visits, e treine-o com os dados do Google Analytics 360.

SQL

Na consulta a seguir, a cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que você está criando um modelo de série temporal com base em ARIMA. A opção auto_arima da instrução CREATE MODEL é padrão para TRUE. Portanto, o algoritmo auto.ARIMA ajusta automaticamente os hiperparâmetros no modelo. O algoritmo se encaixa em dezenas de modelos candidatos e escolhe o melhor, que é o modelo com o menor critério de informação de Akaike (AIC). A opção data_frequency das instruções CREATE MODEL é padrão para AUTO_FREQUENCY. Assim, o processo de treinamento infere automaticamente a frequência de dados da série temporal de entrada. A opção decompose_time_series da instrução CREATE MODEL é definida como TRUE por padrão. Assim, as informações sobre os dados de séries temporais são retornadas quando você avalia o modelo na próxima etapa.

Siga estas etapas para criar o modelo:

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
    OPTIONS
    (model_type = 'ARIMA_PLUS',
     time_series_timestamp_col = 'parsed_date',
     time_series_data_col = 'total_visits',
     auto_arima = TRUE,
     data_frequency = 'AUTO_FREQUENCY',
     decompose_time_series = TRUE
    ) AS
    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date;

    A consulta leva cerca de quatro segundos para ser concluída. Depois disso, o modelo ga_arima_model aparece no painel Explorer. Como a consulta usa uma instrução CREATE MODEL para criar um modelo, não é possível ver os resultados da consulta.

BigQuery DataFrames

Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

from bigframes.ml import forecasting
import bigframes.pandas as bpd

# Create a time series model to forecast total site visits:
# The auto_arima option defaults to True, so the auto.ARIMA algorithm automatically
# tunes the hyperparameters in the model.
# The data_frequency option defaults to 'auto_frequency so the training
# process automatically infers the data frequency of the input time series.
# The decompose_time_series option defaults to True, so that information about
# the time series data is returned when you evaluate the model in the next step.
model = forecasting.ARIMAPlus()
model.auto_arima = True
model.data_frequency = "auto_frequency"
model.decompose_time_series = True

# Use the data loaded in the previous step to fit the model
training_data = total_visits.to_frame().reset_index(drop=False)

X = training_data[["parsed_date"]]
y = training_data[["total_visits"]]

model.fit(X, y)

Avaliar os modelos candidatos

SQL

Avalie os modelos de séries temporais usando a função ML.ARIMA_EVALUATE. A função ML.ARIMA_EVALUATE mostra as métricas de avaliação de todos os modelos candidatos avaliados durante o processo de ajuste automático de hiperparâmetros.

Siga estas etapas para avaliar o modelo:

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
    *
    FROM
    ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.ga_arima_model`);

    A resposta deve ficar assim:

    Saída de ML.ARIMA_EVALUATE.

BigQuery DataFrames

Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

# Evaluate the time series models by using the summary() function. The summary()
# function shows you the evaluation metrics of all the candidate models evaluated
# during the process of automatic hyperparameter tuning.
summary = model.summary(
    show_all_candidate_models=True,
)
print(summary.peek())

# Expected output:
# row   non_seasonal_p	non_seasonal_d	non_seasonal_q	has_drift	log_likelihood	AIC	variance	seasonal_periods	has_holiday_effect	has_spikes_and_dips	has_step_changes	error_message
#  0	      0	              1	               3	      True	     -2464.255656	4938.511313	     42772.506055	        ['WEEKLY']	            False	        False	            True
#  1	      2	              1	               0	      False	     -2473.141651	4952.283303	     44942.416463	        ['WEEKLY']	            False	        False	            True
#  2	      1	              1	               0 	      False	     -2479.880885	4963.76177	     46642.953433	        ['WEEKLY']	            False	        False	            True
#  3	      0	              1	               1	      False	     -2470.632377	4945.264753	     44319.379307	        ['WEEKLY']	            False	        False	            True
#  4	      2	              1	               1	      True	     -2463.671247	4937.342493	     42633.299513	        ['WEEKLY']	            False	        False	            True

As colunas de saída non_seasonal_p, non_seasonal_d, non_seasonal_q e has_drift definem um modelo ARIMA no pipeline de treinamento. As colunas de saída log_likelihood, AIC e variance são relevantes para o processo de ajuste do modelo ARIMA.

O algoritmo auto.ARIMA usa o teste KPSS para determinar o melhor valor para non_seasonal_d, que neste caso é 1. Quando non_seasonal_d é 1, o algoritmo auto.ARIMA treina 42 modelos ARIMA candidatos diferentes em paralelo. Neste exemplo, todos os 42 modelos candidatos são válidos, portanto, a saída contém 42 linhas, uma para cada modelo ARIMA candidato. Nos casos em que alguns dos modelos não são válidos, eles são excluídos da saída. Esses modelos candidatos são retornados em ordem crescente pelo AIC. O modelo na primeira linha tem o AIC mais baixo e é considerado o melhor. O melhor modelo é salvo como o modelo final e é usado quando você chama funções como ML.FORECAST no modelo.

A coluna seasonal_periods contém informações sobre o padrão sazonal identificado nos dados de série temporal. Ele não tem nada a ver com a modelagem ARIMA. Portanto, ele tem o mesmo valor em todas as linhas de saída. Ele informa um padrão semanal, que concorda com os resultados que você viu se você escolheu visualizar os dados de entrada.

As colunas has_holiday_effect, has_spikes_and_dips e has_step_changes são preenchidas somente quando decompose_time_series=TRUE. Essas colunas também refletem informações sobre os dados de série temporal de entrada e não estão relacionadas à modelagem ARIMA. Essas colunas também têm os mesmos valores em todas as linhas de saída.

A coluna error_message mostra todos os erros que ocorreram durante o processo de ajuste de auto.ARIMA. Um possível motivo para erros é quando as colunas selecionadas non_seasonal_p, non_seasonal_d, non_seasonal_q e has_drift não conseguem estabilizar a série temporal. Para recuperar a mensagem de erro de todos os modelos candidatos, defina a opção show_all_candidate_models como TRUE ao criar o modelo.

Para mais informações sobre as colunas de saída, consulte a função ML.ARIMA_EVALUATE.

Inspecionar os coeficientes do modelo

SQL

Inspecione os coeficientes do modelo de série temporal usando a função ML.ARIMA_COEFFICIENTS.

Siga estas etapas para extrair os coeficientes do modelo:

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
    *
    FROM
    ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.ga_arima_model`);

A coluna de saída ar_coefficients mostra os coeficientes do modelo da parte autoregressiva (AR) do modelo ARIMA. Da mesma forma, a coluna de saída ma_coefficients mostra os coeficientes do modelo da parte de média móvel (MA, na sigla em inglês) do modelo ARIMA. Ambas as colunas contêm valores de matriz, com comprimentos iguais a non_seasonal_p e non_seasonal_q, respectivamente. Você viu na saída da função ML.ARIMA_EVALUATE que o melhor modelo tem um valor non_seasonal_p de 2 e um valor non_seasonal_q de 3. Portanto, na saída ML.ARIMA_COEFFICIENTS, o valor ar_coefficients é uma matriz de dois elementos e o valor ma_coefficients é uma matriz de três elementos. O valor intercept_or_drift é o termo constante no modelo ARIMA.

Para mais informações sobre as colunas de saída, consulte a função ML.ARIMA_COEFFICIENTS.

BigQuery DataFrames

Inspecione os coeficientes do modelo de série temporal usando a função coef_.

Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

coef = model.coef_
print(coef.peek())

# Expected output:
#       ar_coefficients   ma_coefficients   intercept_or_drift
#   0	 [0.40944762]	   [-0.81168198]	      0.0

A coluna de saída ar_coefficients mostra os coeficientes do modelo da parte autoregressiva (AR) do modelo ARIMA. Da mesma forma, a coluna de saída ma_coefficients mostra os coeficientes do modelo da parte de média móvel (MA, na sigla em inglês) do modelo ARIMA. Ambas as colunas contêm valores de matriz, com comprimentos iguais a non_seasonal_p e non_seasonal_q, respectivamente.

Usar o modelo para prever dados

SQL

Prever valores futuros da série temporal usando a função ML.FORECAST.

Na consulta GoogleSQL padrão a seguir, a cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) indica que a consulta prevê 30 períodos futuros e gera um intervalo de previsão com um nível de confiança de 80%.

Siga estas etapas para prever dados com o modelo:

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
    *
    FROM
    ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
              STRUCT(30 AS horizon, 0.8 AS confidence_level));

    A resposta deve ficar assim:

    Saída ML.FORECAST.

BigQuery DataFrames

Prever valores futuros da série temporal usando a função predict.

Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

prediction = model.predict(horizon=30, confidence_level=0.8)

print(prediction.peek())
# Expected output:
#           forecast_timestamp	   forecast_value	standard_error	confidence_level	prediction_interval_lower_bound	    prediction_interval_upper_bound	    confidence_interval_lower_bound	    confidence_interval_upper_bound
# 11	2017-08-13 00:00:00+00:00	1845.439732	      328.060405	      0.8	                 1424.772257	                      2266.107208	                     1424.772257	                     2266.107208
# 29	2017-08-31 00:00:00+00:00	2615.993932	      431.286628	      0.8	                 2062.960849	                      3169.027015	                     2062.960849	                     3169.027015
# 7	    2017-08-09 00:00:00+00:00	2639.285993	      300.301186	      0.8	                 2254.213792	                      3024.358193	                     2254.213792	                     3024.358193
# 25	2017-08-27 00:00:00+00:00	1853.735689	      410.596551	      0.8	                 1327.233216	                      2380.238162	                     1327.233216	                     2380.238162
# 1	    2017-08-03 00:00:00+00:00	2621.33159	      241.093355	      0.8	                 2312.180802	                      2930.482379	                     2312.180802	                     2930.482379

As linhas de saída estão na ordem cronológica pelo valor da coluna forecast_timestamp. Na previsão de séries temporais, o intervalo de previsão, representado pelos valores das colunas prediction_interval_lower_bound e prediction_interval_upper_bound, é tão importante quanto o valor da coluna forecast_value. O valor forecast_value é o ponto central do intervalo de previsão. O intervalo de previsão depende dos valores das colunas standard_error e confidence_level.

Para mais informações sobre as colunas de saída, consulte a função ML.FORECAST.

Explicar os resultados da previsão

É possível receber métricas de explicabilidade, além de dados de previsão, usando a função ML.EXPLAIN_FORECAST. A função ML.EXPLAIN_FORECAST prevê valores futuros da série temporal e também retorna todos os componentes separados da série temporal.

Assim como a função ML.FORECAST, a cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) usada na função ML.EXPLAIN_FORECAST indica que a consulta prevê 30 pontos no tempo futuro e gera um intervalo de previsão com 80% de confiança.

Siga estas etapas para explicar os resultados do modelo:

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
       STRUCT(30 AS horizon, 0.8 AS confidence_level));

    A resposta deve ficar assim:

    As nove primeiras colunas de saída de dados e explicações de previsão. As colunas de saída de 10 a 17 dos dados e explicações de previsão. As últimas seis colunas de saída de dados e explicações de previsão.

    As linhas de saída são ordenadas cronologicamente pelo valor da coluna time_series_timestamp.

    Para mais informações sobre as colunas de saída, consulte a função ML.EXPLAIN_FORECAST.

    Se você quiser visualizar os resultados, use o Looker Studio, conforme descrito na seção Visualizar os dados de entrada, para criar um gráfico usando as seguintes colunas como métricas:

    • time_series_data
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • trend
    • seasonal_period_weekly
    • step_changes

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

  • exclua o projeto que você criou; ou
  • Mantenha o projeto e exclua o conjunto de dados.

Excluir o conjunto de dados

A exclusão do seu projeto removerá todos os conjuntos de dados e tabelas no projeto. Caso prefira reutilizá-lo, exclua o conjunto de dados criado neste tutorial:

  1. Se necessário, abra a página do BigQuery no console do Google Cloud.

    Acesse a página do BigQuery

  2. Na navegação, clique no conjunto de dados bqml_tutorial criado.

  3. Clique em Excluir conjunto de dados no lado direito da janela. Essa ação exclui o conjunto, a tabela e todos os dados.

  4. Na caixa de diálogo Excluir conjunto de dados, confirme o comando de exclusão digitando o nome do seu conjunto de dados (bqml_tutorial) e clique em Excluir.

Excluir o projeto

Para excluir o projeto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

A seguir