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


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

本教程介绍了如何预测多个时序。系统会针对一个或多个指定列中的每个值,为每个时间点计算预测值。例如,如果您要预测天气,并指定了包含州级数据的列,则预测数据将包含州 A 的所有时间点的预测值,然后是州 B 的所有时间点的预测值,以此类推。如果您要预测天气和包含州和城市数据的指定列,则预测数据将包含州 A 和城市 A 的所有时间点的预测值,然后是州 A 和城市 B 的所有时间点的预测值,以此类推。

本教程使用公共 bigquery-public-data.iowa_liquor_sales.salesbigquery-public-data.covid19_weathersource_com.postal_code_day_history 表中的数据。bigquery-public-data.iowa_liquor_sales.sales 表包含从爱荷华州多个城市收集的烈酒销售数据。bigquery-public-data.covid19_weathersource_com.postal_code_day_history 表格包含全球历史天气数据,例如温度和湿度。

在阅读本教程之前,我们强烈建议您先阅读使用多元模型预测单个时序

目标

本教程将指导您完成以下任务:

费用

本教程使用 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 多区域中。为简单起见,请将数据集存储在同一位置。

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

      创建数据集页面。

创建输入数据表

创建一个数据表,以便用于训练和评估模型。此表格结合了 bigquery-public-data.iowa_liquor_sales.salesbigquery-public-data.covid19_weathersource_com.postal_code_day_history 表中的列,以分析天气对酒类商店订购的商品类型和数量有何影响。您还可以创建以下其他列,以用作模型的输入变量:

  • date:订单日期
  • store_number:下单的商店的唯一编号
  • item_number:所订商品的唯一编号
  • bottles_sold:关联商品的订购瓶数
  • temperature:订购日期商店位置的平均温度
  • humidity:订购日期商店位置的平均湿度

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

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

    转到 BigQuery

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

    CREATE OR REPLACE TABLE
      `bqml_tutorial.iowa_liquor_sales_with_weather` AS
    WITH
      sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          bottles_sold,
          SAFE_CAST(SAFE_CAST(zip_code AS FLOAT64) AS INT64) AS zip_code
        FROM
          `bigquery-public-data.iowa_liquor_sales.sales` AS sales
        WHERE
          SAFE_CAST(zip_code AS FLOAT64) IS NOT NULL
      ),
      aggregated_sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          ANY_VALUE(zip_code) AS zip_code,
          SUM(bottles_sold) AS bottles_sold,
        FROM
          sales
        GROUP BY
          DATE,
          store_number,
          item_number
      ),
      weather AS (
        SELECT
          DATE,
          SAFE_CAST(postal_code AS INT64) AS zip_code,
          avg_temperature_air_2m_f AS temperature,
          avg_humidity_specific_2m_gpkg AS humidity,
        FROM
          `bigquery-public-data.covid19_weathersource_com.postal_code_day_history`
        WHERE
          SAFE_CAST(postal_code AS INT64) IS NOT NULL
      ),
      avg_weather AS (
        SELECT
          DATE,
          zip_code,
          AVG(temperature) AS temperature,
          AVG(humidity) AS humidity,
        FROM
          weather
        GROUP BY
          DATE,
          zip_code
      )
    SELECT
      aggregated_sales.date,
      aggregated_sales.store_number,
      aggregated_sales.item_number,
      aggregated_sales.bottles_sold,
      avg_weather.temperature AS temperature,
      avg_weather.humidity AS humidity
    FROM
      aggregated_sales
      LEFT JOIN avg_weather ON aggregated_sales.zip_code=avg_weather.zip_code
      AND aggregated_sales.DATE=avg_weather.DATE;

创建时序模型

创建一个时序模型,以便针对 bqml_tutorial.iowa_liquor_sales_with_weather 表中 2022 年 9 月 1 日之前的每个日期,预测每个商店 ID 和商品 ID 组合的售出瓶数。将商店位置在每个日期的平均温度和湿度用作在预测期间评估的特征。bqml_tutorial.iowa_liquor_sales_with_weather 表中大约有 100 万个不同的商品编号和商店编号组合,这意味着需要预测 100 万个不同的时序。

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

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

    转到 BigQuery

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

    CREATE
    OR REPLACE MODEL `bqml_tutorial.multi_time_series_arimax_model`
    OPTIONS(
      model_type = 'ARIMA_PLUS_XREG',
      time_series_id_col = ['store_number', 'item_number'],
      time_series_data_col = 'bottles_sold',
      time_series_timestamp_col = 'date'
    )
    AS SELECT
      *
    FROM
      `bqml_tutorial.iowa_liquor_sales_with_weather`
    WHERE
      DATE < DATE('2022-09-01');

    查询大约需要 38 分钟才能完成,之后 multi_time_series_arimax_model 模型将显示在 Explorer 窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

使用模型预测数据

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

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

ML.FORECAST 函数的输入数据的数据签名与您用于创建模型的训练数据的数据签名相同。bottles_sold 列未包含在输入中,因为这是模型尝试预测的数据。

如需使用模型预测数据,请按以下步骤操作:

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE>=DATE('2022-09-01')
        )
      );

    结果应如下所示:

    销售的瓶子数量的预测数据。

    输出行按 store_number 值、item_ID 值、forecast_timestamp 列值的时间顺序排序。在时序预测中,由 prediction_interval_lower_boundprediction_interval_upper_bound 列值表示的预测区间与 forecast_value 列值一样重要。forecast_value 值是预测区间的中点。预测区间取决于 standard_errorconfidence_level 列值。

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

解释预测结果

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

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

ML.EXPLAIN_FORECAST 函数同时提供历史数据和预测数据。如需仅查看预测数据,请将 time_series_type 选项添加到查询中,并将 forecast 指定为选项值。

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

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    结果应如下所示:

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

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

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

评估预测准确性

在模型未训练过的数据上运行模型,以评估模型的预测准确性。您可以使用 ML.EVALUATE 函数来实现此目的。ML.EVALUATE 函数会独立评估每个时序。

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

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

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.EVALUATE (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        (
          SELECT
            *
          FROM
           `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    结果应如下所示:

    模型的评估指标。

    如需详细了解输出列,请参阅 ML.EVALUATE

使用模型检测异常

使用 ML.DETECT_ANOMALIES 函数检测训练数据中的异常。

在以下查询中,STRUCT(0.95 AS anomaly_prob_threshold) 子句会导致 ML.DETECT_ANOMALIES 函数以 95% 的置信度识别异常数据点。

如需检测训练数据中的异常,请按以下步骤操作:

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold)
      );

    结果应如下所示:

    训练数据的异常检测信息。

    结果中的 anomaly_probability 列用于确定给定 bottles_sold 列值异常的可能性。

    如需详细了解输出列,请参阅 ML.DETECT_ANOMALIES

检测新数据中的异常

通过向 ML.DETECT_ANOMALIES 函数提供输入数据,检测新数据中的异常情况。新数据的数据签名必须与训练数据相同。

如需检测新数据中的异常,请按以下步骤操作:

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold),
        (
          SELECT
            *
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    结果应如下所示:

    新数据的异常检测信息。

清理

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

后续步骤