Usar festivos personalizados en un modelo de previsión de series temporales ARIMA_PLUS

En este tutorial se explica cómo hacer lo siguiente:

  • Crea un ARIMA_PLUSmodelo de previsión de series temporales que solo use festivos integrados.
  • Crea un ARIMA_PLUS modelo de previsión de series temporales que use festivos personalizados además de los festivos integrados.
  • Visualiza los resultados previstos de estos modelos.
  • Inspecciona un modelo para ver qué festivos incluye.
  • Evalúa los efectos de los festivos personalizados en los resultados previstos.
  • Compara el rendimiento del modelo que solo usa festivos integrados con el del modelo que usa festivos personalizados además de los integrados.

En este tutorial se usan las bigquery-public-data.wikipedia.pageviews_* tablas públicas.

Permisos obligatorios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create de gestión de identidades y accesos.

  • Para crear el modelo, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para ejecutar la inferencia, necesitas los siguientes permisos:

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

Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta la introducción a la gestión de identidades y accesos.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

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

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Para obtener más información, consulta los precios de BigQuery.

Antes de empezar

  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. Crear conjunto de datos

    Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

    Consola

    1. En la Google Cloud consola, ve a la página BigQuery.

      Ir a la página de BigQuery

    2. En el panel Explorador, haz clic en el nombre de tu proyecto.

    3. Haga clic en Ver acciones > Crear conjunto de datos.

    4. En la página Crear conjunto de datos, haz lo siguiente:

      • En ID del conjunto de datos, introduce bqml_tutorial.

      • En Tipo de ubicación, selecciona Multirregión y, a continuación, EE. UU. (varias regiones de Estados Unidos).

      • Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.

    bq

    Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

    1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery ML tutorial dataset:

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

    2. Confirma que se ha creado el conjunto de datos:

      bq ls

    API

    Llama al método datasets.insert con un recurso de conjunto de datos definido.

    {
      "datasetReference": {
         "datasetId": "bqml_tutorial"
      }
    }

    BigQuery DataFrames

    Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

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

    Preparar los datos de serie temporal

    Agrega los datos de vistas de la página de Wikipedia de Google I/O en una sola tabla, agrupados por día:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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)

    Crear un modelo de previsión de series temporales que use festivos

    Crea un modelo que pronostique las visualizaciones diarias de la página "Google I/O" de Wikipedia, basándose en los datos de visualizaciones de la página anteriores al 2022 y teniendo en cuenta los festivos:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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';

    Visualizar los resultados previstos

    Después de crear el modelo con las festividades integradas, combina los datos originales de la tabla bqml_tutorial.googleio_page_views con el valor previsto de la ML.EXPLAIN_FORECAST función y, a continuación, visualízalos con Looker Studio:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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. En el panel Resultados de la consulta, haz clic en Explorar datos y, a continuación, en Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva.

    4. En la pestaña Looker Studio, haz clic en Añadir un gráfico y, a continuación, selecciona el gráfico de serie temporal:

      Añade un gráfico de serie temporal.

      Coloca el gráfico en el informe.

    5. En la pestaña Configuración del panel Gráfico, haga clic en Añadir métrica y seleccione adjusted_views_without_custom_holiday:

      Añade otra métrica.

      El gráfico tiene un aspecto similar al siguiente:

      Gráfico de serie temporal de los resultados de la previsión con festivos integrados

      Como puedes ver, el modelo de previsión capta la tendencia general bastante bien. Sin embargo, no capta el aumento del tráfico relacionado con eventos anteriores de Google I/O y no puede generar una previsión precisa para

      1. En las siguientes secciones se explica cómo hacer frente a algunas de estas limitaciones.

    Crear un modelo de previsión de series temporales que use festivos predefinidos y personalizados

    Como puedes ver en el historial de Google I/O, el evento de Google I/O se celebró en diferentes fechas entre el 2017 y el 2022. Para tener en cuenta esta variación, crea un modelo que pronostique las vistas de página de la página "Google_I/O" de Wikipedia hasta el 2022, basándose en los datos de vistas de página anteriores al 2022 y usando festivos personalizados para representar el evento Google I/O cada año. En este modelo, también ajustas el periodo de efecto de las festividades para que abarque tres días alrededor de la fecha del evento, de modo que se registre mejor el tráfico de la página antes y después del evento.

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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
          )
      );

    Visualizar los resultados previstos

    Después de crear el modelo con las festividades personalizadas, combina los datos originales de la tabla bqml_tutorial.googleio_page_views con el valor previsto de la función ML.EXPLAIN_FORECAST y, a continuación, visualízalos con Looker Studio:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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. En el panel Resultados de la consulta, haz clic en Explorar datos y, a continuación, en Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva.

    4. En la pestaña Looker Studio, haz clic en Añadir un gráfico, selecciona el gráfico de serie temporal y colócalo en el informe.

    5. En la pestaña Configuración del panel Gráfico, haga clic en Añadir métrica y seleccione adjusted_views_with_custom_holiday.

      El gráfico tiene un aspecto similar al siguiente:

      Gráfico de serie temporal de los resultados de la previsión con festivos personalizados

      Como puede ver, las festividades personalizadas han mejorado el rendimiento del modelo de previsión. Ahora registra de forma eficaz el aumento de las vistas de página provocado por Google I/O.

    Consultar información sobre festivos

    Para consultar la lista de festivos que se han tenido en cuenta durante la modelización, usa la función ML.HOLIDAY_INFO:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción SQL:

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

      En los resultados se muestran tanto Google I/O como las festividades integradas en la lista de festividades:

      Resultados de la función ML.HOLIDAY_INFO.

    Evaluar los efectos de los festivos personalizados

    Evalúa los efectos de los festivos personalizados en los resultados previstos mediante la función ML.EXPLAIN_FORECAST:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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;

      Los resultados muestran que Google I/O contribuye en gran medida al efecto de las vacaciones en los resultados previstos:

      Resultados de la función ML.EXPLAIN_FORECAST.

    Comparar el rendimiento de los modelos

    Usa la función ML.EVALUATE para comparar el rendimiento del primer modelo creado sin festivos personalizados y el del segundo modelo creado con festivos personalizados. Para ver cómo se comporta el segundo modelo a la hora de predecir un festivo personalizado futuro, define el intervalo de tiempo en la semana de Google I/O del 2022:

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción 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));

      Los resultados muestran que el segundo modelo ofrece una mejora significativa del rendimiento:

      Resultados de la función ML.EXPLAIN_FORECAST.

    Limpieza

    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.