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

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

  • 创建一个仅使用内置节假日的 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: You incur costs for the data you process in 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.