分层时序预测

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

在本教程中,您将使用 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. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 BigQuery API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 BigQuery API。

    启用 API

创建数据集

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

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

    转到 BigQuery 页面

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

  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) 会显示在探索器窗格中。由于查询使用 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) 会显示在探索器窗格中。由于查询使用 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. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤