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

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

本教程将介绍如何预测多个时序。系统会针对每个时间点,为一个或多个指定列中的每个值计算预测值。例如,如果您想预测天气并指定了一个包含状态数据的列,则预测数据会包含状态 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 表包含来自世界各地的历史天气数据(例如温度和湿度)。

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

创建数据集

创建 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.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
          country = 'US' AND
          SAFE_CAST(postal_code AS INT64) IS NOT NULL
      )
    SELECT
      aggregated_sales.date,
      aggregated_sales.store_number,
      aggregated_sales.item_number,
      aggregated_sales.bottles_sold,
      weather.temperature AS temperature,
      weather.humidity AS humidity
    FROM
      aggregated_sales
      LEFT JOIN weather ON aggregated_sales.zip_code=weather.zip_code
      AND aggregated_sales.DATE=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 模型。由于查询使用 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')
        )
      );

    结果应如下所示:

    新数据的异常值检测信息。