在本教程中,您将学习如何显著加快一组时序模型的训练速度,以通过单个查询执行多个时序预测。您还将了解如何评估预测准确率。
本教程介绍了如何显著加快单变量时序模型的训练速度,以进行预测。
本教程介绍了如何预测多个时序。系统会针对一个或多个指定列中的每个值,为每个时间点计算预测值。例如,如果您要预测天气,并指定了包含城市数据的列,则预测数据将包含城市 A 的所有时间点的预测值,然后是城市 B 的所有时间点的预测值,以此类推。
本教程使用公共 bigquery-public-data.new_york.citibike_trips
和 iowa_liquor_sales.sales
表中的数据。自行车行程数据仅包含数百个时序,因此用于说明加快模型训练速度的各种策略。酒类销售数据包含超过 100 万个时间序列,因此用于显示大规模的时序预测。
在阅读本教程之前,您应该阅读使用单变量模型预测多个时间序列和大规模时序预测最佳实践。
目标
在本教程中,您将使用以下内容:
- 使用
CREATE MODEL
语句创建时序模型。 - 使用
ML.EVALUATE
函数评估模型的准确性。 - 使用
CREATE MODEL
语句的AUTO_ARIMA_MAX_ORDER
、TIME_SERIES_LENGTH_FRACTION
、MIN_TIME_SERIES_LENGTH
和MAX_TIME_SERIES_LENGTH
选项显著缩短模型训练时间。
为简单起见,本教程未介绍如何使用 ML.FORECAST
或 ML.EXPLAIN_FORECAST
函数生成预测。如需了解如何使用这些函数,请参阅使用单变量模型预测多个时序。
费用
本教程使用 Google Cloud 的以下收费组件:
- BigQuery
- BigQuery ML
如需详细了解费用,请参阅 BigQuery 价格页面和 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.
-
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.
- 新项目会自动启用 BigQuery。如需在现有项目中激活 BigQuery,请前往
Enable the BigQuery API.
所需权限
- 如需创建数据集,您需要拥有
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 简介。
创建数据集
创建 BigQuery 数据集以存储您的机器学习模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集。在创建数据集页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
公共数据集存储在
US
多区域中。为简单起见,请将数据集存储在同一位置。保持其余默认设置不变,然后点击创建数据集。
创建输入数据表
以下查询的 SELECT
语句使用 EXTRACT
函数从 starttime
列中提取日期信息。该查询使用 COUNT(*)
子句获取花旗单车的每日总行程数。
table_1
有 679 个时序。该查询使用额外的 INNER JOIN
逻辑来选择所有包含超过 400 个时间点的时序,因此总共有 383 个时序。
请按照以下步骤创建输入数据表:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE TABLE `bqml_tutorial.nyc_citibike_time_series` AS WITH input_time_series AS ( SELECT start_station_name, EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips FROM `bigquery-public-data.new_york.citibike_trips` GROUP BY start_station_name, date ) SELECT table_1.* FROM input_time_series AS table_1 INNER JOIN ( SELECT start_station_name, COUNT(*) AS num_points FROM input_time_series GROUP BY start_station_name) table_2 ON table_1.start_station_name = table_2.start_station_name WHERE num_points > 400;
使用默认参数为多个时间序列创建模型
您希望预测每个 Citi Bike 站点的单车行程数,这需要许多时序模型;输入数据中包含的每个 Citi Bike 站点对应一个模型。您可以编写多个 CREATE MODEL
查询来执行此操作,但这可能会是一个单调乏味且耗时的过程,尤其是当您有大量时序时。相反,您可以使用单个查询创建和拟合一组时序模型,以便一次预测多个时序。
OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...)
子句指示您正在创建一组基于 ARIMA 的时序 ARIMA_PLUS
模型。time_series_timestamp_col
选项用于指定包含时序的列,time_series_data_col
选项用于指定要预测的列,time_series_id_col
用于指定要为其创建时序的一个或多个维度。
此示例排除了时序中 2016 年 6 月 1 日之后的时间点,以便之后使用 ML.EVALUATE
函数和这些时间点来评估预测准确率。
请按照以下步骤创建模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default` OPTIONS (model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_name' ) AS SELECT * FROM bqml_tutorial.nyc_citibike_time_series WHERE date < '2016-06-01';
查询大约需要 15 分钟才能完成。
评估每个时序的预测准确率
使用 ML.EVALUATE
函数评估模型的预测准确性。
请按照以下步骤评估模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation));
此查询报告多个预测指标,包括:
结果应如下所示:
ML.EVALUATE
函数中的TABLE
子句用于标识包含标准答案数据的表。查询会将预测结果与标准答案数据进行比较,以计算准确率指标。在这种情况下,nyc_citibike_time_series
同时包含 2016 年 6 月 1 日之前和之后的时序点。2016 年 6 月 1 日之后的点是标准答案数据。2016 年 6 月 1 日之前的数据点用于训练模型,以生成此日期之后的预测。计算指标只需要 2016 年 6 月 1 日之后的数据点。2016 年 6 月 1 日之前的数据点在指标计算中会被忽略。ML.EVALUATE
函数中的STRUCT
子句为该函数指定了参数。horizon
值为7
,表示查询根据 7 点预测计算预测准确率。请注意,如果用于比较的标准答案数据包含的点少于 7 个,则仅根据可用点计算准确率指标。perform_aggregation
的值为TRUE
,表示基于时间点汇总预测准确率指标。如果您将perform_aggregation
值指定为FALSE
,则系统会返回每个预测时间点的预测准确率。如需详细了解输出列,请参阅
ML.EVALUATE
函数。
评估整体预测准确率
评估 383 个时序的预测准确率。
在 ML.EVALUATE
返回的预测指标中,只有平均绝对百分比误差和对称平均绝对百分比误差与时序值无关。因此,要评估一组时序的整体预测准确率,只有这两个指标的汇总结果才有意义。
请按照以下步骤评估模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT AVG(mean_absolute_percentage_error) AS MAPE, AVG(symmetric_mean_absolute_percentage_error) AS sMAPE FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation));
此查询会返回 MAPE
值 0.3471
和 sMAPE
值 0.2563
。
创建一个模型,使用较小的超参数搜索空间预测多个时间序列
在使用默认参数针对多个时间序列创建模型部分,您为所有训练选项(包括 auto_arima_max_order
选项)使用了默认值。此选项控制 auto.ARIMA
算法中超参数调节的搜索空间。
在通过以下查询创建的模型中,您将 auto_arima_max_order
选项值从默认的 5
更改为 2
,从而为超参数使用较小的搜索空间。
请按照以下步骤评估模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2` OPTIONS (model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_name', auto_arima_max_order = 2 ) AS SELECT * FROM `bqml_tutorial.nyc_citibike_time_series` WHERE date < '2016-06-01';
查询大约需要 2 分钟才能完成。回想一下,当
auto_arima_max_order
值为5
时,之前的模型大约需要 15 分钟才能完成训练,因此,此更改可将模型训练速度提升约 7 倍。您可能想知道速度提升为什么不是5/2=2.5x
,这是因为在增加auto_arima_max_order
值时,不仅候选模型的数量增加,复杂度也会增加。这会导致模型的训练时间增加。
评估使用较小超参数搜索空间的模型的预测准确率
请按照以下步骤评估模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT AVG(mean_absolute_percentage_error) AS MAPE, AVG(symmetric_mean_absolute_percentage_error) AS sMAPE FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation));
此查询会返回 MAPE
值 0.3337
和 sMAPE
值 0.2337
。
在评估整体预测准确率部分,您评估了一个超参数搜索空间较大的模型,其中 auto_arima_max_order
选项值为 5
。这会导致 MAPE
的值为 0.3471
,而 sMAPE
的值为 0.2563
。在本例中,您可以看到,较小的超参数搜索空间实际上可提供更高的预测准确率。原因之一是,auto.ARIMA
算法仅针对整个建模流水线的趋势模块执行超参数调节。auto.ARIMA
算法选择的最佳 ARIMA 模型可能不会为整个流水线生成最佳预测结果。
使用较小的超参数搜索空间和智能快速训练策略创建模型来预测多个时间序列
在此步骤中,您将使用较小的超参数搜索空间以及智能快速训练策略(使用一个或多个 max_time_series_length
、max_time_series_length
或 time_series_length_fraction
训练选项)。
定期建模(如季节性)需要特定数量的时间点,而趋势建模需要较少的时间点。同时,趋势建模的计算开销比其他时序组件(如季节性)高得多。通过使用上面的快速训练选项,您可以使用部分时序高效地为趋势组件建模,同时其他时序组件使用所有时序。
以下示例使用 max_time_series_length
选项实现快速训练。将 max_time_series_length
选项值设置为 30
后,系统只会使用最近的 30 个时间点来为趋势组件建模。为非趋势组件建模仍使用所有 383 个时序。
请按照以下步骤创建模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training` OPTIONS (model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_name', auto_arima_max_order = 2, max_time_series_length = 30 ) AS SELECT * FROM `bqml_tutorial.nyc_citibike_time_series` WHERE date < '2016-06-01';
查询大约需要 35 秒才能完成。与您在使用较小的超参数搜索空间创建模型以预测多个时间序列部分中使用的查询相比,速度快了 3 倍。由于查询的非训练部分(例如数据预处理)具有固定的时间开销,因此时序的数量大大高于此例中的数量时,速度提升将更明显。对于一百万个时序,速度提升接近时序长度与
max_time_series_length
选项值的比。在这种情况下,速度提升将大于 10 倍。
评估使用较小超参数搜索空间和智能快速训练策略的模型的预测准确率
请按照以下步骤评估模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT AVG(mean_absolute_percentage_error) AS MAPE, AVG(symmetric_mean_absolute_percentage_error) AS sMAPE FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation));
此查询会返回 MAPE
值 0.3515
和 sMAPE
值 0.2473
。
在之前的步骤中,在不使用快速训练策略的情况下,预测准确率结果为:MAPE
值为 0.3337
,sMAPE
值为 0.2337
。两组指标值相差不到 3%,没有显著的统计差异。
简而言之,您使用较小的超参数搜索空间和智能快速训练策略将模型训练速度提高了 20 倍以上,同时不牺牲预测准确率。如前所述,时序数量越多,智能快速训练策略的速度提升效果越明显。此外,ARIMA_PLUS
模型使用的底层 ARIMA 库已经过优化,运行速度比过去快了 5 倍。综合起来,这使我们可以实现在数小时内完成数百万个时序的预测。
创建模型来预测一百万个时序
在此步骤中,您将使用公开的爱荷华州酒类销量数据来预测不同商店中超过一百万种酒类商品的销量。模型训练使用较小的超参数搜索空间和智能快速训练策略。
请按照以下步骤评估模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_by_product` OPTIONS( MODEL_TYPE = 'ARIMA_PLUS', TIME_SERIES_TIMESTAMP_COL = 'date', TIME_SERIES_DATA_COL = 'total_bottles_sold', TIME_SERIES_ID_COL = ['store_number', 'item_description'], HOLIDAY_REGION = 'US', AUTO_ARIMA_MAX_ORDER = 2, MAX_TIME_SERIES_LENGTH = 30 ) AS SELECT store_number, item_description, 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("2021-12-31") GROUP BY store_number, item_description, date;
查询大约需要 1 小时 16 分钟才能完成。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
- 删除您在教程中创建的项目。
- 或者,保留项目但删除数据集。
删除数据集
删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:
如有必要,请在 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.
后续步骤
- 了解如何使用单变量模型预测单个时序
- 了解如何使用多变量模型预测单个时序
- 了解如何使用单变量模型预测多个时序
- 了解如何使用单变量模型对多个时序进行分层预测
- 如需大致了解 BigQuery ML,请参阅 BigQuery 中的 AI 和机器学习简介。