使用多元模型预测单个时序


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

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

本教程使用 bigquery-public-data.epa_historical_air_quality 公共数据集中的数据。此数据集包含从多个美国城市收集的每日颗粒物 (PM2.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.datasets.create IAM 权限。
  • 如需创建连接资源,您需要以下权限:

    • bigquery.connections.create
    • bigquery.connections.get
  • 如需创建模型,您需要以下权限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 如需运行推理,您需要以下权限:

    • bigquery.models.getData
    • bigquery.jobs.create

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介

创建数据集

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

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

    转到 BigQuery 页面

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

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

    创建数据集。

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

      公共数据集存储在 US 多区域中。为简单起见,请将数据集存储在同一位置。

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

      创建数据集页面。

创建输入数据表

创建一个数据表,以便用于训练和评估模型。此表会组合 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 数据洞察执行此操作。

如需可视化时序数据,请按以下步骤操作:

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

    转到 BigQuery

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

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

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

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

  6. 指标部分中,添加 pm25temperaturewind_speed 字段,然后移除默认的 Record Count 指标。生成的图表类似于以下内容:

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

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

创建时序模型

创建一个时序模型,使用 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 函数

清理

为避免因本教程中使用的资源导致您的 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.

后续步骤