将单变量时序模型扩展到数百万个时序


在本教程中,您将学习如何显著加快一组时序模型的训练速度,以通过单个查询执行多个时序预测。您还将了解如何评估预测准确率。

本教程介绍了如何显著加快单变量时序模型的训练速度,以进行预测。

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

本教程使用公共 bigquery-public-data.new_york.citibike_tripsiowa_liquor_sales.sales 表中的数据。自行车行程数据仅包含数百个时序,因此用于说明加快模型训练速度的各种策略。酒类销售数据包含超过 100 万个时间序列,因此用于显示大规模的时序预测。

在阅读本教程之前,您应该阅读使用单变量模型预测多个时间序列大规模时序预测最佳实践

目标

在本教程中,您将使用以下内容:

为简单起见,本教程未介绍如何使用 ML.FORECASTML.EXPLAIN_FORECAST 函数生成预测。如需了解如何使用这些函数,请参阅使用单变量模型预测多个时序

费用

本教程使用 Google Cloud 的以下收费组件:

  • BigQuery
  • BigQuery ML

如需详细了解费用,请参阅 BigQuery 价格页面和 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 多区域中。为简单起见,请将数据集存储在同一位置。

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

      创建数据集页面。

创建输入数据表

以下查询的 SELECT 语句使用 EXTRACT 函数starttime 列中提取日期信息。该查询使用 COUNT(*) 子句获取花旗单车的每日总行程数。

table_1 有 679 个时序。该查询使用额外的 INNER JOIN 逻辑来选择所有包含超过 400 个时间点的时序,因此总共有 383 个时序。

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

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

    转到 BigQuery

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

    CREATE OR REPLACE TABLE
      `bqml_tutorial.nyc_citibike_time_series` AS
    WITH input_time_series AS
    (
      SELECT
        start_station_name,
        EXTRACT(DATE FROM starttime) AS date,
        COUNT(*) AS num_trips
      FROM
        `bigquery-public-data.new_york.citibike_trips`
      GROUP BY
        start_station_name, date
    )
    SELECT table_1.*
    FROM input_time_series AS table_1
    INNER JOIN (
      SELECT start_station_name,  COUNT(*) AS num_points
      FROM input_time_series
      GROUP BY start_station_name) table_2
    ON
      table_1.start_station_name = table_2.start_station_name
    WHERE
      num_points > 400;

使用默认参数为多个时间序列创建模型

您希望预测每个 Citi Bike 站点的单车行程数,这需要许多时序模型;输入数据中包含的每个 Citi Bike 站点对应一个模型。您可以编写多个 CREATE MODEL 查询来执行此操作,但这可能会是一个单调乏味且耗时的过程,尤其是当您有大量时序时。相反,您可以使用单个查询创建和拟合一组时序模型,以便一次预测多个时序。

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句指示您正在创建一组基于 ARIMA 的时序 ARIMA_PLUS 模型。time_series_timestamp_col 选项用于指定包含时序的列,time_series_data_col 选项用于指定要预测的列,time_series_id_col 用于指定要为其创建时序的一个或多个维度。

此示例排除了时序中 2016 年 6 月 1 日之后的时间点,以便之后使用 ML.EVALUATE 函数和这些时间点来评估预测准确率。

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

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

    转到 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name'
      ) AS
    SELECT *
    FROM bqml_tutorial.nyc_citibike_time_series
    WHERE date < '2016-06-01';

    查询大约需要 15 分钟才能完成。

评估每个时序的预测准确率

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

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

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

    转到 BigQuery

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

    SELECT *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    此查询报告多个预测指标,包括:

    结果应如下所示:时序模型的评估指标。

    ML.EVALUATE 函数中的 TABLE 子句用于标识包含标准答案数据的表。查询会将预测结果与标准答案数据进行比较,以计算准确率指标。在这种情况下,nyc_citibike_time_series 同时包含 2016 年 6 月 1 日之前和之后的时序点。2016 年 6 月 1 日之后的点是标准答案数据。2016 年 6 月 1 日之前的数据点用于训练模型,以生成此日期之后的预测。计算指标只需要 2016 年 6 月 1 日之后的数据点。2016 年 6 月 1 日之前的数据点在指标计算中会被忽略。

    ML.EVALUATE 函数中的 STRUCT 子句为该函数指定了参数。horizon 值为 7,表示查询根据 7 点预测计算预测准确率。请注意,如果用于比较的标准答案数据包含的点少于 7 个,则仅根据可用点计算准确率指标。perform_aggregation 的值为 TRUE,表示基于时间点汇总预测准确率指标。如果您将 perform_aggregation 值指定为 FALSE,则系统会返回每个预测时间点的预测准确率。

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

评估整体预测准确率

评估 383 个时序的预测准确率。

ML.EVALUATE 返回的预测指标中,只有平均绝对百分比误差对称平均绝对百分比误差与时序值无关。因此,要评估一组时序的整体预测准确率,只有这两个指标的汇总结果才有意义。

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

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

    转到 BigQuery

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

此查询会返回 MAPE0.3471sMAPE0.2563

创建一个模型,使用较小的超参数搜索空间预测多个时间序列

使用默认参数针对多个时间序列创建模型部分,您为所有训练选项(包括 auto_arima_max_order 选项)使用了默认值。此选项控制 auto.ARIMA 算法中超参数调节的搜索空间。

在通过以下查询创建的模型中,您将 auto_arima_max_order 选项值从默认的 5 更改为 2,从而为超参数使用较小的搜索空间。

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

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

    转到 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    查询大约需要 2 分钟才能完成。回想一下,当 auto_arima_max_order 值为 5 时,之前的模型大约需要 15 分钟才能完成训练,因此,此更改可将模型训练速度提升约 7 倍。您可能想知道速度提升为什么不是 5/2=2.5x,这是因为在增加 auto_arima_max_order 值时,不仅候选模型的数量增加,复杂度也会增加。这会导致模型的训练时间增加。

评估使用较小超参数搜索空间的模型的预测准确率

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

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

    转到 BigQuery

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

此查询会返回 MAPE0.3337sMAPE0.2337

评估整体预测准确率部分,您评估了一个超参数搜索空间较大的模型,其中 auto_arima_max_order 选项值为 5。这会导致 MAPE 的值为 0.3471,而 sMAPE 的值为 0.2563。在本例中,您可以看到,较小的超参数搜索空间实际上可提供更高的预测准确率。原因之一是,auto.ARIMA 算法仅针对整个建模流水线的趋势模块执行超参数调节。auto.ARIMA 算法选择的最佳 ARIMA 模型可能不会为整个流水线生成最佳预测结果。

使用较小的超参数搜索空间和智能快速训练策略创建模型来预测多个时间序列

在此步骤中,您将使用较小的超参数搜索空间以及智能快速训练策略(使用一个或多个 max_time_series_lengthmax_time_series_lengthtime_series_length_fraction 训练选项)。

定期建模(如季节性)需要特定数量的时间点,而趋势建模需要较少的时间点。同时,趋势建模的计算开销比其他时序组件(如季节性)高得多。通过使用上面的快速训练选项,您可以使用部分时序高效地为趋势组件建模,同时其他时序组件使用所有时序。

以下示例使用 max_time_series_length 选项实现快速训练。将 max_time_series_length 选项值设置为 30 后,系统只会使用最近的 30 个时间点来为趋势组件建模。为非趋势组件建模仍使用所有 383 个时序。

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

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

    转到 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2,
      max_time_series_length = 30
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    查询大约需要 35 秒才能完成。与您在使用较小的超参数搜索空间创建模型以预测多个时间序列部分中使用的查询相比,速度快了 3 倍。由于查询的非训练部分(例如数据预处理)具有固定的时间开销,因此时序的数量大大高于此例中的数量时,速度提升将更明显。对于一百万个时序,速度提升接近时序长度与 max_time_series_length 选项值的比。在这种情况下,速度提升将大于 10 倍。

评估使用较小超参数搜索空间和智能快速训练策略的模型的预测准确率

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

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

    转到 BigQuery

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

此查询会返回 MAPE0.3515sMAPE0.2473

在之前的步骤中,在不使用快速训练策略的情况下,预测准确率结果为:MAPE 值为 0.3337sMAPE 值为 0.2337。两组指标值相差不到 3%,没有显著的统计差异。

简而言之,您使用较小的超参数搜索空间和智能快速训练策略将模型训练速度提高了 20 倍以上,同时不牺牲预测准确率。如前所述,时序数量越多,智能快速训练策略的速度提升效果越明显。此外,ARIMA_PLUS 模型使用的底层 ARIMA 库已经过优化,运行速度比过去快了 5 倍。综合起来,这使我们可以实现在数小时内完成数百万个时序的预测。

创建模型来预测一百万个时序

在此步骤中,您将使用公开的爱荷华州酒类销量数据来预测不同商店中超过一百万种酒类商品的销量。模型训练使用较小的超参数搜索空间和智能快速训练策略。

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

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

    转到 BigQuery

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

    CREATE OR REPLACE MODEL
      `bqml_tutorial.liquor_forecast_by_product`
    OPTIONS(
      MODEL_TYPE = 'ARIMA_PLUS',
      TIME_SERIES_TIMESTAMP_COL = 'date',
      TIME_SERIES_DATA_COL = 'total_bottles_sold',
      TIME_SERIES_ID_COL = ['store_number', 'item_description'],
      HOLIDAY_REGION = 'US',
      AUTO_ARIMA_MAX_ORDER = 2,
      MAX_TIME_SERIES_LENGTH = 30
    ) AS
    SELECT
      store_number,
      item_description,
      date,
      SUM(bottles_sold) as total_bottles_sold
    FROM
      `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
    GROUP BY store_number, item_description, date;

    查询大约需要 1 小时 16 分钟才能完成。

清理

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

后续步骤