使用多变量模型预测单个时序

本教程介绍了如何使用多变量时序模型根据多个输入特征的历史值来预测给定列的未来值。

本教程将预测单个时序。系统会针对输入数据中的每个时间点计算一次预测值。

本教程使用来自 bigquery-public-data.epa_historical_air_quality 公共数据集的数据。此数据集包含从美国多个城市收集的每日颗粒物 (PM2.5)、温度和风速信息。

创建数据集

创建 BigQuery 数据集以存储机器学习模型。

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery 页面

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

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

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

    • 数据集 ID 部分,输入 bqml_tutorial

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

    • 保持其余默认设置不变,然后点击创建数据集

bq

如需创建新数据集,请使用带有 --location 标志的 bq mk 命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset 命令参考文档。

  1. 创建一个名为 bqml_tutorial 的数据集,并将数据位置设置为 US,说明为 BigQuery ML tutorial dataset

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    该命令使用的不是 --dataset 标志,而是 -d 快捷方式。如果省略 -d--dataset,该命令会默认创建一个数据集。

  2. 确认已创建数据集:

    bq ls

API

使用已定义的数据集资源调用 datasets.insert 方法。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

创建输入数据表

创建一个数据表,您可以使用该数据表来训练和评估模型。此表合并了 bigquery-public-data.epa_historical_air_quality 数据集中多个表的列,以提供每日天气数据。您还可以创建以下列,以将其用作模型的输入变量:

  • date:观察的日期
  • pm25:每天的平均 PM2.5 值
  • wind_speed:每天的平均风速
  • temperature:每天的最高温度

在以下 GoogleSQL 查询中,FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary 子句指示您正在查询 epa_historical_air_quality 数据集中的 *_daily_summary 表。这些表是分区表

请按照以下步骤创建输入数据表:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    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);

直观呈现输入数据

在创建模型之前,您可以选择直观呈现输入时序数据,以了解分布情况。您可以使用 Looker Studio 执行此操作。

请按照以下步骤直观呈现时序数据:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
      *
    FROM
      `bqml_tutorial.seattle_air_quality_daily`;
  3. 查询完成后,依次点击探索数据 > 使用 Looker Studio 探索。Looker Studio 将在新标签页中打开。在该新标签页中完成以下步骤。

  4. 在 Looker Studio 中,依次点击插入 > 时序图表

  5. 图表窗格中,选择设置标签页。

  6. 指标部分中,添加 pm25temperaturewind_speed 字段,并移除默认的记录数指标。生成的图表如下所示:

    显示一段时间内天气的图表。

    从图表中,您可以看到输入时序具有每周的季节性模式。

创建时序模型

使用 pm25wind_speedtemperature 列值作为输入变量,创建一个时序模型来预测以 pm25 列表示的颗粒物值。使用 bqml_tutorial.seattle_air_quality_daily 表中的空气质量数据训练模型,选择 2012 年 1 月 1 日至 2020 年 12 月 31 日之间收集的数据。

在以下查询中,OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) 子句表示您正在使用外部回归器模型创建 ARIMA。CREATE MODEL 语句的 auto_arima 选项默认为 TRUE,因此 auto.ARIMA 算法会自动调整模型中的超参数。该算法会拟合数十个候选模型,并选择具有最低 Akaike 信息准则 (AIC) 的最佳模型。 CREATE MODEL 语句的 data_frequency 选项默认为 AUTO_FREQUENCY,因此训练过程会自动推断输入时序的数据频率。

请按照以下步骤创建模型:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    CREATE OR REPLACE
      MODEL
        `bqml_tutorial.seattle_pm25_xreg_model`
      OPTIONS (
        MODEL_TYPE = 'ARIMA_PLUS_XREG',
        time_series_timestamp_col = 'date',  # Identifies the column that contains time points
        time_series_data_col = 'pm25')       # Identifies the column to forecast
    AS
    SELECT
      date,                                  # The column that contains time points
      pm25,                                  # The column to forecast
      temperature,                           # Temperature input to use in forecasting
      wind_speed                             # Wind speed input to use in forecasting
    FROM
      `bqml_tutorial.seattle_air_quality_daily`
    WHERE
      date
      BETWEEN DATE('2012-01-01')
      AND DATE('2020-12-31');

    查询大约需要 20 秒才能完成,之后您便可访问 seattle_pm25_xreg_model 模型。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

评估候选模型

使用 ML.ARIMA_EVALUATE 函数评估时序模型。ML.ARIMA_EVALUATE 函数会显示自动超参数调整过程中评估的所有候选模型的评估指标。

请按照以下步骤评估模型:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

    结果应如下所示:

    时序模型的评估指标。

    non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 输出列定义了训练流水线中的 ARIMA 模型。log_likelihoodAICvariance 输出列与 ARIMA 模型拟合过程相关。

    auto.ARIMA 算法使用 KPSS 测试来确定 non_seasonal_d 的最佳值,在本例中为 1。当 non_seasonal_d1 时,auto.ARIMA 算法会并行训练 42 个不同的候选 ARIMA 模型。在此示例中,所有 42 个候选模型均有效,因此输出包含 42 行,每行对应一个候选 ARIMA 模型;如果某些模型无效,则会从输出中排除。这些候选模型将按照 AIC 升序返回。第一行中的模型具有最低的 AIC,它被视为最佳模型。最佳模型将保存为最终模型,并在您对模型调用 ML.FORECAST 等函数时使用。

    seasonal_periods 列包含有关时序数据中识别出的季节性模式的信息。它与 ARIMA 建模无关,因此在所有输出行中都具有相同的值。它会报告每周模式,该模式与您选择直观呈现输入数据时看到的结果一致。

    has_holiday_effecthas_spikes_and_dipshas_step_changes 列提供有关输入时序数据的信息,与 ARIMA 建模无关。之所以返回这些列,是因为 CREATE MODEL 语句中 decompose_time_series 选项的值为 TRUE。这些列在所有输出行中也具有相同的值。

    error_message 列显示 auto.ARIMA 拟合过程中发生的任何错误。错误的一个可能原因是所选 non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 列无法稳定时序。如需检索所有候选模型的错误消息,请在创建模型时将 show_all_candidate_models 选项设置为 TRUE

    如需详细了解输出列,请参阅 ML.ARIMA_EVALUATE 函数

检查模型的系数

使用 ML.ARIMA_COEFFICIENTS 函数检查时序模型的系数。

请按照以下步骤检索模型的系数:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

    结果应如下所示:

    时序模型的系数。

    ar_coefficients 输出列显示了 ARIMA 模型的自动回归 (AR) 部分的模型系数。同样,ma_coefficients 输出列显示了 ARIMA 模型的移动平均值 (MA) 部分的模型系数。这两个列都包含数组值,其长度分别等于 non_seasonal_pnon_seasonal_q。在 ML.ARIMA_EVALUATE 函数的输出中,您看到最佳模型的 non_seasonal_p 值为 0non_seasonal_q 值为 5。因此,在 ML.ARIMA_COEFFICIENTS 输出中,ar_coefficients 值是一个空数组,而 ma_coefficients 值是一个 5 个元素的数组。intercept_or_drift 值是 ARIMA 模型中的常量项。

    processed_inputweightcategory_weights 输出列显示线性回归模型中每个特征的权重和截距。如果特征是数值特征,则权重位于 weight 列中。如果特征是分类特征,则 category_weights 值是一个结构体值数组,其中每个结构体值都包含给定类别的名称和权重。

    如需详细了解输出列,请参阅 ML.ARIMA_COEFFICIENTS 函数

使用模型预测数据

使用 ML.FORECAST 函数预测未来的时序值。

在以下 GoogleSQL 查询中,STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。

请按照以下步骤使用模型预测数据:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    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 列值的时间顺序排序。在时序预测中,由 prediction_interval_lower_boundprediction_interval_upper_bound 列值表示的预测区间与 forecast_value 列值一样重要。forecast_value 值是预测区间的中点。预测区间取决于 standard_errorconfidence_level 列值。

    如需详细了解输出列,请参阅 ML.FORECAST 函数

评估预测准确率

使用 ML.EVALUATE 函数评估模型的预测准确率。

在以下 GoogleSQL 查询中,第二个 SELECT 语句提供具有未来特征的数据,这些内容用于预测未来值以与实际数据进行比较。

请按照以下步骤评估模型的准确率:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    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.EVALUATE 函数

解释预测结果

除了预测数据,您还可以使用 ML.EXPLAIN_FORECAST 函数获取可解释性指标。ML.EXPLAIN_FORECAST 函数会预测未来的时序值,还会返回该时序的所有单独的组件。

ML.FORECAST 函数类似,ML.EXPLAIN_FORECAST 函数中使用的 STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。

请按照以下步骤解释模型的结果:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    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')
        ));

    结果应如下所示:

    前九个输出列包含预测数据和预测说明。 第 10 到 17 列输出预测数据和预测说明。 预测数据和预测说明的最后六个输出列。

    输出行按 time_series_timestamp 列值的时间顺序排序。

    如需详细了解输出列,请参阅 ML.EXPLAIN_FORECAST 函数