分层时序预测

本教程介绍如何生成分层时序。在本教程中,您可基于相同的数据创建两个时序模型,其中一个使用分层预测,另一个不使用。这样,您就可以比较这两个模型返回的结果。

在本教程中,您将使用 iowa_liquor.sales.sales 数据训练模型。此数据集使用公开的爱荷华州酒类销售数据,包含不同商店中超过一百万种酒类商品的信息。

在遵循本教程之前,您应该熟悉多个时序预测。如需简要了解本主题,请学完根据 Google Analytics 数据进行多个时序预测这一教程。

所需权限

  • 如需创建数据集,您需要拥有 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 简介

目标

在本教程中,您将使用以下内容:

  • CREATE MODEL 语句:用于创建时序模型和分层时序模型。
  • ML.FORECAST 函数:用于预测每日总销售额。

费用

本教程使用 Google Cloud 的收费组件,包括以下组件:

  • BigQuery
  • BigQuery ML

如需详细了解 BigQuery 费用,请参阅 BigQuery 价格页面。

如需详细了解 BigQuery ML 费用,请参阅 BigQuery ML 价格

准备工作

  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. Explorer窗格中,点击您的项目名称。

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

    创建数据集。

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

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

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

      创建数据集页面。

分层协调

时序预测通常可以根据关注的不同维度进行细分或汇总。这些时间序列称为分层时序。例如,体现各州总人口的人口普查数据可按城市和邮编进行细分。反过来,我们可以汇总每个国家/地区或大洲的数据。

您可以使用多种方法来生成和协调分层预测。下面的示例展示了爱荷华州酒类销量的简化层次结构:

分层时序。

最低级别显示商店级别,然后是邮政编码级别、城市、郡/县,最后按州显示。分层预测的目标是确保每个级别的所有预测都必须保持一致。例如,假设在上图中,这意味着克莱夫和得梅因的预测总和必须等于波尔克的预测。同样,波尔克、林恩和斯科特的预报总和应等于爱荷华州的预报。

有多种常用方法可用于为每个级别生成协调预测。其中一种方法称为“自下而上”方法。在此方法中,首先在层次结构的底层生成预测,然后再对其他级别进行求和。在前面的示例中,每个商店的预测数据都用于为其他级别构建预测模型(首先按邮编,然后是城市等)。

创建时序模型

首先,使用爱荷华州酒类销售数据创建一个时序模型。

以下 GoogleSQL 查询会创建一个模型,用于预测 2015 年波尔克县、林恩县和斯科特县的每日销售瓶数。CREATE MODEL 语句将创建并训练一个名为 bqml_tutorial.liquor_forecast 的模型。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句指示您正在创建一个基于 ARIMA 的时序模型。默认情况下,auto_arima=TRUE,因此 auto.ARIMA 算法会自动调整 ARIMA_PLUS 模型中的超参数。该算法适合数十个候选模型,选择具有最低 Akaike 信息标准 (AIC) 的模型。 如果时序中存在美国节假日模式,则将 holiday_region 选项设置为 US 可以对这些美国节假日时间点进行更准确的建模。

运行 CREATE MODEL 查询以创建并训练模型:

  1. 在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。

  2. 在查询编辑器中输入以下 GoogleSQL 查询。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;
  1. 点击运行

    查询大约需要 37 秒才能完成,之后您的模型 (liquor_forecast) 会显示在Explorer窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

检查时序模型的结果

创建模型后,您可以使用 ML.FORECAST 函数查看预测结果。

您可以对模型 liquor_forecast 运行 ML.FORECAST 函数,方法是在 FROM 子句中指定该函数。

默认情况下,此查询会返回数据中所有唯一时间序列的预测,这些唯一时间序列由 store_numberzip_codecitycounty 列标识。

如需运行 ML.FORECAST 查询,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。

  2. 在查询编辑器中输入以下 GoogleSQL 查询。

#standardSQL
SELECT *
FROM
  ML.FORECAST(
    MODEL `bqml_tutorial.liquor_forecast`,
    STRUCT(20 AS horizon, 0.8 AS confidence_level))
ORDER BY store_number, county, city, zip_code, forecast_timestamp
  1. 点击运行

    执行查询大约需要 5 秒时间。查询运行后,输出会显示以下结果。

    时序示例。

    请注意第一个时序的预测结果的显示方式 (store_number=2190, zip_code=50314, city=DES MOINES, county=POLK)。如果您继续查看其余行,就会发现其他组的预测数据。

    一般而言,系统会为每个唯一时序生成预测。若要针对汇总级别(例如特定县/郡的预测)生成预测,您需要生成分层预测。

创建具有分层预测的时序模型

使用爱荷华州酒类销售数据创建分层时序预测。

以下 GoogleSQL 查询会创建一个模型,用于生成分层预测,对 2015 年波尔克县、林恩县和斯科特县销售的酒瓶总数进行分层预测。CREATE MODEL 语句将创建并训练一个名为 bqml_tutorial.liquor_forecast_hierarchical 的模型。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_hierarchical`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HIERARCHICAL_TIME_SERIES_COLS = ['zip_code', 'store_number'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;

HIERARCHICAL_TIME_SERIES_COLS 参数表示您正在根据一组列创建分层预测。每一列都会进行汇总。例如,在上一个查询中,这意味着将 store_number 汇总在一起,以显示每个 countycityzip_code 的预测。系统会将 zip_codestore_number 分别汇总,以显示每个 countycity 的预测数据。列顺序很重要,因为它定义了层次结构的结构。

运行 CREATE MODEL 查询以创建并训练模型:

  1. 在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。

  2. 在查询编辑器中输入以下 GoogleSQL 查询。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_hierarchical`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HIERARCHICAL_TIME_SERIES_COLS = ['zip_code', 'store_number'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;
  1. 点击运行

    查询大约需要 45 秒才能完成,之后您的模型 (bqml_tutorial.liquor_forecast_hierarchical) 会显示在Explorer窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

检查分层时序模型的结果

  1. 在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。

  2. 在查询编辑器中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
    *
    FROM
    ML.FORECAST(
      MODEL `bqml_tutorial.liquor_forecast_hierarchical`,
      STRUCT(30 AS horizon, 0.8 AS confidence_level))
    WHERE city = 'LECLAIRE'
    ORDER BY county, city, zip_code, store_number, forecast_timestamp
    
  3. 点击运行

    执行查询大约需要 5 秒时间。查询运行后,输出会显示以下结果。

    分层时序示例。

    请注意 LeClaire 市 (store_number=NULL, zip_code=NULL, city=LECLAIRE, county=SCOTT) 的汇总预测结果的显示方式。如果您继续查看其余行,就会发现其他细分组的预测数据。例如,下图显示了针对邮政编码 52753 (store_number=NULL, zip_code=52753, city=LECLAIRE, county=SCOTT) 汇总的预测结果:

    分层时序示例。

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  1. 如有必要,请在 Google Cloud 控制台中打开 BigQuery 页面。

    前往 BigQuery 页面

  2. 在导航窗格中,点击您创建的 bqml_tutorial 数据集。

  3. 点击窗口右侧的删除数据集。此操作会删除相关数据集、表和所有数据。

  4. 删除数据集对话框中,通过输入数据集的名称 (bqml_tutorial) 来确认该删除命令,然后点击删除

删除项目

要删除项目,请执行以下操作:

  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.

后续步骤