西雅图空气质量数据的多变量时序预测


在本教程中,您将学习如何使用 epa_historical_air_quality 数据集中的以下示例表创建多变量时序模型 (ARIMA_PLUS_XREG),以执行时序预测:

epa_historical_air_quality 数据集包含从多个美国城市收集的每日 PM 2.5、温度和风速信息。

目标

在本教程中,您将使用以下内容:

费用

本教程使用 Google Cloud 的收费组件,包括以下组件:

  • BigQuery
  • BigQuery ML

如需详细了解 BigQuery 费用,请参阅 BigQuery 价格页面。

如需详细了解 BigQuery ML 费用,请参阅 BigQuery ML 价格

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 新项目会自动启用 BigQuery。如需在现有项目中激活 BigQuery,请转到

    启用 BigQuery API。

    启用 API

第一步:创建数据集

创建 BigQuery 数据集以存储您的机器学习模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

    创建数据集。

  4. 创建数据集页面上,执行以下操作:

    • 数据集 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)

如需运行查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入上面的 GoogleSQL 查询。

  3. 点击运行

第三步(可选):直观呈现您要预测的时序

在创建模型之前,最好先查看输入时序的情况。您可以使用 Looker 数据洞察执行此操作。

在以下 GoogleSQL 查询中,FROM bqml_tutorial.seattle_air_quality_daily 子句指示您正在查询刚刚创建的 bqml_tutorial 数据集中的 seattle_air_quality_daily 表。

#standardSQL
SELECT
  *
FROM
  `bqml_tutorial.seattle_air_quality_daily`

如需运行查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     `bqml_tutorial.seattle_air_quality_daily`
    
  3. 点击运行

    此查询运行后,输出类似于以下屏幕截图。在屏幕截图中,您可以看到此时序有 3960 个数据点。点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。Looker 数据洞察将在新标签页中打开。在该新标签页中完成以下步骤。

    查询输出

    图表面板中,选择时序图表 (Time series chart):

    Time_series_chart

    设置面板中的图表面板下方,转到指标部分。添加 pm25temperaturewind_speed 字段,然后移除默认指标记录计数。您还可以设置自定义日期范围,例如2019 年 1 月 1 日到 2021 年 12 月 31 日,以缩短时序。如下图所示。

    Time_series_data_fields

    完成这些步骤后,系统将显示以下图表。该图表显示输入时序具有每周的季节性模式。

    Result_visualization

第四步:创建时序模型

接下来,使用上述空气质量数据创建一个时序模型。以下 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 查询以创建并训练模型:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入上面的 GoogleSQL 查询。

  3. 点击运行

    查询大约需要 20 秒才能完成,之后您的模型 (seattle_pm25_xreg_model) 会显示在导航面板中。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

第五步:检查所有评估模型的评估指标

创建模型后,您可以使用 ML.ARIMA_EVALUATE 函数查看自动超参数调整过程中评估的所有候选模型的评估指标。

在以下 GoogleSQL 查询中,FROM 子句对模型 bqml_tutorial.seattle_pm25_xreg_model 使用 ML.ARIMA_EVALUATE 函数。默认情况下,此查询会返回所有候选模型的评估指标。

如需运行 ML.ARIMA_EVALUATE 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
    
  3. 点击运行

  4. 查询完成后,点击查询文本区域下方的结果标签页。结果应类似于以下屏幕截图:

    ML.ARIMA_EVALUATE 输出。

    结果包括以下列:

    • 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_likelihoodAICvariance)与 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.FORECASTML.EVALUATEML.ARIMA_COEFFICIENTS 时使用,如以下步骤所示。

    seasonal_periods 列是关于输入时序内的季节性模式。它与 ARIMA 建模无关,因此在所有输出行中都具有相同的值。它会报告每周模式,这与我们在上面的第二步中所述的情况一致。

    仅当 decompose_time_series=TRUE 时,才会填充 has_holiday_effecthas_spikes_and_dipshas_step_changes 列。它们与输入时序中的节假日效应、高峰期和低谷期以及步进变化有关,与 ARIMA 建模无关。因此,除这些失败模型外,它们在所有输出行中都是相同的。

    error_message 列显示 auto.ARIMA 拟合过程中可能发生的错误。可能的原因是所选 non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 列无法稳定时序。如需检索所有候选模型的可能错误消息,请设置 show_all_candidate_models=true

第六步:检查模型的系数

ML.ARIMA_COEFFICIENTS 函数会检索 ARIMA_PLUS 模型 bqml_tutorial.seattle_pm25_xreg_model 的模型系数。ML.ARIMA_COEFFICIENTS 接受该模型作为唯一输入。

运行 ML.ARIMA_COEFFICIENTS 查询:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`)
    
  3. 点击运行

    结果应如下所示:

    ML.ARIMA_COEFFICIENTS 输出。

    结果包括以下列:

    • 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_pnon_seasonal_q。在 ML.ARIMA_EVALUATE 的输出中,最上面一行的最佳模型的 non_seasonal_p 为 0,non_seasonal_q 为 5。因此,ar_coefficients 是空数组,ma_coefficients 是长度为 5 的数组。intercept_or_drift 是 ARIMA 模型中的常量项。

    processed_input 和相应的 weightcategory_weights 列显示线性回归模型中每个特征的权重和截距。如果特征是数值特征,则权重位于 weight 列中。如果特征是分类特征,则 category_weights 是值为 STRUCTARRAY,其中 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 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 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')
    ))
    
  3. 点击运行

    结果应如下所示:

    ML.FORECAST 输出。

    结果包括以下列:

    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound

    输出行将按照 forecast_timestamp 的时间顺序排序。在时序预测中,由下限和上限捕获的预测区间与 forecast_value 一样重要。forecast_value 是预测区间的中点。预测区间取决于 standard_errorconfidence_level

第八步:使用实际数据评估预测准确率

如需使用实际数据评估预测准确率,您可以将 ML.EVALUATE 函数与模型 bqml_tutorial.seattle_pm25_xreg_model 和实际数据表搭配使用。

如需运行 ML.EVALUATE 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 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))
    

    第二个参数是具有未来特征的实际数据,用于预测未来值以与实际数据进行比较。第三个参数是此函数的参数结构。

  3. 点击运行

    结果应如下所示:

    ML.EVALUATE 输出。

第九步:说明预测结果

若要了解时序的预测方式,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 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 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')
        ))
    
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应如下所示:

    ML.EXPLAIN_FORECAST 输出 1。 ML.EXPLAIN_FORECAST 输出 2。

    结果包括以下列:

    • 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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  • 删除您在教程中创建的项目。
  • 或者,保留项目但删除数据集。

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  1. 如有必要,请在 Google Cloud 控制台中打开 BigQuery 页面。

    前往 BigQuery 页面

  2. 在导航窗格中,点击您创建的 bqml_tutorial 数据集。

  3. 点击窗口右侧的删除数据集。此操作会删除相关数据集、表和所有数据。

  4. 删除数据集对话框中,输入您的数据集的名称 (bqml_tutorial),然后点击删除以确认删除命令。

删除项目

要删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤