Previsão multivariada de séries temporais com base nos dados de qualidade do ar de Seattle


Neste tutorial, você aprenderá a criar um modelo de série temporal multivariada (ARIMA_PLUS_XREG) para realizar previsões de série temporal usando as seguintes tabelas de amostra no conjunto de dados epa_historical_air_quality:

O conjunto de dados epa_historical_air_quality contém informações diárias de PM 2.5, temperatura e velocidade do vento coletadas de várias cidades dos EUA.

Objetivos

Neste tutorial, você usará:

  • A instrução CREATE MODEL: para criar um modelo de série temporal.
  • A função ML.ARIMA_EVALUATE: para inspecionar as informações de avaliação relacionadas ao ARIMA no modelo.
  • A função ML.ARIMA_COEFFICIENTS: para inspecionar os coeficientes do modelo.
  • A função ML.FORECAST: para prever o PM 2.5 diariamente.
  • A função ML.EVALUATE: para avaliar o modelo com dados reais.
  • A função ML.EXPLAIN_FORECAST: extrair vários componentes da série temporal (como sazonalidade, tendências e atribuições de recursos) que podem ser usados para explicar os resultados da previsão. de dois minutos.

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:

  • 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. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

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

    Ative a API BigQuery.

    Ative a API

Etapa 1: criar conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar o modelo de ML:

  1. No console do Google Cloud, acesse a página do 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.

    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.

Etapa 2: criar uma tabela de série temporal com recursos extras

Os dados de PM 2.5, temperatura e velocidade do vento estão em tabelas separadas. Para simplificar as consultas a seguir, crie uma tabela bqml_tutorial.seattle_air_quality_daily mesclando essas tabelas, com as seguintes colunas:

  • date: a data da observação
  • PM 2.5: o valor médio de PM 2.5 de cada dia
  • wind_speed: a velocidade média do vento de cada dia
  • temperature: a temperatura mais alta de cada dia

A nova tabela tem dados diários de 11/08/2009 a 31/01/2022.

Na consulta do GoogleSQL a seguir, a cláusula FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary indica que você está consultando as tabelas *_daily_summary no conjunto de dados epa_historical_air_quality. Essas tabelas são tabelas particionadas.

#standardSQL
CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
AS
WITH
  pm25_daily AS (
    SELECT
      avg(arithmetic_mean) AS pm25, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
    WHERE
      city_name = 'Seattle'
      AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
    GROUP BY date_local
  ),
  wind_speed_daily AS (
    SELECT
      avg(arithmetic_mean) AS wind_speed, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
    WHERE
      city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
    GROUP BY date_local
  ),
  temperature_daily AS (
    SELECT
      avg(first_max_value) AS temperature, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
    WHERE
      city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
    GROUP BY date_local
  )
SELECT
  pm25_daily.date AS date, pm25, wind_speed, temperature
FROM pm25_daily
JOIN wind_speed_daily USING (date)
JOIN temperature_daily USING (date)

Para executar a consulta, siga estas etapas:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

  3. Clique em Executar.

Etapa 3 (opcional): visualizar a série temporal que você quer prever

Antes de criar o modelo, é interessante ver como fica a série temporal de entrada. Faça isso usando o Looker Studio.

Na consulta GoogleSQL padrão a seguir, a cláusula FROM bqml_tutorial.seattle_air_quality_daily indica que você está consultando a tabela seattle_air_quality_daily no conjunto de dados bqml_tutorial que você acabou de criar.

#standardSQL
SELECT
  *
FROM
  `bqml_tutorial.seattle_air_quality_daily`

Para executar a consulta, siga estas etapas:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     `bqml_tutorial.seattle_air_quality_daily`
    
  3. Clique em Executar.

    Depois que essa consulta for executada, a saída será semelhante à captura de tela a seguir. Na captura de tela, é possível conferir que essa série temporal tem 3960 pontos de dados. Clique no botão Explorar dados e, em seguida, em Explorar com o Looker Studio. O Looker Studio é aberto em uma nova guia. Conclua as etapas a seguir na nova guia.

    Saída da consulta

    No painel Gráfico, escolha Gráfico de série temporal:

    Time_series_chart

    No painel CONFIGURAÇÃO, abaixo do painel Gráfico, acesse a seção Métrica. Adicione os campos pm25, temperature e wind_speed e remova a métrica padrão Contagem de registros. Também é possível definir um período personalizado, como de 1° de janeiro de 2019 a 31 de dezembro de 2021, para tornar a série temporal mais curta. Isso é mostrado na figura a seguir.

    Time_series_data_fields

    Depois que você concluir essas etapas, o gráfico a seguir será exibido. O gráfico mostra que a série temporal de entrada tem um padrão sazonal semanal.

    Result_visualization

Etapa 4: criar seu modelo de série temporal

Em seguida, crie um modelo de série temporal usando os dados de qualidade do ar acima. A consulta do GoogleSQL a seguir cria um modelo usado para prever pm25.

A cláusula CREATE MODEL cria e treina um modelo chamado bqml_tutorial.seattle_pm25_xreg_model.

#standardSQL
CREATE OR REPLACE
  MODEL
    `bqml_tutorial.seattle_pm25_xreg_model`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS_XREG',
    time_series_timestamp_col = 'date',
    time_series_data_col = 'pm25')
AS
SELECT
  date,
  pm25,
  temperature,
  wind_speed
FROM
  `bqml_tutorial.seattle_air_quality_daily`
WHERE
  date
  BETWEEN DATE('2012-01-01')
  AND DATE('2020-12-31')

A cláusula OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) indica que você está criando um ARIMA com um modelo de regressores externos. Por padrão, auto_arima=TRUE, para que o algoritmo auto.ARIMA ajuste automaticamente os hiperparâmetros nos modelos ARIMA_PLUS_XREG. O algoritmo se encaixa em dezenas de modelos candidatos e escolhe o melhor com o menor índice de informações do Akaike (AIC, na sigla em inglês). Além disso, como o padrão é data_frequency='AUTO_FREQUENCY', o processo de treinamento infere automaticamente a frequência de dados da série temporal de entrada.

Execute a consulta CREATE MODEL para criar e treinar seu modelo:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

  3. Clique em Executar.

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

Etapa 5: inspecionar as métricas de avaliação de todos os modelos avaliados

Depois de criar seu modelo, use a função ML.ARIMA_EVALUATE para ver as métricas de avaliação de todos os modelos candidatos avaliados durante o processo de ajuste automático de hiperparâmetros.

Na consulta do GoogleSQL a seguir, a cláusula FROM usa a função ML.ARIMA_EVALUATE no seu modelo, bqml_tutorial.seattle_pm25_xreg_model. Por padrão, essa consulta retorna as métricas de avaliação de todos os modelos candidatos.

Para executar a consulta ML.ARIMA_EVALUATE, siga estas etapas:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
    
  3. Clique em Executar.

  4. Após concluir a consulta, clique na guia Resultados abaixo da área de texto da consulta. Os resultados serão semelhantes à seguinte captura de tela:

    Saída de ML.ARIMA_EVALUATE.

    Os resultados incluem as seguintes colunas:

    • 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

    As quatro colunas a seguir (non_seasonal_{p,d,q} e has_drift) definem um modelo ARIMA no pipeline de treinamento. As três métricas seguintes (log_likelihood, AIC e variance) são relevantes para o processo de ajuste do modelo ARIMA.

    O algoritmo auto.ARIMA usa primeiro o teste KPSS para decidir que o melhor valor para non_seasonal_d é 1. Quando non_seasonal_d for 1, o auto.ARIMA treinará 42 modelos ARIMA candidatos em paralelo. Quando non_seasonal_d não for 1, o auto.ARIMA treinará 21 modelos candidatos diferentes. Neste exemplo, todos os 42 modelos candidatos são válidos. Portanto, a saída contém 42 linhas, em que cada linha está associada a um modelo ARIMA candidato. Para algumas séries temporais, alguns modelos candidatos são inválidos porque não são estáticos ou não podem ser invertidos. Esses modelos inválidos são excluídos da saída, o que faz com que ela tenha menos de 42 linhas. Esses modelos candidatos são ordenados pelo AIC na ordem crescente. O modelo na primeira linha tem o AIC mais baixo e é considerado o melhor modelo. Esse melhor modelo é salvo como o modelo final. Ele é usado quando você chama ML.FORECAST, ML.EVALUATE e ML.ARIMA_COEFFICIENTS, conforme mostrado nas etapas a seguir.

    A coluna seasonal_periods é sobre o padrão sazonal dentro da série temporal de entrada. 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 está dentro das nossas expectativas, conforme descrito anteriormente na etapa dois.

    As colunas has_holiday_effect, has_spikes_and_dips e has_step_changes são preenchidas somente quando decompose_time_series=TRUE. Eles são relacionados ao efeito de fim de ano, picos e quedas e mudanças na etapa dentro da série temporal de entrada, que não estão relacionados à modelagem ARIMA. Portanto, elas são todas iguais em todas as linhas de saída, exceto nos modelos com falha.

    A coluna error_message mostra que o possível erro incorrido durante o processo de ajuste de auto.ARIMA. Um possível motivo é que as colunas selecionadas non_seasonal_p, non_seasonal_d, non_seasonal_q e has_drift não podem estabilizar a série temporal. Para recuperar a mensagem de erro possível de todos os modelos candidatos, defina show_all_candidate_models=true.

Etapa 6: inspecionar os coeficientes do seu modelo

A função ML.ARIMA_COEFFICIENTS recupera os coeficientes do modelo ARIMA_PLUS, bqml_tutorial.seattle_pm25_xreg_model. ML.ARIMA_COEFFICIENTS usa o modelo como a única entrada.

Execute a consulta ML.ARIMA_COEFFICIENTS:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
    
  3. Clique em Executar.

    Os resultados vão ter a aparência abaixo:

    Saída ML.ARIMA_COEFFICIENTS.

    Os resultados incluem as seguintes colunas:

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift
    • processed_input
    • weight
    • category_weights.category
    • category_weights.weight

    ar_coefficients mostra os coeficientes do modelo da parte autoregressiva (AR) do modelo ARIMA. Da mesma forma, ma_coefficients mostra os coeficientes do modelo da parte de média móvel (MA, na sigla em inglês). Ambos são matrizes, com comprimentos iguais a non_seasonal_p e non_seasonal_q, respectivamente. Na saída de ML.ARIMA_EVALUATE, assim como na linha superior, o melhor modelo tem um non_seasonal_p de 0 e um non_seasonal_q de 5. Portanto, ar_coefficients é uma matriz vazia e ma_coefficients é uma matriz de comprimento 5. O intercept_or_drift é o termo constante no modelo ARIMA.

    processed_input e as colunas weight e category_weights correspondentes mostram os pesos de cada atributo e a interceptação no modelo de regressão linear. Se o atributo for numérico, o peso estará na coluna weight. Se o atributo for categórico, category_weights será um ARRAY de STRUCT, em que STRUCT contém os nomes e pesos das categorias.

Etapa 7: usar seu modelo para prever a série temporal

A função ML.FORECAST prevê valores de série temporal futuros com um intervalo de previsão usando o modelo bqml_tutorial.seattle_pm25_xreg_model e valores de atributos futuros.

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%. ML.FORECAST usa o modelo, os valores de atributos futuros, bem como alguns argumentos opcionais.

Para executar a consulta ML.FORECAST, use as seguintes etapas:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

    #standardSQL
    SELECT
    *
    FROM
    ML.FORECAST(
    MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
    STRUCT(30 AS horizon, 0.8 AS confidence_level),
    (
      SELECT
        date,
        temperature,
        wind_speed
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date > DATE('2020-12-31')
    ))
    
  3. Clique em Executar.

    Os resultados vão ter a aparência abaixo:

    Saída ML.FORECAST.

    Os resultados incluem as seguintes colunas:

    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound

    As linhas de saída são ordenadas na ordem cronológica de forecast_timestamp. Na previsão de série temporal, o intervalo de previsão, capturado pelos limites mínimo e máximo, é tão importante quanto o forecast_value. O forecast_value é o ponto central do intervalo de previsão. O intervalo de previsão depende de standard_error e confidence_level.

Etapa 8: avaliar a precisão da previsão com dados reais

Para avaliar a precisão da previsão com os dados reais, é possível usar a função ML.EVALUATE com seu modelo, bqml_tutorial.seattle_pm25_xreg_model e a tabela de dados real.

Para executar a consulta ML.EVALUATE, use as seguintes etapas:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

    #standardSQL
    SELECT
    *
    FROM
    ML.EVALUATE(
    MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
    (
      SELECT
        date,
        pm25,
        temperature,
        wind_speed
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date > DATE('2020-12-31')
    ),
    STRUCT(
      TRUE AS perform_aggregation,
      30 AS horizon))
    

    O segundo parâmetro consiste nos dados reais com os atributos futuros, que são usados para prever os valores futuros a serem comparados com os dados reais. O terceiro parâmetro é uma estrutura de parâmetros para essa função.

  3. Clique em Executar.

    Os resultados vão ter a aparência abaixo:

    Saída de ML.EVALUATE.

Etapa 9: explicar os resultados da previsão

Para entender como a série temporal é prevista, a função ML.EXPLAIN_FORECAST prevê valores futuros da série temporal com um intervalo de previsão usando seu modelo bqml_tutorial.seattle_pm25_xreg_model e, ao mesmo tempo, retorna todos os componentes separados da série temporal.

Como a função ML.FORECAST, a cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) indica que a consulta prevê 30 pontos no tempo futuro e gera um intervalo de previsão com 80% de confiança. A função ML.EXPLAIN_FORECAST usa o modelo, os valores de recursos futuros e alguns argumentos opcionais como entrada.

Para executar a consulta ML.EXPLAIN_FORECAST, use as seguintes etapas:

  1. No console do Google Cloud, clique no botão Escrever nova consulta.

  2. Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.

    #standardSQL
    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ))
    
  3. Clique em Executar.

    A consulta leva menos de um segundo para ser concluída. Os resultados terão o seguinte formato:

    ML.EXPLAIN_FORECAST output1. ML.EXPLAIN_FORECAST output2.

    Os resultados incluem as seguintes colunas:

    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes
    • residual
    • attribution_temperature
    • attribution_wind_speed
    • attribution___INTERCEPT__

    As linhas de saída são ordenadas na ordem cronológica de time_series_timestamp. Componentes diferentes são listados como colunas da saída. Para mais informações, consulte ML.EXPLAIN_FORECAST.

Limpeza

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. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir