在本教程中,您将学习如何使用 epa_historical_air_quality
数据集中的以下示例表创建多变量时序模型 (ARIMA_PLUS_XREG
),以执行时序预测:
epa_historical_air_quality.pm25_nonfrm_daily_summary
示例表。epa_historical_air_quality.wind_daily_summary
示例表。epa_historical_air_quality.temperature_daily_summary
示例表。
epa_historical_air_quality
数据集包含从多个美国城市收集的每日 PM 2.5、温度和风速信息。
目标
在本教程中,您将使用以下内容:
CREATE MODEL
语句:用于创建一个时序模型。ML.ARIMA_EVALUATE
函数:用于检查模型中的 ARIMA 相关评估信息。ML.ARIMA_COEFFICIENTS
函数:用于检查模型系数。ML.FORECAST
函数:用于预测每天 PM 2.5。ML.EVALUATE
函数:使用实际数据评估模型。ML.EXPLAIN_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.
-
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
多区域中。为简单起见,请将数据集存储在同一位置。保持其余默认设置不变,然后点击创建数据集。
第二步:创建具有额外功能的时序表
PM2.5、温度和风速数据位于不同的表中。为了简化以下查询,您可以通过下面列的联接这些表来创建新表 bqml_tutorial.seattle_air_quality_daily
:
- date: 观察的日期
- PM2.5:每天的平均 PM2.5 值
- wind_speed:每天的平均风速
- temperature:每天的最高温度
新表包含 2009 年 8 月 11 日至 2022 年 1 月 31 日的每日数据。
在以下 GoogleSQL 查询中,FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary
子句指示您正在查询 epa_historical_air_quality
数据集中的 *_daily_summary
表。这些表是分区表。
#standardSQL CREATE TABLE `bqml_tutorial.seattle_air_quality_daily` AS WITH pm25_daily AS ( SELECT avg(arithmetic_mean) AS pm25, date_local AS date FROM `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary` WHERE city_name = 'Seattle' AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass' GROUP BY date_local ), wind_speed_daily AS ( SELECT avg(arithmetic_mean) AS wind_speed, date_local AS date FROM `bigquery-public-data.epa_historical_air_quality.wind_daily_summary` WHERE city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant' GROUP BY date_local ), temperature_daily AS ( SELECT avg(first_max_value) AS temperature, date_local AS date FROM `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary` WHERE city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature' GROUP BY date_local ) SELECT pm25_daily.date AS date, pm25, wind_speed, temperature FROM pm25_daily JOIN wind_speed_daily USING (date) JOIN temperature_daily USING (date)
如需运行查询,请按以下步骤操作:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入上面的 GoogleSQL 查询。
点击运行。
第三步(可选):直观呈现您要预测的时序
在创建模型之前,最好先查看输入时序的情况。您可以使用 Looker 数据洞察执行此操作。
在以下 GoogleSQL 查询中,FROM bqml_tutorial.seattle_air_quality_daily
子句指示您正在查询刚刚创建的 bqml_tutorial
数据集中的 seattle_air_quality_daily
表。
#standardSQL SELECT * FROM `bqml_tutorial.seattle_air_quality_daily`
如需运行查询,请按以下步骤操作:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入以下 GoogleSQL 查询。
#standardSQL SELECT * FROM `bqml_tutorial.seattle_air_quality_daily`
点击运行。
此查询运行后,输出类似于以下屏幕截图。在屏幕截图中,您可以看到此时序有 3960 个数据点。点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。Looker 数据洞察将在新标签页中打开。在该新标签页中完成以下步骤。
在图表面板中,选择时序图表 (Time series chart):
在设置面板中的图表面板下方,转到指标部分。添加 pm25、temperature 和 wind_speed 字段,然后移除默认指标记录计数。您还可以设置自定义日期范围,例如2019 年 1 月 1 日到 2021 年 12 月 31 日,以缩短时序。如下图所示。
完成这些步骤后,系统将显示以下图表。该图表显示输入时序具有每周的季节性模式。
第四步:创建时序模型
接下来,使用上述空气质量数据创建一个时序模型。以下 GoogleSQL 查询会创建一个用于预测 pm25
的模型。
CREATE MODEL
子句将创建并训练一个名为 bqml_tutorial.seattle_pm25_xreg_model
的模型。
#standardSQL CREATE OR REPLACE MODEL `bqml_tutorial.seattle_pm25_xreg_model` OPTIONS ( MODEL_TYPE = 'ARIMA_PLUS_XREG', time_series_timestamp_col = 'date', time_series_data_col = 'pm25') AS SELECT date, pm25, temperature, wind_speed FROM `bqml_tutorial.seattle_air_quality_daily` WHERE date BETWEEN DATE('2012-01-01') AND DATE('2020-12-31')
OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...)
子句表示您正在使用外部回归器模型创建 ARIMA。默认情况下,它是 auto_arima=TRUE
,因此 auto.ARIMA
算法会自动调整 ARIMA_PLUS_XREG
模型中的超参数。该算法适合数十个候选模型,选择具有最低 Akaike 信息标准 (AIC) 的模型。此外,由于默认设置为 data_frequency='AUTO_FREQUENCY'
,因此训练过程会自动推断输入时序的数据频率。
运行 CREATE MODEL
查询以创建并训练模型:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入上面的 GoogleSQL 查询。
点击运行。
查询大约需要 20 秒才能完成,之后您的模型 (
seattle_pm25_xreg_model
) 会显示在导航面板中。由于查询使用CREATE MODEL
语句来创建模型,因此您看不到查询结果。
第五步:检查所有评估模型的评估指标
创建模型后,您可以使用 ML.ARIMA_EVALUATE
函数查看自动超参数调整过程中评估的所有候选模型的评估指标。
在以下 GoogleSQL 查询中,FROM
子句对模型 bqml_tutorial.seattle_pm25_xreg_model
使用 ML.ARIMA_EVALUATE
函数。默认情况下,此查询会返回所有候选模型的评估指标。
如需运行 ML.ARIMA_EVALUATE
查询,请按以下步骤操作:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入以下 GoogleSQL 查询。
#standardSQL SELECT * FROM ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
点击运行。
查询完成后,点击查询文本区域下方的结果标签页。结果应类似于以下屏幕截图:
结果包括以下列:
non_seasonal_p
non_seasonal_d
non_seasonal_q
has_drift
log_likelihood
AIC
variance
seasonal_periods
has_holiday_effect
has_spikes_and_dips
has_step_changes
error_message
以下四列(
non_seasonal_{p,d,q}
和has_drift
)定义了训练流水线中的 ARIMA 模型。后面的三个指标(log_likelihood
、AIC
、variance
)与 ARIMA 模型拟合过程相关。auto.ARIMA
算法首先使用 KPSS 测试来确定non_seasonal_d
的最佳值为 1。当non_seasonal_d
为 1 时,auto.ARIMA 会并行训练 42 个不同的候选 ARIMA 模型。请注意,当non_seasonal_d
不为 1 时,auto.ARIMA 会训练 21 个不同的候选模型。在此示例中,所有 42 个候选模型均有效。因此,输出将包含 42 行,其中每行都与一个候选 ARIMA 模型相关联。请注意,对于某些时序,某些候选模型是无效的,因为它们不可逆或不固定。这些无效的模型会从输出中排除,这将使输出少于 42 行。这些候选模型将按照 AIC 升序排序。第一行中的模型具有最低的 AIC,它被视为最佳模型。此最佳模型将保存为最终模型,并在您调用ML.FORECAST
、ML.EVALUATE
和ML.ARIMA_COEFFICIENTS
时使用,如以下步骤所示。seasonal_periods
列是关于输入时序内的季节性模式。它与 ARIMA 建模无关,因此在所有输出行中都具有相同的值。它会报告每周模式,这与我们在上面的第二步中所述的情况一致。仅当
decompose_time_series=TRUE
时,才会填充has_holiday_effect
、has_spikes_and_dips
和has_step_changes
列。它们与输入时序中的节假日效应、高峰期和低谷期以及步进变化有关,与 ARIMA 建模无关。因此,除这些失败模型外,它们在所有输出行中都是相同的。error_message
列显示auto.ARIMA
拟合过程中可能发生的错误。可能的原因是所选non_seasonal_p
、non_seasonal_d
、non_seasonal_q
和has_drift
列无法稳定时序。如需检索所有候选模型的可能错误消息,请设置show_all_candidate_models=true
。
第六步:检查模型的系数
ML.ARIMA_COEFFICIENTS
函数会检索 ARIMA_PLUS 模型 bqml_tutorial.seattle_pm25_xreg_model
的模型系数。ML.ARIMA_COEFFICIENTS
接受该模型作为唯一输入。
运行 ML.ARIMA_COEFFICIENTS
查询:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入以下 GoogleSQL 查询。
#standardSQL SELECT * FROM ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
点击运行。
结果应如下所示:
结果包括以下列:
ar_coefficients
ma_coefficients
intercept_or_drift
processed_input
weight
category_weights.category
category_weights.weight
ar_coefficients
显示了 ARIMA 模型的自动回归 (AR) 部分的模型系数。同样,ma_coefficients
显示了移动平均 (MA) 部分的模型系数。它们都是数组,其长度分别等于non_seasonal_p
和non_seasonal_q
。在ML.ARIMA_EVALUATE
的输出中,最上面一行的最佳模型的non_seasonal_p
为 0,non_seasonal_q
为 5。因此,ar_coefficients
是空数组,ma_coefficients
是长度为 5 的数组。intercept_or_drift
是 ARIMA 模型中的常量项。processed_input
和相应的weight
和category_weights
列显示线性回归模型中每个特征的权重和截距。如果特征是数值特征,则权重位于weight
列中。如果特征是分类特征,则category_weights
是值为STRUCT
的ARRAY
,其中STRUCT
包含类别的名称和权重。
第七步:使用模型预测时序
ML.FORECAST
函数使用模型 bqml_tutorial.seattle_pm25_xreg_model
和未来的特征值预测未来的时序值以及预测区间。
在以下 GoogleSQL 查询中,STRUCT(30 AS horizon, 0.8 AS confidence_level)
子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。ML.FORECAST
采用模型、未来特征值以及几个可选参数。
如需运行 ML.FORECAST
查询,请按以下步骤操作:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入以下 GoogleSQL 查询。
#standardSQL SELECT * FROM ML.FORECAST( MODEL `bqml_tutorial.seattle_pm25_xreg_model`, STRUCT(30 AS horizon, 0.8 AS confidence_level), ( SELECT date, temperature, wind_speed FROM `bqml_tutorial.seattle_air_quality_daily` WHERE date > DATE('2020-12-31') ))
点击运行。
结果应如下所示:
结果包括以下列:
forecast_timestamp
forecast_value
standard_error
confidence_level
prediction_interval_lower_bound
prediction_interval_upper_bound
输出行将按照
forecast_timestamp
的时间顺序排序。在时序预测中,由下限和上限捕获的预测区间与forecast_value
一样重要。forecast_value
是预测区间的中点。预测区间取决于standard_error
和confidence_level
。
第八步:使用实际数据评估预测准确率
如需使用实际数据评估预测准确率,您可以将 ML.EVALUATE
函数与模型 bqml_tutorial.seattle_pm25_xreg_model
和实际数据表搭配使用。
如需运行 ML.EVALUATE
查询,请按以下步骤操作:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入以下 GoogleSQL 查询。
#standardSQL SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.seattle_pm25_xreg_model`, ( SELECT date, pm25, temperature, wind_speed FROM `bqml_tutorial.seattle_air_quality_daily` WHERE date > DATE('2020-12-31') ), STRUCT( TRUE AS perform_aggregation, 30 AS horizon))
第二个参数是具有未来特征的实际数据,用于预测未来值以与实际数据进行比较。第三个参数是此函数的参数结构。
点击运行。
结果应如下所示:
第九步:说明预测结果
若要了解时序的预测方式,ML.EXPLAIN_FORECAST
函数会使用模型 bqml_tutorial.seattle_pm25_xreg_model
预测未来的时序值以及预测间隔,同时返回该时序的所有单独的组件。
与 ML.FORECAST
函数一样,STRUCT(30 AS horizon, 0.8 AS confidence_level)
子句指示查询预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。ML.EXPLAIN_FORECAST
函数采用模型、未来特征值和几个可选参数作为输入。
如需运行 ML.EXPLAIN_FORECAST
查询,请按以下步骤操作:
在 Google Cloud 控制台中,点击编写新查询按钮。
在查询编辑器文本区域中输入以下 GoogleSQL 查询。
#standardSQL SELECT * FROM ML.EXPLAIN_FORECAST( MODEL `bqml_tutorial.seattle_pm25_xreg_model`, STRUCT(30 AS horizon, 0.8 AS confidence_level), ( SELECT date, temperature, wind_speed FROM `bqml_tutorial.seattle_air_quality_daily` WHERE date > DATE('2020-12-31') ))
点击运行。
查询只需不到一秒的时间即可完成。结果应如下所示:
结果包括以下列:
time_series_timestamp
time_series_type
time_series_data
time_series_adjusted_data
standard_error
confidence_level
prediction_interval_lower_bound
prediction_interval_lower_bound
trend
seasonal_period_yearly
seasonal_period_quarterly
seasonal_period_monthly
seasonal_period_weekly
seasonal_period_daily
holiday_effect
spikes_and_dips
step_changes
residual
attribution_temperature
attribution_wind_speed
attribution___INTERCEPT__
输出行将按照
time_series_timestamp
的时间顺序排序。不同的组件以不同输出列的形式列出。如需了解详情,请参阅ML.EXPLAIN_FORECAST
。
清理
为避免因本教程中使用的资源导致您的 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.
后续步骤
- 了解如何使用纽约市花旗单车行程数据的单一查询进行多时序预测
- 了解如何加速 ARIMA_PLUS 以在数小时内预测一百万个时序。
- 要详细了解机器学习,请参阅机器学习速成课程。
- 如需大致了解 BigQuery ML,请参阅 BigQuery ML 简介。
- 如需详细了解 Google Cloud 控制台,请参阅使用 Google Cloud 控制台。