Dimensionar um modelo de série temporal univariada para milhões de séries temporais


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.

Neste tutorial, você vai aprender a acelerar significativamente o treinamento de um modelo de série temporal univariada para fazer previsões.

Este tutorial faz previsões para várias série temporal. Os valores previstos são calculados para cada ponto de tempo e para cada valor em uma ou mais colunas especificadas. Por exemplo, se você quisesse prever o clima e especificasse uma coluna com dados da cidade, os dados previstos teriam previsões para todos os pontos de tempo da Cidade A, depois os valores previstos para todos os pontos de tempo da Cidade B e assim por diante.

Este tutorial usa dados das tabelas públicas bigquery-public-data.new_york.citibike_trips e iowa_liquor_sales.sales. Os dados de viagens de bicicleta contêm apenas algumas centenas série temporal. Por isso, eles são usados para ilustrar várias estratégias para acelerar treinamento de modelo. Os dados de vendas de bebidas alcoólicas têm mais de um milhão de série temporal, então são usados para mostrar a previsão de série temporal em grande escala.

Antes de ler este tutorial, leia Prever várias série temporal com um modelo univariado e Práticas recomendadas de previsão de série temporal em grande escala.

Objetivos

Neste tutorial, você usará:

Para simplificar, este tutorial não aborda como usar as funções ML.FORECAST ou ML.EXPLAIN_FORECAST para gerar previsões. Para saber como usar essas funções, consulte Prever várias série temporal com um modelo univariado.

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

Permissões exigidas

  • Para criar o conjunto de dados, é preciso ter a permissão de IAM bigquery.datasets.create.
  • Para criar o recurso de conexão, você precisa das seguintes permissões:

    • bigquery.connections.create
    • bigquery.connections.get
  • Para criar o modelo, você precisa das seguintes permissões:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 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 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.

Criar uma tabela de dados de entrada

A instrução SELECT da consulta a seguir usa a função EXTRACT 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.

Siga estas etapas para criar a tabela de dados de entrada:

  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 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;

Criar um modelo para várias séries temporais com parâmetros padrão

Você quer prever o número de viagens de bicicleta para cada estação do Citi Bike, o que exige muitos modelos de série temporal, um para cada estação do Citi Bike incluída nos dados de entrada. É possível gravar várias consultas CREATE MODEL para fazer isso, mas isso pode ser um processo tedioso e demorado, especialmente quando você tem um grande número de série temporal. Em vez disso, use uma única consulta para criar e ajustar um conjunto de modelos de série temporal e prever várias série temporal ao mesmo tempo.

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 com base em ARIMA. A opção time_series_timestamp_col especifica a coluna que contém a série temporal, a opção time_series_data_col especifica a coluna para a previsão e a time_series_id_col especifica uma ou mais dimensões para criar séries temporais.

Este exemplo exclui os pontos de tempo na série temporal após 1º de junho de 2016 para que esses pontos de tempo possam ser usados para avaliar a precisão da previsão mais tarde usando a função ML.EVALUATE.

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.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';

    A consulta leva cerca de 15 minutos para ser concluída.

Avaliar a precisão da previsão para cada série temporal

Avalie a precisão da previsão do modelo usando a função ML.EVALUATE.

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.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    Essa consulta relata várias métricas de previsão, incluindo:

    Os resultados vão ficar assim: Métricas de avaliação do modelo de série temporal.

    A cláusula TABLE na função ML.EVALUATE identifica uma tabela que contém as informações empíricas. Os resultados da previsão são comparados aos dados de informações empíricas para calcular as métricas de precisão. Nesse caso, o nyc_citibike_time_series contém os pontos de série temporal anteriores e posteriores a 1º de junho de 2016. Os pontos após 1º de junho de 2016 são dados informativos. Os pontos anteriores a 1º de junho de 2016 são usados para treinar o modelo e gerar previsões após essa data. Apenas os pontos após 1º de junho de 2016 são necessários para calcular as métricas. Os pontos anteriores a 1º de junho de 2016 são ignorados no cálculo de métricas.

    A cláusula STRUCT na função ML.EVALUATE especificou parâmetros para a função. O valor horizon é 7, o que significa que a consulta está calculando a precisão da previsão com base em uma previsão de sete 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. O valor de perform_aggregation é 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 um valor de perform_aggregation como FALSE, a precisão da previsão será retornada para cada ponto do tempo previsto.

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

Avaliar a precisão geral da previsão

Avalie a precisão da previsão para todas as 383 série temporal.

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.

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
      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));

Essa consulta retorna um valor MAPE de 0.3471 e um valor sMAPE de 0.2563.

Criar um modelo para prever várias séries temporais com um espaço de pesquisa de hiperparâmetros menor

Na seção Criar um modelo para várias séries temporais com parâmetros padrão, você usou os valores padrão para todas as opções de treinamento, incluindo a opção auto_arima_max_order. Essa opção controla o espaço de pesquisa para o ajuste de hiperparâmetros no algoritmo auto.ARIMA.

No modelo criado pela consulta a seguir, você usa um espaço de pesquisa menor para os hiperparâmetros mudando o valor da opção auto_arima_max_order do padrão 5 para 2.

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:

    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';

    A consulta leva cerca de dois minutos para ser concluída. O modelo anterior levou cerca de 15 minutos para ser concluído quando o valor de auto_arima_max_order era 5. Portanto, essa mudança melhora o ganho de velocidade de treinamento de modelo em cerca de sete vezes. Se você quer saber por que o ganho de velocidade não é 5/2=2.5x, é porque, quando o valor de auto_arima_max_order aumenta, não apenas o número de modelos candidatos aumenta, mas também a complexidade. Isso faz com que o tempo de treinamento do modelo aumente.

Avaliar a precisão da previsão de um modelo com um espaço de pesquisa de hiperparâmetros menor

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
      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 um valor MAPE de 0.3337 e um valor sMAPE de 0.2337.

Na seção Avaliar a precisão geral da previsão, você avaliou um modelo com um espaço de pesquisa de hiperparâmetro maior, em que o valor da opção auto_arima_max_order é 5. Isso resultou em um valor de MAPE de 0.3471 e um valor de sMAPE de 0.2563. Nesse caso, é possível observar que um espaço menor de pesquisa de hiperparâmetro fornece, na verdade, uma maior precisão de previsão. Um motivo para isso é que o algoritmo auto.ARIMA só realiza 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.

Criar um modelo para prever várias séries temporais com um espaço de pesquisa de hiperparâmetros menor e estratégias de treinamento rápido e inteligente

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.

O exemplo a seguir usa a opção max_time_series_length para conseguir um treinamento rápido. Ao definir o valor da opção max_time_series_length como 30, apenas os 30 pontos de tempo mais recentes são usados para modelar o componente de tendência. Todas as 383 série temporal ainda são usadas para modelar os componentes que não são de tendência.

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.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 consulta leva cerca de 35 segundos para ser concluída. Isso é três vezes mais rápido em comparação com a consulta que você usou na seção Criar um modelo para prever várias séries temporais com um espaço de pesquisa de hiperparâmetro menor. 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érie temporal for muito maior que neste caso. Para um milhão de séries temporais, o ganho de velocidade se aproxima da proporção do comprimento da série temporal e do valor da opção max_time_series_length. Nesse caso, o ganho de velocidade é maior que 10x.

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

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
      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 um valor MAPE de 0.3515 e um valor sMAPE de 0.2473.

Sem o uso de estratégias de treinamento rápido, a precisão da previsão resulta em um valor de MAPE de 0.3337 e um valor de sMAPE de 0.2337. A diferença entre os dois conjuntos de 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ápido e inteligente 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érie temporal, 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 pelos modelos 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érie temporal em horas.

Criar um modelo para prever um milhão de série temporal

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. O treinamento de modelo usa um pequeno espaço de pesquisa de hiperparâmetros, bem como a estratégia de treinamento rápido e inteligente.

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:

    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;

    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