本教程介绍了如何使用多变量时序模型根据多个输入特征的历史值来预测给定列的未来值。
本教程将介绍如何预测多个时序。系统会针对每个时间点,为一个或多个指定列中的每个值计算预测值。例如,如果您想预测天气并指定了一个包含状态数据的列,则预测数据会包含状态 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
表包含来自世界各地的历史天气数据(例如温度和湿度)。
在阅读本教程之前,我们强烈建议您阅读使用多变量模型预测单个时序。
创建数据集
创建 BigQuery 数据集以存储机器学习模型。
控制台
在 Google Cloud 控制台中,前往 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集在 创建数据集 页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
保持其余默认设置不变,然后点击创建数据集。
bq
如需创建新数据集,请使用带有 --location
标志的 bq mk
命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset
命令参考文档。
创建一个名为
bqml_tutorial
的数据集,并将数据位置设置为US
,说明为BigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
该命令使用的不是
--dataset
标志,而是-d
快捷方式。如果省略-d
和--dataset
,该命令会默认创建一个数据集。确认已创建数据集:
bq ls
API
使用已定义的数据集资源调用 datasets.insert
方法。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrame
在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC。
创建输入数据表
创建一个数据表,您可以使用该数据表来训练和评估模型。此表合并了 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 country = 'US' AND SAFE_CAST(postal_code AS INT64) IS NOT NULL ) SELECT aggregated_sales.date, aggregated_sales.store_number, aggregated_sales.item_number, aggregated_sales.bottles_sold, weather.temperature AS temperature, weather.humidity AS humidity FROM aggregated_sales LEFT JOIN weather ON aggregated_sales.zip_code=weather.zip_code AND aggregated_sales.DATE=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
模型。由于查询使用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') ) );
结果应如下所示: