在时序预测模型中使用自定义节假日

本教程介绍了如何执行以下任务:

  • 创建一个仅使用内置节假日的 ARIMA_PLUS 时序预测模型
  • 创建一个 ARIMA_PLUS 时序预测模型,除了自定义节假日之外,它还会使用自定义节假日。
  • 直观呈现这些模型的预测结果。
  • 检查模型以查看其模拟的节假日。
  • 评估自定义节假日对预测结果的影响。
  • 比较仅使用内置节假日的模型的性能与使用内置节假日的模型以及自定义节假日的模型的性能。

本教程使用 bigquery-public-data.wikipedia.pageviews_* 公共表。

所需权限

  • 如需创建数据集,您需要拥有 bigquery.datasets.create IAM 权限。
  • 如需创建连接资源,您需要以下权限:

    • bigquery.connections.create
    • bigquery.connections.get
  • 如需创建模型,您需要以下权限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 如需运行推断,您需要以下权限:

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

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • BigQuery:您在 BigQuery 中处理的数据会产生费用。

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

如需了解详情,请参阅 BigQuery 价格

须知事项

  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. Enable the BigQuery API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Enable the API

创建数据集

创建 BigQuery 数据集以存储您的机器学习模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

    创建数据集。

  4. 创建数据集页面上,执行以下操作:

    • 数据集 ID 部分,输入 bqml_tutorial

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

      公共数据集存储在 US 多区域中。为简单起见,请将数据集存储在同一位置。

    • 保持其余默认设置不变,然后点击创建数据集

      创建数据集页面。

准备时序数据

Google I/O 页面的维基百科网页浏览量数据聚合到按日期分组的表中:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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)
    

创建使用内置节假日的时序预测模型

创建一个模型,用于根据 2022 年之前的网页浏览量数据并考虑内置节假日数据,预测维基百科“Google I/O”网页的每日网页浏览量:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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';
    

直观呈现预测结果

使用内置节假日创建模型后,请将 bqml_tutorial.googleio_page_views 表中的原始数据与 ML.EXPLAIN_FORECAST 函数中的预测值联接,然后使用 Looker Studio 将其直观呈现:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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. 查询结果窗格中,点击探索数据,然后点击 Explore with Looker Studio(使用 Looker 数据洞察进行探索)。Looker 数据洞察将在新标签页中打开。

  4. 在 Looker Studio 标签页中,点击添加图表,然后点击时序图表:

    添加时序图表。

    将图表放在报表上。

  5. 图表窗格的设置标签页上,点击添加指标并选择 adjusted_views_without_custom_holiday

    添加其他指标。

    图表类似于以下内容:

    使用内置节假日的预测结果的时序图表

    您可以看到,预测模型很好地捕获了一般趋势。但是,它无法捕获与先前 Google I/O 事件相关的流量增加,并且无法生成准确的预测

    1. 后续部分将向您介绍如何应对其中一些限制。

使用内置节假日和自定义节假日创建时序预测模型

正如 Google I/O 大会历史记录中所示,Google I/O 大会的活动发生在 2017 年和 2022 年之间的不同日期。为将该变体考虑在内,请创建一个模型,以根据 2022 年之前的网页浏览量数据,预测 2022 年维基百科“Google_I/O”页面的网页浏览量,并使用自定义节假日来表示每年的 Google I/O 大会活动。 在此模型中,您还需要调整节假日效应的时间范围,使其涵盖事件日期前后的三天,以便更好地捕获事件前后的某些潜在网页流量。

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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
        )
    );
    

直观呈现预测结果

使用自定义节假日创建模型后,请将 bqml_tutorial.googleio_page_views 表中的原始数据与 ML.EXPLAIN_FORECAST 函数中的预测值联接,然后使用 Looker Studio 将其直观呈现:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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. 查询结果窗格中,点击探索数据,然后点击 Explore with Looker Studio(使用 Looker 数据洞察进行探索)。Looker 数据洞察将在新标签页中打开。

  4. 在 Looker Studio 标签页中,点击添加图表,点击时序图表,然后将图表放在报告中。

  5. 图表窗格的设置标签页上,点击添加指标并选择 adjusted_views_with_custom_holiday

    图表类似于以下内容:

    使用自定义节假日的预测结果的时序图表

    如您所见,自定义节假日提高了预测模型的性能。现在,它可以有效地捕获由 Google I/O 增加的网页浏览量。

检查节假日信息

使用 ML.HOLIDAY_INFO 函数检查在建模期间考虑的节假日列表:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 SQL 语句:

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

    结果会同时显示 Google I/O 和节假日列表中的内置节假日:

    ML.HOLIDAY_INFO 函数的结果。

评估自定义节假日的影响

使用 ML.EXPLAIN_FORECAST 函数评估自定义节假日对预测结果的影响:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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;
    

    结果表明,Google I/O 对预测结果产生了很大的节假日效应:

    ML.EXPLAIN_FORECAST 函数的结果。

比较模型性能

使用 ML.EVALUATE 函数比较第一个不含自定义节假日的模型和第二个使用自定义节假日创建的模型的性能。若要了解第二个模型在预测未来的自定义节假日时的表现,请将时间范围设置为 2022 年 Google I/O 一周:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在 SQL 编辑器窗格中,运行以下 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));
    

    结果表明,第二个模型的性能有显著提升:

    ML.EXPLAIN_FORECAST 函数的结果。

清理

  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.