分层时序预测
本教程介绍如何生成分层时序。在本教程中,您可基于相同的数据创建两个时序模型,其中一个使用分层预测,另一个不使用。这样,您就可以比较这两个模型返回的结果。
在本教程中,您将使用 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 价格。
准备工作
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
创建数据集
创建 BigQuery 数据集以存储您的机器学习模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在Explorer窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集。在创建数据集页面上,执行以下操作:
在数据集 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
查询以创建并训练模型:
在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。
在查询编辑器中输入以下 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;
点击运行。
查询大约需要 37 秒才能完成,之后您的模型 (
liquor_forecast
) 会显示在Explorer窗格中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
检查时序模型的结果
创建模型后,您可以使用 ML.FORECAST
函数查看预测结果。
您可以对模型 liquor_forecast
运行 ML.FORECAST
函数,方法是在 FROM
子句中指定该函数。
默认情况下,此查询会返回数据中所有唯一时间序列的预测,这些唯一时间序列由 store_number
、zip_code
、city
和 county
列标识。
如需运行 ML.FORECAST 查询,请按照以下步骤操作:
在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。
在查询编辑器中输入以下 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
点击运行。
执行查询大约需要 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
汇总在一起,以显示每个 county
、city
和 zip_code
的预测。系统会将 zip_code
和 store_number
分别汇总,以显示每个 county
和 city
的预测数据。列顺序很重要,因为它定义了层次结构的结构。
运行 CREATE MODEL
查询以创建并训练模型:
在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。
在查询编辑器中输入以下 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;
点击运行。
查询大约需要 45 秒才能完成,之后您的模型 (
bqml_tutorial.liquor_forecast_hierarchical
) 会显示在Explorer窗格中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
检查分层时序模型的结果
在 Google Cloud 控制台中,点击在 BigQuery 中运行查询按钮。
在查询编辑器中输入以下 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
点击运行。
执行查询大约需要 5 秒时间。查询运行后,输出会显示以下结果。
请注意 LeClaire 市 (store_number=NULL, zip_code=NULL, city=LECLAIRE, county=SCOTT) 的汇总预测结果的显示方式。如果您继续查看其余行,就会发现其他细分组的预测数据。例如,下图显示了针对邮政编码 52753 (store_number=NULL, zip_code=52753, city=LECLAIRE, county=SCOTT) 汇总的预测结果:
删除数据集
删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:
如有必要,请在 Google Cloud 控制台中打开 BigQuery 页面。
在导航窗格中,点击您创建的 bqml_tutorial 数据集。
点击窗口右侧的删除数据集。此操作会删除相关数据集、表和所有数据。
在删除数据集对话框中,通过输入数据集的名称 (
bqml_tutorial
) 来确认该删除命令,然后点击删除。
删除项目
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 了解如何使用纽约市花旗单车行程数据的单一查询进行多时序预测。
- 了解如何加速 ARIMA_PLUS 以在数小时内预测一百万个时序。
- 要详细了解机器学习,请参阅机器学习速成课程。
- 如需大致了解 BigQuery ML,请参阅 BigQuery ML 简介。
- 如需详细了解 Google Cloud 控制台,请参阅使用 Google Cloud 控制台。