Previsão escalonável com milhões de séries temporais no BigQuery


Neste tutorial, você aprenderá a acelerar significativamente o treinamento de um conjunto de modelos de série temporal para executar várias previsões de séries temporais com uma única consulta. Você também aprenderá a avaliar a precisão da previsão.

Em todas as etapas, exceto na última, você usará os dados do new_york.citibike_trips. Esses dados contêm informações sobre as viagens do Citi Bike na cidade de Nova York. Esse conjunto de dados contém apenas algumas centenas de séries temporais. Ele é usado para ilustrar várias estratégias para acelerar o treinamento de modelo. Na última etapa, você usará os dados de iowa_liquor_sales.sales para prever mais de um milhão de séries temporais.

Antes de ler este tutorial, leia Como executar várias previsões de séries temporais com uma única consulta de dados de viagens do Citi Bike de Nova York. Leia também as Práticas recomendadas de previsão de séries temporais em grande escala.

Objetivos

Neste tutorial, você usará:

Para simplificar, este tutorial não abrange como usar ML.FORECAST ou ML.EXPLAIN_FORECAST para gerar previsões (explicáveis). Para saber como usar essas funções, consulte Como executar várias previsões de séries temporais com uma única consulta de dados de viagens do Citi Bike de Nova York.

Custos

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

  • BigQuery
  • BigQuery ML

Para mais informações sobre custos, consulte as páginas de preços do BigQuery e do ML do BigQuery.

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

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 a série temporal para previsão

Na consulta a seguir, a cláusula FROM bigquery-public-data.new_york.citibike_trips indica que você está consultando a tabela citibike_trips no conjunto de dados new_york.

CREATE OR REPLACE TABLE
  `bqml_tutorial.nyc_citibike_time_series` AS
WITH input_time_series AS
(
  SELECT
    start_station_name,
    EXTRACT(DATE FROM starttime) AS date,
    COUNT(*) AS num_trips
  FROM
    `bigquery-public-data.new_york.citibike_trips`
  GROUP BY
    start_station_name, date
)
SELECT table_1.*
FROM input_time_series AS table_1
INNER JOIN (
  SELECT start_station_name,  COUNT(*) AS num_points
  FROM input_time_series
  GROUP BY start_station_name) table_2
ON
  table_1.start_station_name = table_2.start_station_name
WHERE
  num_points > 400

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.

Na instrução SELECT na consulta, a função EXTRACT é usada para extrair as informações de data da coluna starttime. A consulta usa a cláusula COUNT(*) para descobrir o número total diário de viagens do Citi Bike.

table_1 tem 679 séries temporais. A consulta usa lógica INNER JOIN extra para selecionar todas as séries temporais que têm mais de 400 pontos temporais, resultando em um total de 383 séries temporais.

Etapa 3: prever simultaneamente várias séries temporais com parâmetros padrão

Nesta etapa, você prevê o número total diário de viagens que começam em diferentes estações do Citi Bike. Para fazer isso, você precisa prever muitas séries temporais. É possível gravar várias consultas CREATE MODEL. No entanto, isso pode ser um processo tedioso e demorado, especialmente quando você tem um grande número de séries temporais.

Para melhorar esse processo, o BigQuery ML permite a criação de um conjunto de modelos de séries temporais para prever várias séries temporais com uma única consulta. Além disso, todos os modelos de séries temporais são ajustados simultaneamente.

Na consulta do GoogleSQL a seguir, a cláusula CREATE MODEL cria e treina um conjunto de modelos chamado bqml_tutorial.nyc_citibike_arima_model_default.

CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name'
  ) AS
SELECT *
FROM bqml_tutorial.nyc_citibike_time_series
WHERE date < '2016-06-01'

Para executar a consulta CREATE MODEL a fim de criar e treinar seu modelo, 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.

  3. Clique em Executar.

    A consulta leva por volta de 14 minutos e 25 segundos para ser concluída.

A cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que você está criando um conjunto de modelos de séries temporais ARIMA_PLUS baseados em ARIMA. Além de time_series_timestamp_col e time_series_data_col, é preciso especificar time_series_id_col, que é usado para anotar diferentes séries temporais de entrada.

Este exemplo exclui os pontos de tempo na série temporal após 01/06/2016 para que esses pontos de tempo possam ser usados para avaliar a precisão da previsão posteriormente usando a função ML.EVALUATE.

Etapa 4: avaliar a precisão da previsão para cada série temporal

Nesta etapa, você avalia a precisão da previsão para cada série temporal usando a seguinte consulta ML.EVALUATE.

SELECT *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Para executar a consulta acima, 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.

  3. Clique em Executar. Essa consulta relata várias métricas de previsão, incluindo:

    Os resultados terão a aparência abaixo: ML.EVALUATE output1.

ML.EVALUATE usa o modelo ARIMA_PLUS que foi treinado na etapa anterior como o primeiro argumento.

O segundo argumento é uma tabela de dados que contém as informações empíricas. Esses resultados da previsão são comparados aos dados de informações empíricas para calcular as métricas de precisão. Nesse caso, nyc_citibike_time_series contém os pontos de série temporal anteriores a 01/06/2016 e posteriores a 01/06/2016. Os pontos após 01/06/2016 são dados informativos. Os pontos anteriores a 01/06/2016 são usados para treinar o modelo e gerar previsões após essa data. Apenas os pontos após 01/06/2016 serão necessários para calcular as métricas. Os pontos anteriores a 01/06/2016 são ignorados no cálculo de métricas.

O terceiro argumento é um STRUCT que contém dois parâmetros. O horizonte é 7, o que significa que a consulta está calculando a precisão da estimativa com base na previsão de 7 pontos. Se os dados de referência local tiverem menos de sete pontos para a comparação, as métricas de precisão serão calculadas apenas com base nos pontos disponíveis. perform_aggregation tem o valor TRUE, o que significa que as métricas de precisão da previsão são agregadas sobre as métricas no ponto de tempo. Se você especificar perform_aggregation como FALSE, a precisão da previsão será retornada para cada ponto do tempo previsto.

Etapa 5: avaliar a precisão da previsão geral para todas as séries temporais

Nesta etapa, você avalia a precisão da previsão para toda a série temporal de 383 usando a seguinte consulta:

SELECT
  AVG(mean_absolute_percentage_error) AS MAPE,
  AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Das métricas de previsão retornadas por ML.EVALUATE, somente erro percentual absoluto médio e erro percentual absoluto simétrico são independentes do valor da série temporal. Portanto, para avaliar toda a precisão da previsão do conjunto de séries temporais, apenas o agregado dessas duas métricas é significativo.

Essa consulta retorna os seguintes resultados: MAPE é 0,3471, SMAPE é 0,2563.

Etapa 6: prever muitas séries temporais simultaneamente com um espaço de pesquisa de hiperparâmetros menor

Na etapa 3, usamos os valores padrão para todas as opções de treinamento, incluindo o auto_arima_max_order. Essa opção controla o espaço de pesquisa para o ajuste de hiperparâmetros no algoritmo auto.ARIMA.

Nesta etapa, você usará um espaço de pesquisa menor para os hiperparâmetros.

CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model_max_order_2
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name',
   auto_arima_max_order = 2
  ) AS
SELECT *
FROM bqml_tutorial.nyc_citibike_time_series
WHERE date < '2016-06-01'

Essa consulta reduz a auto_arima_max_order de 5 (o valor padrão) para 2.

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.

    A consulta leva aproximadamente 1 minuto e 45 segundos para ser concluída. Lembre-se de que leva 14 minutos e 25 segundos para a consulta ser concluída se auto_arima_max_order for 5. Assim, o ganho de velocidade é cerca de 7 vezes definindo auto_arima_max_order como 2. Se você quer saber por que o ganho de velocidade não é 5/2=2,5x, porque ao aumentar a ordem de auto_arima_max_order, não apenas o número de modelos candidatos aumenta, mas também a complexidade. Portanto, o tempo de treinamento dos modelos aumenta.

Etapa 7: avaliar a precisão da previsão com base em um espaço menor de pesquisa de hiperparâmetro

SELECT
  AVG(mean_absolute_percentage_error) AS MAPE,
  AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Essa consulta retorna os seguintes resultados: MAPE é 0,3337 e sMAPE é 0,2337.

Na etapa cinco, usando um espaço de pesquisa de hiperparâmetro maior, auto_arima_max_order = 5, resultou em MAPE de 0,3471 e sMAPE 0,2563. Portanto, nesse caso, um espaço menor de pesquisa de hiperparâmetro fornece, na verdade, uma maior precisão de previsão. Um motivo é que o algoritmo auto.ARIMA realiza apenas o ajuste de hiperparâmetros para o módulo de tendência de todo o pipeline de modelagem. O melhor modelo ARIMA selecionado pelo algoritmo auto.ARIMA pode não gerar os melhores resultados de previsão para todo o pipeline.

Etapa 8: prever muitas séries temporais simultaneamente com um espaço menor de pesquisa de hiperparâmetros e estratégias de treinamento inteligentes e rápidas

Nesta etapa, você usa um espaço de pesquisa de hiperparâmetros menor e a estratégia de treinamento rápida e inteligente com uma ou mais das opções de treinamento max_time_series_length, max_time_series_length ou time_series_length_fraction.

Embora modelos periódicos, como a sazonalidade, exijam um determinado número de pontos de tempo, a modelagem de tendências requer menos pontos de tempo. Enquanto isso, a modelagem de tendências é muito mais cara do que outros componentes de série temporal, como sazonalidade. Ao usar as opções de treinamento rápido acima, é possível modelar de maneira eficiente o componente de tendência com um subconjunto da série temporal. Já os outros componentes de série temporal usam toda a série temporal.

Neste exemplo, max_time_series_length é usado para conseguir um treinamento rápido.

CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name',
   auto_arima_max_order = 2,
   max_time_series_length = 30
  ) AS
SELECT *
FROM `bqml_tutorial.nyc_citibike_time_series`
WHERE date < '2016-06-01'

A opção max_time_series_length tem um valor de 30. Portanto, para cada série temporal de 383, somente os 30 pontos de tempo mais recentes são usados para modelar o componente de tendência. Todas as séries temporais ainda são usadas para modelar os componentes que não são da tendência.

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.

    A consulta leva cerca de 35 segundos para ser concluída. Isso é três vezes mais rápido em comparação com a consulta de treinamento que não usa uma estratégia de treinamento rápido (ou seja, leva 1 minuto e 45 segundos). Devido à constante sobrecarga de tempo da parte sem treinamento da consulta, como pré-processamento de dados etc., a velocidade será muito maior quando o número de séries temporais for muito maior que neste caso. Para um milhão de séries temporais, o ganho de velocidade se aproximará da proporção do comprimento da série temporal e do valor de max_time_series_length. Nesse caso, o ganho de velocidade será maior que 10x.

Etapa 9: avaliar a precisão da previsão para um modelo com espaço de pesquisa de hiperparâmetros menor e estratégias de treinamento rápido e inteligente

SELECT
  AVG(mean_absolute_percentage_error) AS MAPE,
  AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Essa consulta retorna os seguintes resultados: MAPE é 0,3515 e sMAPE é 0,2473.

Sem o uso de estratégias de treinamento rápido, os resultados de precisão da previsão são de 0,3337 e 0,2337 do MAPE. A diferença entre os dois valores de métricas está dentro de 3%, o que é estatisticamente insignificante.

Em resumo, você usou um espaço de pesquisa de hiperparâmetros menor e estratégias de treinamento rápidas e inteligentes para tornar o treinamento do seu modelo mais de 20 vezes mais rápido sem sacrificar a precisão da previsão. Como mencionado anteriormente, com mais séries temporais, o ganho de velocidade pelas estratégias de treinamento rápido e inteligente pode ser significativamente maior. Além disso, a biblioteca ARIMA subjacente usada pelo ARIMA_PLUS foi otimizada para funcionar cinco vezes mais rápido do que antes. Juntos, esses ganhos permitem a previsão de milhões de séries temporais em horas.

Etapa 10: prever mais de um milhão de séries temporais

Nesta etapa, você estima as vendas de bebidas alcoólicas para mais de 1 milhão de produtos de bebidas em lojas diferentes usando os dados públicos de venda de bebidas alcoólicas de Iowa.

CREATE OR REPLACE MODEL
  `bqml_tutorial.liquor_forecast_by_product`
OPTIONS(
  MODEL_TYPE = 'ARIMA_PLUS',
  TIME_SERIES_TIMESTAMP_COL = 'date',
  TIME_SERIES_DATA_COL = 'total_bottles_sold',
  TIME_SERIES_ID_COL = ['store_number', 'item_description'],
  HOLIDAY_REGION = 'US',
  AUTO_ARIMA_MAX_ORDER = 2,
  MAX_TIME_SERIES_LENGTH = 30
) AS
SELECT
  store_number,
  item_description,
  date,
  SUM(bottles_sold) as total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
GROUP BY store_number, item_description, date

O treinamento do modelo ainda usa um pequeno espaço de pesquisa de hiperparâmetros, bem como a estratégia de treinamento rápido e inteligente. A consulta leva aproximadamente 1 hora e 16 minutos para ser concluída.

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 para excluir o conjunto de dados, 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). Em seguida, 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