Use feriados personalizados num modelo de previsão de séries cronológicas ARIMA_PLUS

Este tutorial mostra como realizar as seguintes tarefas:

  • Crie um ARIMA_PLUS modelo de previsão de séries de tempo que usa apenas feriados incorporados.
  • Crie um modelo de previsão de séries cronológicas que use feriados personalizados, além dos feriados incorporados.ARIMA_PLUS
  • Visualize os resultados previstos destes modelos.
  • Inspecione um modelo para ver que feriados modela.
  • Avalie os efeitos dos feriados personalizados nos resultados previstos.
  • Compare o desempenho do modelo que usa apenas feriados incorporados com o desempenho do modelo que usa feriados personalizados, além dos feriados incorporados.

Este tutorial usa as bigquery-public-data.wikipedia.pageviews_*tabelas públicas.

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.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

  • BigQuery: You incur costs for the data you process in BigQuery.

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Para mais informações, consulte os preços 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.

    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)

    Prepare os dados de séries cronológicas

    Agregue os dados de visualização de páginas da Wikipédia para a página Google I/O numa única tabela, agrupada por dia:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      CREATE OR REPLACE TABLE `bqml_tutorial.googleio_page_views`
      AS
      SELECT
        DATETIME_TRUNC(datehour, DAY) AS date,
        SUM(views) AS views
      FROM
        `bigquery-public-data.wikipedia.pageviews_*`
      WHERE
        datehour >= '2017-01-01'
        AND datehour < '2023-01-01'
        AND title = 'Google_I/O'
      GROUP BY
        DATETIME_TRUNC(datehour, DAY)

    Crie um modelo de previsão de séries cronológicas que use feriados incorporados

    Crie um modelo que preveja as visualizações de páginas diárias da página "Google I/O" da Wikipédia, com base nos dados de visualização de páginas anteriores a 2022 e tendo em conta os feriados incorporados:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS
      SELECT
        *
      FROM
        `bqml_tutorial.googleio_page_views`
      WHERE
        date < '2022-01-01';

    Visualize os resultados previstos

    Depois de criar o modelo com feriados incorporados, junte os dados originais da tabela bqml_tutorial.googleio_page_views com o valor previsto da função ML.EXPLAIN_FORECAST e, em seguida, visualize-o através do Looker Studio:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_without_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL `bqml_tutorial.forecast_googleio`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. No painel Resultados da consulta, clique em Explorar dados e, de seguida, clique em Explorar com o Looker Studio. O Looker Studio abre num novo separador.

    4. No separador do Looker Studio, clique em Adicionar um gráfico e, de seguida, clique no gráfico de intervalos temporais:

      Adicione um gráfico de intervalos temporais.

      Coloque o gráfico no relatório.

    5. No separador Configuração do painel Gráfico, clique em Adicionar métrica e selecione adjusted_views_without_custom_holiday:

      Adicione outra métrica.

      O gráfico tem um aspeto semelhante ao seguinte:

      Gráfico de intervalos temporais dos resultados da previsão com feriados incorporados

      Pode ver que o modelo de previsão capta a tendência geral de forma bastante adequada. No entanto, não está a captar o aumento do tráfego relacionado com eventos anteriores do Google I/O e não consegue gerar uma previsão precisa para

      1. As secções seguintes mostram como lidar com algumas destas limitações.

    Crie um modelo de previsão de séries cronológicas que use feriados incorporados e feriados personalizados

    Como pode ver no histórico do Google I/O, o evento Google I/O ocorreu em datas diferentes entre 2017 e 2022. Para ter em conta esta variação, crie um modelo que preveja as visualizações de páginas para a página "Google_I/O" da Wikipédia até 2022, com base nos dados de visualizações de páginas de antes de 2022 e usando feriados personalizados para representar o evento Google I/O todos os anos. Neste modelo, também ajusta o período de efeito da época festiva para abranger três dias em torno da data do evento, para captar melhor algum potencial tráfego da página antes e depois do evento.

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS (
        training_data AS (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date < '2022-01-01'
          ),
        custom_holiday AS (
            SELECT
              'US' AS region,
              'GoogleIO' AS holiday_name,
              primary_date,
              1 AS preholiday_days,
              2 AS postholiday_days
            FROM
              UNNEST(
                [
                  DATE('2017-05-17'),
                  DATE('2018-05-08'),
                  DATE('2019-05-07'),
                  -- cancelled in 2020 due to pandemic
                  DATE('2021-05-18'),
                  DATE('2022-05-11')])
                AS primary_date
          )
      );

    Visualize os resultados previstos

    Depois de criar o modelo com feriados personalizados, junte os dados originais da tabela bqml_tutorial.googleio_page_views com o valor previsto da função ML.EXPLAIN_FORECAST e, em seguida, visualize-o com o Looker Studio:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_with_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL
                `bqml_tutorial.forecast_googleio_with_custom_holiday`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. No painel Resultados da consulta, clique em Explorar dados e, de seguida, clique em Explorar com o Looker Studio. O Looker Studio abre num novo separador.

    4. No separador do Looker Studio, clique em Adicionar um gráfico, clique no gráfico de intervalos temporais e coloque o gráfico no relatório.

    5. No separador Configuração do painel Gráfico, clique em Adicionar métrica e selecione adjusted_views_with_custom_holiday.

      O gráfico tem um aspeto semelhante ao seguinte:

      Gráfico de séries temporais dos resultados de previsão com feriados personalizados

      Como pode ver, os feriados personalizados aumentaram o desempenho do modelo de previsão. Agora, capta eficazmente o aumento das visualizações de páginas causado pelo Google I/O.

    Inspecione as informações sobre feriados

    Inspeccione a lista de feriados que foram tidos em conta durante a modelagem através da função ML.HOLIDAY_INFO:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      SELECT *
      FROM
        ML.HOLIDAY_INFO(
          MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`);

      Os resultados mostram o Google I/O e os feriados incorporados na lista de feriados:

      Resultados da função ML.HOLIDAY_INFO.

    Avalie os efeitos dos feriados personalizados

    Avalie os efeitos das épocas festivas personalizadas nos resultados previstos através da função ML.EXPLAIN_FORECAST:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      SELECT
        time_series_timestamp,
        holiday_effect_GoogleIO,
        holiday_effect_US_Juneteenth,
        holiday_effect_Christmas,
        holiday_effect_NewYear
      FROM
        ML.EXPLAIN_FORECAST(
          model
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          STRUCT(365 AS horizon))
      WHERE holiday_effect != 0;

      Os resultados mostram que o Google I/O contribui com uma grande quantidade de efeito de feriado para os resultados previstos:

      Resultados da função ML.EXPLAIN_FORECAST.

    Compare o desempenho do modelo

    Use a função ML.EVALUATE para comparar o desempenho do primeiro modelo criado sem feriados personalizados e o segundo modelo criado com feriados personalizados. Para ver o desempenho do segundo modelo na previsão de um feriado personalizado futuro, defina o intervalo de tempo para a semana do Google I/O em 2022:

    1. Aceda à página do BigQuery.

      Aceda ao BigQuery

    2. No painel do editor de SQL, execute a seguinte declaração SQL:

      SELECT
        "original" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL `bqml_tutorial.forecast_googleio`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation))
      UNION ALL
      SELECT
        "with_custom_holiday" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation));

      Os resultados mostram que o segundo modelo oferece uma melhoria significativa no desempenho:

      Resultados da função ML.EXPLAIN_FORECAST.

    Limpar

    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.