Limite os valores previstos para um modelo de série cronológica ARIMA_PLUS

Este tutorial ensina a usar limites para restringir os resultados previstos devolvidos por um ARIMA_PLUSmodelo de séries cronológicas. Neste tutorial, vai criar dois modelos de séries cronológicas com os mesmos dados, um modelo que usa limites e um modelo que não usa limites. Isto permite-lhe comparar os resultados devolvidos pelos modelos e compreender a diferença que a especificação de limites faz.

Usa os dados de new_york.citibike_trips para preparar os modelos neste tutorial. Este conjunto de dados contém informações sobre viagens de Citi Bike na cidade de Nova Iorque.

Antes de seguir este tutorial, deve estar familiarizado com a previsão de séries cronológicas únicas. Conclua o tutorial Previsão de séries cronológicas únicas a partir de dados do Google Analytics para uma introdução a este tópico.

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.

Objetivos

Neste tutorial, vai usar o seguinte:

  • A declaração CREATE MODEL para criar um modelo de série cronológica.
  • A função ML.FORECAST para prever o total de visitas diárias.

Custos

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

  • BigQuery
  • BigQuery ML

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

Para mais informações acerca dos 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.

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

  5. 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

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

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

  8. 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)

    Visualize a série cronológica para a qual quer fazer uma previsão

    Antes de criar o modelo, é útil ver o aspeto das séries cronológicas de entrada.

    SQL

    Na consulta seguinte, a cláusula FROM bigquery-public-data.new_york.citibike_trips indica que está a consultar a tabela citibike_trips no conjunto de dados new_york.

    Na declaração SELECT, a 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.

    #standardSQL
    SELECT
      EXTRACT(DATE from starttime) AS date,
      COUNT(*) AS num_trips
    FROM
    `bigquery-public-data`.new_york.citibike_trips
    GROUP BY date

    Para executar a consulta, siga os passos seguintes:

    1. Na Google Cloud consola, clique no botão Compor nova consulta.

    2. Introduza a seguinte consulta GoogleSQL no editor de consultas.

      #standardSQL
      SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
      FROM
       `bigquery-public-data`.new_york.citibike_trips
      GROUP BY date
    3. Clique em Executar. A consulta gera resultados semelhantes aos seguintes.

      Saída da consulta.

    4. Use a Google Cloud consola para representar graficamente os dados de séries cronológicas. No painel Resultados da consulta, clique no separador Visualização. No painel Configuração da visualização, escolha Barra para o Tipo de visualização:

      Result_visualization.

    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.

    No exemplo seguinte, bigquery-public-data.new_york.citibike_trips indica que está a consultar a tabela citibike_trips no conjunto de dados new_york.

    import bigframes.pandas as bpd
    
    df = bpd.read_gbq("bigquery-public-data.new_york.citibike_trips")
    
    features = bpd.DataFrame(
        {
            "num_trips": df.starttime,
            "date": df["starttime"].dt.date,
        }
    )
    num_trips = features.groupby(["date"]).count()
    
    num_trips.plot.line()

    O resultado é semelhante ao seguinte: Result_visualization

    Crie um modelo de séries cronológicas

    Crie um modelo de séries cronológicas com os dados de viagens do NYC Citi Bike.

    A seguinte consulta GoogleSQL cria um modelo que prevê o total diário de viagens de bicicleta. A declaração CREATE MODEL cria e prepara um modelo denominado bqml_tutorial.nyc_citibike_arima_model.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
      OPTIONS (
        model_type = 'ARIMA_PLUS',
        time_series_timestamp_col = 'date',
        time_series_data_col = 'num_trips',
        time_series_id_col = 'start_station_id')
    AS
    SELECT
      EXTRACT(DATE FROM starttime) AS date,
      COUNT(*) AS num_trips,
      start_station_id
    FROM
      `bigquery-public-data`.new_york.citibike_trips
    WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date, start_station_id;

    A cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que está a criar um modelo de intervalo temporal baseado em ARIMA. Por predefinição, auto_arima=TRUE, pelo que o algoritmo auto.ARIMA ajusta automaticamente os hiperparâmetros nos modelos ARIMA_PLUS. O algoritmo ajusta dezenas de modelos candidatos e escolhe o melhor com o critério de informação de Akaike (AIC) mais baixo. Além disso, uma vez que a predefinição é data_frequency='AUTO_FREQUENCY', o processo de preparação infere automaticamente a frequência dos dados da série cronológica de entrada. A declaração CREATE MODEL usa decompose_time_series=TRUE por predefinição, pelo que as partes do histórico e da previsão da série cronológica são guardadas no modelo. A definição do parâmetro time_series_id_col = 'start_station_id' faz com que o modelo se ajuste e preveja várias séries cronológicas através de uma única consulta com base no start_station_id. Pode usar estas informações para compreender melhor como a série temporal é prevista ao obter os componentes da série temporal separados, como os períodos sazonais.

    Execute a consulta CREATE MODEL para criar e preparar o seu modelo:

    1. Na Google Cloud consola, clique no botão Compor nova consulta.

    2. Introduza a seguinte consulta GoogleSQL no editor de consultas.

      #standardSQL
      CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
      OPTIONS (
        model_type = 'ARIMA_PLUS',
        time_series_timestamp_col = 'date',
        time_series_data_col = 'num_trips',
        time_series_id_col = 'start_station_id')
      AS
      SELECT
      EXTRACT(DATE FROM starttime) AS date,
      COUNT(*) AS num_trips,
      start_station_id
      FROM
      `bigquery-public-data`.new_york.citibike_trips
      WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
      GROUP BY date, start_station_id;
    3. Clique em Executar.

      A consulta demora aproximadamente 80 segundos a ser concluída. Após este período, o seu modelo (nyc_citibike_arima_model) aparece no painel do Explorador. Uma vez que a consulta usa uma declaração CREATE MODEL para criar um modelo, não existem resultados da consulta.

    Preveja a série cronológica e visualize os resultados

    Para explicar como a série cronológica é prevista, visualize todos os componentes da sub-série cronológica, como a sazonalidade e a tendência, através da função ML.FORECAST.

    Para o fazer, siga estes passos:

    1. Na Google Cloud consola, clique no botão Compor nova consulta.

    2. Introduza a seguinte consulta GoogleSQL no editor de consultas.

      #standardSQL
      SELECT
      forecast_timestamp AS forecast_timestamp,
      start_station_id AS start_station_id,
      history_value AS history_value,
      forecast_value AS forecast_value
      FROM
      (
        (
           SELECT
           DATE(forecast_timestamp) AS forecast_timestamp,
           NULL AS history_value,
           forecast_value AS forecast_value,
           start_station_id AS start_station_id,
           FROM
           ML.FORECAST(
              MODEL bqml_tutorial.`nyc_citibike_arima_model`,
              STRUCT(
                 365 AS horizon,
                 0.9 AS confidence_level))
        )
        UNION ALL
        (
           SELECT
           DATE(date_name) AS forecast_timestamp,
           num_trips AS history_value,
           NULL AS forecast_value,
           start_station_id AS start_station_id,
           FROM
           (
              SELECT
                 EXTRACT(DATE FROM starttime) AS date_name,
                 COUNT(*) AS num_trips,
                 start_station_id AS start_station_id
              FROM
                 `bigquery-public-data`.new_york.citibike_trips
              WHERE
                 starttime > '2014-07-11'
                 AND starttime < '2015-02-11'
              GROUP BY
                 date_name, start_station_id
           )
        )
      )
      WHERE start_station_id = 79
      ORDER BY
      forecast_timestamp, start_station_id
    3. Clique em Executar. A consulta gera resultados semelhantes aos seguintes:

      BQUI_chart.

    4. Use a Google Cloud consola para representar graficamente os dados de séries cronológicas. No painel Resultados da consulta, clique no separador Visualização:

      Result_visualization.

    O gráfico mostra que os valores previstos para o número total diário de viagens de CitiBike são números negativos, o que não é útil.start_station_id=79 A utilização de um modelo com limites melhora os dados previstos.

    Crie um modelo de série cronológica com limites

    Crie um modelo de série cronológica com limites, usando os dados de viagens do NYC Citi Bike.

    A seguinte consulta GoogleSQL cria um modelo que prevê o total diário de viagens de bicicleta. A declaração CREATE MODEL cria e prepara um modelo denominado bqml_tutorial.nyc_citibike_arima_model_with_limits. A principal diferença entre este modelo e o modelo que criou anteriormente é a adição da opção forecast_limit_lower_bound=0. Esta opção faz com que o modelo preveja apenas valores superiores a 0, com base nos valores da coluna especificada pelo argumento time_series_data_col, neste caso, num_trips.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
       OPTIONS (
          model_type = 'ARIMA_PLUS',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'num_trips',
          time_series_id_col = 'start_station_id',
          forecast_limit_lower_bound = 0)
       AS
       SELECT
       EXTRACT(DATE FROM starttime) AS date,
       COUNT(*) AS num_trips,
       start_station_id
       FROM
       `bigquery-public-data`.new_york.citibike_trips
       WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
       GROUP BY date, start_station_id;

    Execute a consulta CREATE MODEL para criar e preparar o seu modelo:

    1. Na Google Cloud consola, clique no botão Compor nova consulta.

    2. Introduza a seguinte consulta GoogleSQL no editor de consultas.

      #standardSQL
      CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
      OPTIONS (
        model_type = 'ARIMA_PLUS',
        time_series_timestamp_col = 'date',
        time_series_data_col = 'num_trips',
        time_series_id_col = 'start_station_id',
        forecast_limit_lower_bound = 0)
      AS
      SELECT
      EXTRACT(DATE FROM starttime) AS date,
      COUNT(*) AS num_trips,
      start_station_id
      FROM
      `bigquery-public-data`.new_york.citibike_trips
      WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
      GROUP BY date, start_station_id;
    3. Clique em Executar.

      A consulta demora aproximadamente 100 segundos a ser concluída. Após este período, o seu modelo (nyc_citibike_arima_model_with_limits) é apresentado no painel do Explorador. Uma vez que a consulta usa uma declaração CREATE MODEL para criar um modelo, não existem resultados da consulta.

    Preveja a série cronológica usando o modelo com limites

    1. Na Google Cloud consola, clique no botão Compor nova consulta.

    2. Introduza a seguinte consulta GoogleSQL no editor de consultas.

      #standardSQL
      SELECT
      forecast_timestamp AS forecast_timestamp,
      start_station_id AS start_station_id,
      history_value AS history_value,
      forecast_value AS forecast_value
      FROM
      (
        (
           SELECT
           DATE(forecast_timestamp) AS forecast_timestamp,
           NULL AS history_value,
           forecast_value AS forecast_value,
           start_station_id AS start_station_id,
           FROM
           ML.FORECAST(
              MODEL bqml_tutorial.`nyc_citibike_arima_model`,
              STRUCT(
                 365 AS horizon,
                 0.9 AS confidence_level))
        )
        UNION ALL
        (
           SELECT
           DATE(date_name) AS forecast_timestamp,
           num_trips AS history_value,
           NULL AS forecast_value,
           start_station_id AS start_station_id,
           FROM
           (
              SELECT
                 EXTRACT(DATE FROM starttime) AS date_name,
                 COUNT(*) AS num_trips,
                 start_station_id AS start_station_id
              FROM
                 `bigquery-public-data`.new_york.citibike_trips
              WHERE
                 starttime > '2014-07-11'
                 AND starttime < '2015-02-11'
              GROUP BY
                 date_name, start_station_id
           )
        )
      )
      WHERE start_station_id = 79
      ORDER BY forecast_timestamp, start_station_id
    3. Clique em Executar.

      BQUI_chart.

    4. Use a Google Cloud consola para representar graficamente os dados de séries cronológicas. No painel Resultados da consulta, clique no separador Visualização:

      Result_visualization.

    O modelo ARIMA PLUS deteta que o número total diário de viagens de Citi Bike em que start_station_id=79 está a diminuir. Os valores de previsão futuros seguem esta tendência e dão números de previsão relativamente mais pequenos quanto mais avançar no futuro. O gráfico mostra que os valores previstos para o número total diário de viagens de Citi Bike são números positivos, o que é mais útil.start_station_id=79 O modelo com limites deteta que o número total diário de viagens de Citi Bike em que start_station_id=79 está a diminuir, mas continua a fornecer valores de previsão significativos.

    Conforme mostrado neste tutorial, as opções forecast_limit_lower_bound e forecast_limit_upper_bound podem ajudar a obter valores de previsão mais significativos em cenários semelhantes ao apresentado aqui, como quando prevê os preços das ações ou os números de vendas futuras.

    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 no lado direito da janela. Esta ação elimina 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?