使用纽约市花旗单车行程的单一查询进行多个时序预测


在本教程中,您将学习如何创建一组时序模型,以便通过单个查询执行多个时序预测。您还将了解如何应用不同的快速训练策略来显著加快查询速度,以及如何评估预测准确率。您将使用 new_york.citibike_trips 数据。此数据包含有关纽约市花旗单车行程的信息。

在阅读本教程之前,我们强烈建议您阅读根据 Google Analytics(分析)数据进行单个时序预测

目标

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

  • CREATE MODEL 语句:用于创建一个时序模型或一组时序模型。
  • ML.ARIMA_EVALUATE 函数:用于评估模型。
  • ML.ARIMA_COEFFICIENTS 函数:用于检查模型系数。
  • ML.EXPLAIN_FORECAST 函数:用于检索时序的各个组件(例如季节性和趋势),可用于说明预测结果。
  • Looker 数据洞察:直观呈现预测结果。
  • (可选)ML.FORECAST 函数:用于预测每日总访问次数。

费用

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

  • BigQuery
  • BigQuery ML

如需详细了解 BigQuery 费用,请参阅 BigQuery 价格页面。

如需详细了解 BigQuery ML 费用,请参阅 BigQuery ML 价格

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 新项目会自动启用 BigQuery。如需在现有项目中激活 BigQuery,请转到

    启用 BigQuery API。

    启用 API

第一步:创建数据集

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

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

    转到 BigQuery 页面

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

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

    创建数据集。

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

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

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

      创建数据集页面。

第二步(可选):直观呈现您要预测的时间序列

在创建模型之前,最好先查看输入时序的情况。您可以使用 Looker 数据洞察实现此目的。

在以下查询中,FROM bigquery-public-data.new_york.citibike_trips 子句指示您正在查询 new_york 数据集中的 citibike_trips 表。

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

#standardSQL
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
GROUP BY date

如需运行查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    GROUP BY date
    
  3. 点击运行

    查询运行后,输出类似于以下屏幕截图。 在屏幕截图中,您可以看到此时序有 1184 个每日数据点,这些数据点的时间跨度超过 4 年。点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。Looker 数据洞察将在新标签页中打开。在该新标签页中完成以下步骤。

    查询输出。

  4. 图表面板中,选择时序图表 (Time series chart):

    Time_series_chart。

  5. 数据面板中的图表面板下方,转到指标部分。添加 num_trips 字段,然后移除默认指标记录计数 (Record Count):

    Time_series_data_fields。

    完成上述步骤后,系统会显示以下图表。该图表显示输入时序具有每周和每年的模式。时序还呈现了上升的趋势。

    Result_visualization。

第三步:创建时序模型以执行单个时序预测

接下来,使用纽约市花旗单车行程数据创建一个时序模型。

以下 GoogleSQL 查询会创建一个用于预测单车每日总行程数的模型。CREATE MODEL 子句将创建并训练一个名为 bqml_tutorial.nyc_citibike_arima_model 的模型。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips'
  ) AS
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
GROUP BY date

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句指示您正在创建一个基于 ARIMA 的时序模型。默认情况下,auto_arima=TRUE,因此 auto.ARIMA 算法会自动调整 ARIMA_PLUS 模型中的超参数。该算法适合数十个候选模型,选择具有最低 Akaike 信息标准 (AIC) 的模型。此外,由于默认设置为 data_frequency='AUTO_FREQUENCY',因此训练过程会自动推断输入时序的数据频率。最后,CREATE MODEL 语句默认使用 decompose_time_series=TRUE,用户也可以通过获取单独的时序组件(例如季节性周期和节假日效应)来进一步了解如何预测时序。

运行 CREATE MODEL 查询以创建并训练模型:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips'
      ) AS
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    GROUP BY date
    
  3. 点击运行

    查询大约需要 17 秒才能完成,之后您的模型 (nyc_citibike_arima_model) 会显示在导航面板中。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

第四步:预测时序并直观呈现结果

为了说明时序的预测方式,请使用 ML.EXPLAIN_FORECAST 函数直观呈现所有子时序组件,例如季节性和趋势。

为此,请执行以下步骤:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model`,
                          STRUCT(365 AS horizon, 0.9 AS confidence_level))
    
  3. 点击运行

  4. 查询完成后,点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。浏览器中会打开一个新的标签页。然后,在图表面板中,找到时序图表 (Time series chart) 图标并点击它,如下面的屏幕截图所示。

    Time_series_chart。

  5. 数据面板中,执行以下操作:

    1. 日期范围维度部分中,选择 time_series_timestamp (Date)
    2. 维度部分中,选择 time_series_timestamp (Date)
    3. 指标部分中,移除默认指标 Record Count,并添加以下内容:
      • time_series_data
      • prediction_interval_lower_bound
      • prediction_interval_upper_bound
      • trend
      • seasonal_period_yearly
      • seasonal_period_weekly
      • spikes_and_dips
      • step_changes

    Time_series_chart。

  6. 样式 (Style) 面板中,向下滚动到缺失数据选项,然后使用换行符 (Line Breaks),而不是换行到零 (Line to Zero)。

    Style_section。

    完成这些步骤后,左侧面板中将显示以下图表。

    Result_visualization。

第五步:同时预测多个时序

接下来,您可能希望预测从不同花旗单车站点开始的每日总行程数。为此,您必须预测多个时序。您可以编写多个 CREATE MODEL 查询,但这可能会是一个单调乏味且耗时的过程,尤其是当您有大量时序时。

为了改进此过程,BigQuery ML 允许您创建一组时序模型,以使用单个查询预测多个时序。此外,系统会同时拟合所有时序模型。

在以下 GoogleSQL 查询中,CREATE MODEL 子句会创建并训练一组名为 bqml_tutorial.nyc_citibike_arima_model_group 的模型。

 #standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
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 = 5
  ) AS
SELECT
   start_station_name,
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
WHERE start_station_name LIKE '%Central Park%'
GROUP BY start_station_name, date

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句指示您正在创建一组基于 ARIMA 的时序 ARIMA_PLUS 模型。除了 time_series_timestamp_coltime_series_data_col 之外,您还必须指定 time_series_id_col,它用于注释不同的输入时序。auto_arima_max_order 选项可控制 auto.ARIMA 算法中超参数调节的搜索空间。最后,默认情况下,CREATE MODEL 语句使用 decompose_time_series=TRUE,并且用户可以通过提取分解结果,进一步了解如何在训练流水线中分析时序。

SELECT ... FROM ... GROUP BY ... 子句指示您将生成多个时序;每个时序都与一个不同的 start_station_name 相关联。为简单起见,使用 WHERE ... LIKE ... 子句将起始站点限定为名称中包含 Central Park 的站点。

如需运行 CREATE MODEL 查询以创建并训练模型,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
    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 = 5
      ) AS
    SELECT
       start_station_name,
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    WHERE start_station_name LIKE '%Central Park%'
    GROUP BY start_station_name, date
    
  3. 点击运行

    查询大约需要 24 秒才能完成,之后您的模型 (nyc_citibike_arima_model_group) 会显示在导航面板中。由于查询使用 CREATE MODEL 语句,因此您看不到查询结果。

第六步:检查时序模型集合的评估指标

创建模型后,您可以使用 ML.ARIMA_EVALUATE 函数查看所有已创建模型的评估指标。

在以下 GoogleSQL 查询中,FROM 子句对模型 bqml_tutorial.nyc_citibike_arima_model_group 使用 ML.ARIMA_EVALUATE 函数。评估指标仅取决于训练输入,因此您的模型是唯一的输入。

如需运行 ML.ARIMA_EVALUATE 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`)
    
  3. 点击运行

  4. 查询只需不到一秒的时间即可完成。查询完成后,点击查询文本区域下方的结果标签页。结果应如下所示:

    ML.EVALUATE 输出。

    结果包括以下列:

    • start_station_name
    • non_seasonal_p
    • non_seasonal_d
    • non_seasonal_q
    • has_drift
    • log_likelihood
    • AIC
    • variance
    • seasonal_periods
    • has_holiday_effect
    • has_spikes_and_dips
    • has_step_changes
    • error_message

    第一列 start_station_name 注释系统拟合每个时序模型所依据的时序。它与 time_series_id_col 指定的内容相同。

    以下四列(non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift)定义了训练流水线中的 ARIMA 模型。后面的三个指标(log_likelihoodAICvariance)与 ARIMA 模型拟合过程相关。拟合过程通过使用 auto.ARIMA 算法确定最佳的 ARIMA 模型(每个时序对应一个最佳模型)。

    仅当 decompose_time_series=TRUE 时,才填充 has_holiday_effecthas_spikes_and_dipshas_step_changes 列。

    seasonal_periods 列是输入时序内的季节性模式。每个时序可以有不同的季节性模式。例如,您可以从图中看到一个时序具有一个每年模式,而其他时序则没有。

第七步:检查模型的系数

ML.ARIMA_COEFFICIENTS 函数用于检索 ARIMA_PLUS 模型 bqml_tutorial.nyc_citibike_arima_model_group 的模型系数。ML.ARIMA_COEFFICIENTS 接受该模型作为唯一输入。

如需运行 ML.ARIMA_COEFFICIENTS 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`)
    
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应类似于以下屏幕截图:

    ML.ARIMA_COEFFICIENTS 输出。

    结果包括以下列:

    • start_station_name
    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    第一列 start_station_name 注释系统拟合每个时序模型所依据的时序。

    ar_coefficients 显示了 ARIMA 模型的自动回归 (AR) 部分的模型系数。同样,ma_coefficients 显示了移动平均 (MA) 部分的模型系数。它们都是数组,其长度分别等于 non_seasonal_pnon_seasonal_qintercept_or_drift 是 ARIMA 模型中的常量项。

第八步:使用模型同时预测多个时序并提供说明

ML.EXPLAIN_FORECAST 函数会使用您的模型 bqml_tutorial.nyc_citibike_arima_model_group 预测未来的时序值以及预测间隔,同时返回该时序的所有单独的组件。

STRUCT(3 AS horizon, 0.9 AS confidence_level) 子句指示查询会预测三个未来的时间点,并生成置信度为 90% 的预测区间。ML.EXPLAIN_FORECAST 函数采用该模型以及几个可选的参数。

如需运行 ML.EXPLAIN_FORECAST 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
                         STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应如下所示:

    ML.EXPLAIN_FORECAST 输出 1。 ML.EXPLAIN_FORECAST 输出 2。

    结果包括以下列:

    • start_station_name
    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes
    • residual

    输出行按 start_station_name 排序,对于每个 start_station_name,输出行按 time_series_timestamp 的时间顺序排序。不同的组件以不同输出列的形式列出。如需了解详情,请参阅 ML.EXPLAIN_FORECAST 的定义。

(可选)第九步:使用模型同时预测多个时序

ML.FORECAST 函数也可用于通过模型 bqml_tutorial.nyc_citibike_arima_model_group 预测未来的时序值以及预测间隔。

ML.EXPLAIN_FORECAST 一样,STRUCT(3 AS horizon, 0.9 AS confidence_level) 子句指示对于每个时序,该查询都预测三个未来时间点,并生成 90% 置信度的预测间隔。

ML.FORECAST 函数采用该模型以及几个可选的参数。

如需运行 ML.FORECAST 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
                 STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应如下所示:

    ML.FORECAST 输出。

    结果包括以下列:

    • start_station_name
    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • confidence_interval_lower_bound(即将弃用)
    • confidence_interval_upper_bound(即将弃用)

    第一列 start_station_name 注释系统拟合每个时序模型所依据的时序。每个 start_station_name 的预测结果都有 horizon 行。

    对于每个 start_station_name,输出行将按照 forecast_timestamp 的时间顺序排序。在时序预测中,由下限和上限捕获的预测区间与 forecast_value 一样重要。forecast_value 是预测区间的中点。预测区间取决于 standard_errorconfidence_level

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  • 删除您在教程中创建的项目。
  • 或者,保留项目但删除数据集。

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  1. 如有必要,请在 Google Cloud 控制台中打开 BigQuery 页面。

    前往 BigQuery 页面

  2. 在导航窗格中,点击您创建的 bqml_tutorial 数据集。

  3. 点击删除数据集以删除数据集、表和所有数据。

  4. 删除数据集对话框中,通过输入数据集的名称 (bqml_tutorial) 来确认该删除命令,然后点击删除

删除项目

要删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤