Dimensione um modelo de série temporal univariado ARIMA_PLUS para milhões de séries temporais


Neste tutorial, vai aprender a acelerar significativamente a preparação de um conjunto de ARIMA_PLUSmodelos de séries cronológicas univariadas para fazer várias previsões de séries cronológicas com uma única consulta. Também vai aprender a avaliar a precisão das previsões.

Este tutorial faz previsões para várias séries cronológicas. Os valores previstos são calculados para cada ponto temporal, para cada valor numa ou mais colunas especificadas. Por exemplo, se quiser prever o tempo e especificar uma coluna com dados de cidades, os dados previstos vão conter previsões para todos os pontos temporais da cidade A, seguidas dos valores previstos para todos os pontos temporais da cidade B e assim sucessivamente.

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 de intervalos temporais, pelo que são usados para ilustrar várias estratégias para acelerar a preparação de modelos. Os dados de vendas de bebidas alcoólicas têm mais de 1 milhão de intervalos temporais, pelo que são usados para mostrar a previsão de intervalos temporais em grande escala.

Antes de ler este tutorial, deve ler os artigos Preveja várias séries cronológicas com um modelo univariado e Práticas recomendadas para a previsão de séries cronológicas em grande escala.

Objetivos

Neste tutorial, vai usar o seguinte:

Para simplificar, este tutorial não aborda a utilização das funções ML.FORECAST ou ML.EXPLAIN_FORECAST para gerar previsões. Para saber como usar essas funções, consulte o artigo Preveja várias séries cronológicas com um modelo univariado.

Custos

Este tutorial usa componentes faturáveis do Google Cloud, incluindo:

  • BigQuery
  • BigQuery ML

Para mais informações acerca dos custos, consulte a página de preços do BigQuery e a página de 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. O BigQuery é ativado automaticamente em novos projetos. Para ativar o BigQuery num projeto pré-existente, aceda a

    Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  7. Autorizações necessárias

    • Para criar o conjunto de dados, precisa da autorização bigquery.datasets.create IAM.

    • Para criar o modelo, precisa das seguintes autorizações:

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

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

    Para mais informações acerca das funções e autorizações do IAM no BigQuery, consulte o artigo Introdução ao IAM.

Crie um conjunto de dados

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

Consola

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda à página do BigQuery

  2. No painel Explorador, clique no nome do projeto.

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

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

    • Para o ID do conjunto de dados, introduza bqml_tutorial.

    • Em Tipo de localização, selecione Várias regiões e, de seguida, selecione EUA (várias regiões nos Estados Unidos).

    • Deixe as restantes predefinições como estão e clique em Criar conjunto de dados.

bq

Para criar um novo conjunto de dados, use o comando bq mk com a flag --location. Para uma lista completa de parâmetros possíveis, consulte a referência do comando bq mk --dataset.

  1. Crie um conjunto de dados com o nome bqml_tutorial com a localização dos dados definida 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 omitir -d e --dataset, o comando cria um conjunto de dados por predefinição.

  2. Confirme que 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"
  }
}

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Crie uma tabela de dados de entrada

A declaração SELECT da seguinte consulta usa a função EXTRACT para extrair as informações de data da coluna starttime. A consulta usa a cláusula COUNT(*) para obter o número total diário de viagens de Citi Bike.

table_1 tem 679 intervalos temporais. A consulta usa lógica INNER JOIN adicional para selecionar todas as séries cronológicas que têm mais de 400 pontos de tempo, o que resulta num total de 383 séries cronológicas.

Siga estes passos para criar a tabela de dados de entrada:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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;

Crie um modelo para várias séries cronológicas com parâmetros predefinidos

Quer prever o número de viagens de bicicleta para cada estação do Citi Bike, o que requer muitos modelos de intervalos temporais; um para cada estação do Citi Bike incluída nos dados de entrada. Pode escrever várias consultas para o fazer, mas pode ser um processo tedioso e demorado, especialmente quando tem um grande número de séries cronológicas.CREATE MODEL Em alternativa, pode usar uma única consulta para criar e ajustar um conjunto de modelos de intervalos temporais de modo a prever vários intervalos temporais em simultâneo.

A cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que está a criar um conjunto de modelos de séries cronológicas baseados em ARIMA.ARIMA_PLUS A opção time_series_timestamp_col especifica a coluna que contém as séries cronológicas, a opção time_series_data_col especifica a coluna para a qual quer fazer a previsão e a opção time_series_id_col especifica uma ou mais dimensões para as quais quer criar séries cronológicas.

Este exemplo omite os pontos temporais na série cronológica após 1 de junho de 2016 , para que esses pontos temporais possam ser usados para avaliar a precisão da previsão mais tarde através da função ML.EVALUATE.

Siga estes passos para criar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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 demora cerca de 15 minutos a concluir.

Avalie a precisão da previsão para cada série cronológica

Avalie a precisão da previsão do modelo através da função ML.EVALUATE.

Siga estes passos para avaliar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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));

    Esta consulta comunica várias métricas de previsão, incluindo:

    Os resultados devem ter um aspeto semelhante ao seguinte: Métricas de avaliação para o modelo de intervalos temporais.

    A cláusula TABLE na função ML.EVALUATE identifica uma tabela que contém os dados de verdade factual. Os resultados da previsão são comparados com os dados de terreno real para calcular as métricas de precisão. Neste caso, o elemento nyc_citibike_time_series contém os pontos da série cronológica anteriores e posteriores a 1 de junho de 2016. Os pontos após 1 de junho de 2016 são os dados de referência. Os pontos anteriores a 1 de junho de 2016 são usados para preparar o modelo de modo a 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 das 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á a calcular a precisão da previsão com base numa previsão de sete pontos. Tenha em atenção que, se os dados de referência tiverem menos de sete pontos para a comparação, as métricas de precisão são calculadas apenas com base nos pontos disponíveis. O valor é perform_aggregationTRUE, o que significa que as métricas de precisão da previsão são agregadas com base nas métricas no ponto temporal. Se especificar um valor de perform_aggregation de FALSE, a precisão da previsão é devolvida para cada ponto no tempo previsto.

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

Avalie a precisão geral das previsões

Avalie a precisão da previsão para todas as 383 séries cronológicas.

Das métricas de previsão devolvidas por ML.EVALUATE, apenas o erro percentual absoluto médio e o erro percentual absoluto médio simétrico são independentes do valor da série cronológica. Por conseguinte, para avaliar a precisão de previsão total do conjunto de séries cronológicas, apenas o agregado destas duas métricas é significativo.

Siga estes passos para avaliar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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));

Esta consulta devolve um valor MAPE de 0.3471 e um valor sMAPE de 0.2563.

Crie um modelo para prever várias séries cronológicas com um espaço de pesquisa de hiperparâmetros mais pequeno

Na secção Crie um modelo para várias séries cronológicas com parâmetros predefinidos, usou os valores predefinidos para todas as opções de preparação, incluindo a opção auto_arima_max_order. Esta opção controla o espaço de pesquisa para o ajuste de hiperparâmetros no algoritmo auto.ARIMA.

No modelo criado pela consulta seguinte, usa um espaço de pesquisa mais pequeno para os hiperparâmetros alterando o valor da opção auto_arima_max_order do valor predefinido de 5 para 2.

Siga estes passos para avaliar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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 demora cerca de 2 minutos a concluir. Recorde que o modelo anterior demorou cerca de 15 minutos a ser concluído quando o valor de auto_arima_max_order era 5, pelo que esta alteração melhora a velocidade de preparação do modelo em cerca de 7 vezes. Se se perguntar por que motivo o ganho de velocidade não é 5/2=2.5x, isto deve-se ao facto de, quando o valor de auto_arima_max_order aumenta, não só aumentar o número de modelos candidatos, como também a complexidade. Isto faz com que o tempo de preparação do modelo aumente.

Avalie a precisão das previsões para um modelo com um espaço de pesquisa de hiperparâmetros mais pequeno

Siga estes passos para avaliar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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));

Esta consulta devolve um valor MAPE de 0.3337 e um valor sMAPE de 0.2337.

Na secção Avalie a precisão geral da previsão, avaliou um modelo com um espaço de pesquisa de hiperparâmetros maior, em que o valor da opção auto_arima_max_order é 5. Isto resultou num MAPE valor de 0.3471 e num valor de sMAPE de 0.2563. Neste caso, pode ver que um espaço de pesquisa de hiperparâmetros mais pequeno dá, na verdade, uma precisão de previsão mais elevada. Um dos motivos é que o algoritmo auto.ARIMA só faz o ajuste dos 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.

Crie um modelo para prever várias séries cronológicas com um espaço de pesquisa de hiperparâmetros mais pequeno e estratégias de preparação rápidas e inteligentes

Neste passo, usa um espaço de pesquisa de hiperparâmetros mais pequeno e a estratégia de aprendizagem rápida inteligente usando uma ou mais das opções de aprendizagem max_time_series_length, max_time_series_length ou time_series_length_fraction.

Embora a modelagem periódica, como a sazonalidade, exija um determinado número de pontos temporais, a modelagem de tendências requer menos pontos temporais. Entretanto, a modelagem de tendências é muito mais dispendiosa em termos de computação do que outros componentes de séries cronológicas, como a sazonalidade. Ao usar as opções de preparação rápida acima, pode modelar eficientemente o componente de tendência com um subconjunto da série cronológica, enquanto os outros componentes da série cronológica usam a série cronológica completa.

O exemplo seguinte usa a opção max_time_series_length para alcançar um treino rápido. Se definir o valor da opção max_time_series_length como 30, apenas são usados os 30 pontos de tempo mais recentes para modelar o componente de tendência. Todas as 383 séries cronológicas continuam a ser usadas para modelar os componentes sem tendência.

Siga estes passos para criar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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 demora cerca de 35 segundos a ser concluída. Isto é 3 vezes mais rápido em comparação com a consulta que usou na secção Crie um modelo para prever várias séries cronológicas com um espaço de pesquisa de hiperparâmetros mais pequeno. Devido à sobrecarga de tempo constante para a parte da consulta que não envolve preparação, como o pré-processamento de dados, o ganho de velocidade é muito superior quando o número de séries cronológicas é muito maior do que neste exemplo. Para um milhão de séries cronológicas, o ganho de velocidade aproxima-se da relação entre o comprimento da série cronológica e o valor da opção max_time_series_length. Nesse caso, o aumento da velocidade é superior a 10 vezes.

Avalie a precisão das previsões para um modelo com um espaço de pesquisa de hiperparâmetros mais pequeno e estratégias de preparação rápidas inteligentes

Siga estes passos para avaliar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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));

Esta consulta devolve um valor MAPE de 0.3515 e um valor sMAPE de 0.2473.

Lembre-se de que, sem a utilização de estratégias de preparação rápida, a precisão da previsão resulta num valor MAPE de 0.3337 e num valor sMAPE de 0.2337. A diferença entre os dois conjuntos de valores das métricas está dentro de 3%, o que é estatisticamente irrelevante.

Em resumo, usou um espaço de pesquisa de hiperparâmetros mais pequeno e estratégias de preparação rápidas e inteligentes para tornar a preparação do modelo mais de 20 vezes mais rápida sem sacrificar a precisão das previsões. Conforme mencionado anteriormente, com mais séries cronológicas, o ganho de velocidade das estratégias de formação rápida inteligente pode ser significativamente superior. Além disso, a biblioteca ARIMA subjacente usada pelos modelos ARIMA_PLUS foi otimizada para ser executada 5 vezes mais rápido do que antes. Em conjunto, estes ganhos permitem a previsão de milhões de séries cronológicas em horas.

Crie um modelo para prever um milhão de séries cronológicas

Neste passo, prevê as vendas de bebidas alcoólicas para mais de 1 milhão de produtos de bebidas alcoólicas em diferentes lojas através dos dados públicos de vendas de bebidas alcoólicas do Iowa. A preparação do modelo usa um pequeno espaço de pesquisa de hiperparâmetros, bem como a estratégia de preparação rápida inteligente.

Siga estes passos para avaliar o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, cole a seguinte consulta 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 demora cerca de 1 hora e 16 minutos a ser concluída.

Limpar

Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

  • Pode eliminar o projeto que criou.
  • Em alternativa, pode manter o projeto e eliminar o conjunto de dados.

Elimine o conjunto de dados

A eliminação do projeto remove todos os conjuntos de dados e todas as tabelas no projeto. Se preferir reutilizar o projeto, pode eliminar o conjunto de dados que criou neste tutorial:

  1. Se necessário, abra a página do BigQuery na Google Cloud consola.

    Aceda à página do BigQuery

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

  3. Clique em Eliminar conjunto de dados para eliminar o conjunto de dados, a tabela e todos os dados.

  4. Na caixa de diálogo Eliminar conjunto de dados, confirme o comando de eliminação escrevendo o nome do conjunto de dados (bqml_tutorial) e, de seguida, clique em Eliminar.

Elimine o projeto

Para eliminar 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.

O que se segue?