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


在本教程中,您将学习如何使用 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. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the BigQuery API.

    Enable the 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤