本教程介绍了如何使用多变量时序模型根据多个输入特征的历史值预测给定列的未来值。
本教程介绍了如何预测多个时序。系统会针对一个或多个指定列中的每个值,为每个时间点计算预测值。例如,如果您要预测天气,并指定了包含州级数据的列,则预测数据将包含州 A 的所有时间点的预测值,然后是州 B 的所有时间点的预测值,以此类推。如果您要预测天气和包含州和城市数据的指定列,则预测数据将包含州 A 和城市 A 的所有时间点的预测值,然后是州 A 和城市 B 的所有时间点的预测值,以此类推。
本教程使用公共 bigquery-public-data.iowa_liquor_sales.sales
和 bigquery-public-data.covid19_weathersource_com.postal_code_day_history
表中的数据。bigquery-public-data.iowa_liquor_sales.sales
表包含从爱荷华州多个城市收集的烈酒销售数据。bigquery-public-data.covid19_weathersource_com.postal_code_day_history
表格包含全球历史天气数据,例如温度和湿度。
在阅读本教程之前,我们强烈建议您先阅读使用多元模型预测单个时序。
目标
本教程将指导您完成以下任务:
- 使用
CREATE MODEL
语句创建时序模型,以预测酒类商店的订单。 - 使用
ML.FORECAST
函数从模型中检索预测的订单值。 - 使用
ML.EXPLAIN_FORECAST
函数检索时序的组成部分,例如季节性、趋势和特征归因。您可以检查这些时序组成部分,以便解释预测值。 - 使用
ML.EVALUATE
函数评估模型的准确性。 - 将模型与
ML.DETECT_ANOMALIES
函数搭配使用,以检测异常。
费用
本教程使用 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.
-
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 数据集以存储您的机器学习模型:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集。在创建数据集页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
公共数据集存储在
US
多区域中。为简单起见,请将数据集存储在同一位置。保持其余默认设置不变,然后点击创建数据集。
创建输入数据表
创建一个数据表,以便用于训练和评估模型。此表格结合了 bigquery-public-data.iowa_liquor_sales.sales
和 bigquery-public-data.covid19_weathersource_com.postal_code_day_history
表中的列,以分析天气对酒类商店订购的商品类型和数量有何影响。您还可以创建以下其他列,以用作模型的输入变量:
date
:订单日期store_number
:下单的商店的唯一编号item_number
:所订商品的唯一编号bottles_sold
:关联商品的订购瓶数temperature
:订购日期商店位置的平均温度humidity
:订购日期商店位置的平均湿度
请按照以下步骤创建输入数据表:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE TABLE `bqml_tutorial.iowa_liquor_sales_with_weather` AS WITH sales AS ( SELECT DATE, store_number, item_number, bottles_sold, SAFE_CAST(SAFE_CAST(zip_code AS FLOAT64) AS INT64) AS zip_code FROM `bigquery-public-data.iowa_liquor_sales.sales` AS sales WHERE SAFE_CAST(zip_code AS FLOAT64) IS NOT NULL ), aggregated_sales AS ( SELECT DATE, store_number, item_number, ANY_VALUE(zip_code) AS zip_code, SUM(bottles_sold) AS bottles_sold, FROM sales GROUP BY DATE, store_number, item_number ), weather AS ( SELECT DATE, SAFE_CAST(postal_code AS INT64) AS zip_code, avg_temperature_air_2m_f AS temperature, avg_humidity_specific_2m_gpkg AS humidity, FROM `bigquery-public-data.covid19_weathersource_com.postal_code_day_history` WHERE SAFE_CAST(postal_code AS INT64) IS NOT NULL ), avg_weather AS ( SELECT DATE, zip_code, AVG(temperature) AS temperature, AVG(humidity) AS humidity, FROM weather GROUP BY DATE, zip_code ) SELECT aggregated_sales.date, aggregated_sales.store_number, aggregated_sales.item_number, aggregated_sales.bottles_sold, avg_weather.temperature AS temperature, avg_weather.humidity AS humidity FROM aggregated_sales LEFT JOIN avg_weather ON aggregated_sales.zip_code=avg_weather.zip_code AND aggregated_sales.DATE=avg_weather.DATE;
创建时序模型
创建一个时序模型,以便针对 bqml_tutorial.iowa_liquor_sales_with_weather
表中 2022 年 9 月 1 日之前的每个日期,预测每个商店 ID 和商品 ID 组合的售出瓶数。将商店位置在每个日期的平均温度和湿度用作在预测期间评估的特征。bqml_tutorial.iowa_liquor_sales_with_weather
表中大约有 100 万个不同的商品编号和商店编号组合,这意味着需要预测 100 万个不同的时序。
请按照以下步骤创建模型:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
CREATE OR REPLACE MODEL `bqml_tutorial.multi_time_series_arimax_model` OPTIONS( model_type = 'ARIMA_PLUS_XREG', time_series_id_col = ['store_number', 'item_number'], time_series_data_col = 'bottles_sold', time_series_timestamp_col = 'date' ) AS SELECT * FROM `bqml_tutorial.iowa_liquor_sales_with_weather` WHERE DATE < DATE('2022-09-01');
查询大约需要 38 分钟才能完成,之后
multi_time_series_arimax_model
模型将显示在 Explorer 窗格中。由于查询使用CREATE MODEL
语句来创建模型,因此您看不到查询结果。
使用模型预测数据
使用 ML.FORECAST
函数预测未来的时序值。
在以下 GoogleSQL 查询中,STRUCT(5 AS horizon, 0.8 AS confidence_level)
子句表示该查询会预测 5 个未来时间点,并生成置信区间(置信水平为 80%)。
ML.FORECAST
函数的输入数据的数据签名与您用于创建模型的训练数据的数据签名相同。bottles_sold
列未包含在输入中,因为这是模型尝试预测的数据。
如需使用模型预测数据,请按以下步骤操作:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT * FROM ML.FORECAST ( model `bqml_tutorial.multi_time_series_arimax_model`, STRUCT (5 AS horizon, 0.8 AS confidence_level), ( SELECT * EXCEPT (bottles_sold) FROM `bqml_tutorial.iowa_liquor_sales_with_weather` WHERE DATE>=DATE('2022-09-01') ) );
结果应如下所示:
输出行按
store_number
值、item_ID
值、forecast_timestamp
列值的时间顺序排序。在时序预测中,由prediction_interval_lower_bound
和prediction_interval_upper_bound
列值表示的预测区间与forecast_value
列值一样重要。forecast_value
值是预测区间的中点。预测区间取决于standard_error
和confidence_level
列值。如需详细了解输出列,请参阅
ML.FORECAST
。
解释预测结果
除了预测数据之外,您还可以使用 ML.EXPLAIN_FORECAST
函数获取可解释性指标。ML.EXPLAIN_FORECAST
函数会预测未来的时序值,同时返回该时序的所有单独的组件。
与 ML.FORECAST
函数类似,ML.EXPLAIN_FORECAST
函数中使用的 STRUCT(5 AS horizon, 0.8 AS confidence_level)
子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。
ML.EXPLAIN_FORECAST
函数同时提供历史数据和预测数据。如需仅查看预测数据,请将 time_series_type
选项添加到查询中,并将 forecast
指定为选项值。
请按照以下步骤解释模型的结果:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT * FROM ML.EXPLAIN_FORECAST ( model `bqml_tutorial.multi_time_series_arimax_model`, STRUCT (5 AS horizon, 0.8 AS confidence_level), ( SELECT * EXCEPT (bottles_sold) FROM `bqml_tutorial.iowa_liquor_sales_with_weather` WHERE DATE >= DATE('2022-09-01') ) );
结果应如下所示:
输出行按
time_series_timestamp
列值的时间顺序排序。如需详细了解输出列,请参阅
ML.EXPLAIN_FORECAST
。
评估预测准确性
在模型未训练过的数据上运行模型,以评估模型的预测准确性。您可以使用 ML.EVALUATE
函数来实现此目的。ML.EVALUATE
函数会独立评估每个时序。
在以下 GoogleSQL 查询中,第二个 SELECT
语句会提供具有未来特征的数据,这些数据用于预测未来值以与实际数据进行比较。
请按照以下步骤评估模型的准确性:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT * FROM ML.EVALUATE ( model `bqml_tutorial.multi_time_series_arimax_model`, ( SELECT * FROM `bqml_tutorial.iowa_liquor_sales_with_weather` WHERE DATE >= DATE('2022-09-01') ) );
结果应如下所示:
如需详细了解输出列,请参阅
ML.EVALUATE
。
使用模型检测异常
使用 ML.DETECT_ANOMALIES
函数检测训练数据中的异常。
在以下查询中,STRUCT(0.95 AS anomaly_prob_threshold)
子句会导致 ML.DETECT_ANOMALIES
函数以 95% 的置信度识别异常数据点。
如需检测训练数据中的异常,请按以下步骤操作:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT * FROM ML.DETECT_ANOMALIES ( model `bqml_tutorial.multi_time_series_arimax_model`, STRUCT (0.95 AS anomaly_prob_threshold) );
结果应如下所示:
结果中的
anomaly_probability
列用于确定给定bottles_sold
列值异常的可能性。如需详细了解输出列,请参阅
ML.DETECT_ANOMALIES
。
检测新数据中的异常
通过向 ML.DETECT_ANOMALIES
函数提供输入数据,检测新数据中的异常情况。新数据的数据签名必须与训练数据相同。
如需检测新数据中的异常,请按以下步骤操作:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下查询,然后点击运行:
SELECT * FROM ML.DETECT_ANOMALIES ( model `bqml_tutorial.multi_time_series_arimax_model`, STRUCT (0.95 AS anomaly_prob_threshold), ( SELECT * FROM `bqml_tutorial.iowa_liquor_sales_with_weather` WHERE DATE >= DATE('2022-09-01') ) );
结果应如下所示:
清理
为避免因本教程中使用的资源导致您的 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 和机器学习简介。