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

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

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

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

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

创建数据集

创建 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)

创建输入数据表

以下查询的 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;

使用默认参数创建可预测多个时序的模型

您希望预测每个花旗单车站点的单车行程数,这需要使用多个时序模型;输入数据中包含的每个花旗单车站点都需要一个模型。您可以编写多个 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。这会生成 MAPE0.3471sMAPE0.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 倍。综合起来,这使我们可以实现在数小时内完成数百万个时序的预测。

创建模型以预测 100 万个时序

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

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

  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 分钟才能完成。