限制时序模型的预测值

本教程介绍了如何使用限制来缩小时序模型返回的预测结果的范围。在本教程中,您可基于相同的数据创建两个时序模型:一个为使用限制的模型,另一个为不使用限制的模型。这样,您就可以比较这些模型返回的结果,并了解指定限制之间的差异。

在本教程中,您将使用 new_york.citibike_trips 数据训练模型。此数据集包含有关纽约市花旗单车行程的信息。

在遵循本教程之前,您应该熟悉单个时序预测。如需简要了解本主题,请学完根据 Google Analytics 数据进行单个时序预测这一教程。

所需权限

  • 如需创建数据集,您需要拥有 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 简介

目标

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

  • CREATE MODEL 语句:用于创建一个时序模型。
  • ML.FORECAST 函数:用于预测每日总访问次数。

费用

本教程使用 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. Enable the BigQuery API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

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

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

      创建数据集页面。

Visualize the time series you want to forecast

在创建模型之前,最好先查看输入时序的情况。

在以下查询中,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. 点击运行。查询类似于以下内容。

    查询输出。

  4. 使用 Google Cloud 控制台为时序数据绘制图表。在查询结果窗格中,点击图表标签页。在图表配置窗格中,针对图表类型选择条形

    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',
    time_series_id_col = 'start_station_id')
AS
SELECT
  EXTRACT(DATE FROM starttime) AS date,
  COUNT(*) AS num_trips,
  start_station_id
FROM
  `bigquery-public-data`.new_york.citibike_trips
WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
GROUP BY date, start_station_id;

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,因此时序的历史记录和预测部分都保存在模型中。设置参数 time_series_id_col = 'start_station_id' 会使模型使用基于 start_station_id 的单个查询拟合并预测多个时序。您可以使用此信息,通过获取单独的时间序列组件(如季节性周期)来进一步了解如何预测时序。

运行 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',
      time_series_id_col = 'start_station_id')
    AS
    SELECT
    EXTRACT(DATE FROM starttime) AS date,
    COUNT(*) AS num_trips,
    start_station_id
    FROM
    `bigquery-public-data`.new_york.citibike_trips
    WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date, start_station_id;
  3. 点击运行

    查询大约需要 80 秒才能完成,之后您的模型 (nyc_citibike_arima_model) 会显示在探索器窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

预测时序并直观呈现结果

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

请按以下步骤进行此操作:

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

  2. 在查询编辑器中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
    forecast_timestamp AS forecast_timestamp,
    start_station_id AS start_station_id,
    history_value AS history_value,
    forecast_value AS forecast_value
    FROM
    (
      (
         SELECT
         DATE(forecast_timestamp) AS forecast_timestamp,
         NULL AS history_value,
         forecast_value AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         ML.FORECAST(
            MODEL bqml_tutorial.`nyc_citibike_arima_model`,
            STRUCT(
               365 AS horizon,
               0.9 AS confidence_level))
      )
      UNION ALL
      (
         SELECT
         DATE(date_name) AS forecast_timestamp,
         num_trips AS history_value,
         NULL AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         (
            SELECT
               EXTRACT(DATE FROM starttime) AS date_name,
               COUNT(*) AS num_trips,
               start_station_id AS start_station_id
            FROM
               `bigquery-public-data`.new_york.citibike_trips
            WHERE
               starttime > '2014-07-11'
               AND starttime < '2015-02-11'
            GROUP BY
               date_name, start_station_id
         )
      )
    )
    WHERE start_station_id = 79
    ORDER BY
    forecast_timestamp, start_station_id
  3. 点击运行。查询结果类似于以下内容:

    BQUI_chart。

  4. 使用 Google Cloud 控制台为时序数据绘制图表。在查询结果窗格中,点击图表标签页:

    Result_visualization。

该图表显示了 start_station_id=79 时花旗单车每日总行程数的预测值是负数,这没什么用。相反,使用具有限制的模型可以改进预测数据。

创建具有限制的时序模型

使用纽约市花旗单车行程数据创建一个具有限制的时序模型。

以下 GoogleSQL 查询会创建一个用于预测单车每日总行程数的模型。CREATE MODEL 语句将创建并训练一个名为 bqml_tutorial.nyc_citibike_arima_model_with_limits 的模型。 此模型与您之前创建的模型的主要区别在于增加了 forecast_limit_lower_bound=0 选项。此选项使模型仅根据 time_series_data_col 参数指定的列中的值(在本例中为 num_trips)预测大于 0 的值。

#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',
      time_series_id_col = 'start_station_id',
      forecast_limit_lower_bound = 0)
   AS
   SELECT
   EXTRACT(DATE FROM starttime) AS date,
   COUNT(*) AS num_trips,
   start_station_id
   FROM
   `bigquery-public-data`.new_york.citibike_trips
   WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
   GROUP BY date, start_station_id;

运行 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',
      time_series_id_col = 'start_station_id',
      forecast_limit_lower_bound = 0)
    AS
    SELECT
    EXTRACT(DATE FROM starttime) AS date,
    COUNT(*) AS num_trips,
    start_station_id
    FROM
    `bigquery-public-data`.new_york.citibike_trips
    WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date, start_station_id;
  3. 点击运行

    查询大约需要 100 秒才能完成,之后您的模型 (nyc_citibike_arima_model_with_limits) 会显示在探索器窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

使用具有限制的模型预测时序

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

  2. 在查询编辑器中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
    forecast_timestamp AS forecast_timestamp,
    start_station_id AS start_station_id,
    history_value AS history_value,
    forecast_value AS forecast_value
    FROM
    (
      (
         SELECT
         DATE(forecast_timestamp) AS forecast_timestamp,
         NULL AS history_value,
         forecast_value AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         ML.FORECAST(
            MODEL bqml_tutorial.`nyc_citibike_arima_model`,
            STRUCT(
               365 AS horizon,
               0.9 AS confidence_level))
      )
      UNION ALL
      (
         SELECT
         DATE(date_name) AS forecast_timestamp,
         num_trips AS history_value,
         NULL AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         (
            SELECT
               EXTRACT(DATE FROM starttime) AS date_name,
               COUNT(*) AS num_trips,
               start_station_id AS start_station_id
            FROM
               `bigquery-public-data`.new_york.citibike_trips
            WHERE
               starttime > '2014-07-11'
               AND starttime < '2015-02-11'
            GROUP BY
               date_name, start_station_id
         )
      )
    )
    WHERE start_station_id = 79
    ORDER BY
    forecast_timestamp, start_station_id
    ORDER BY
    forecast_timestamp,start_station_id
  3. 点击运行

    BQUI_chart。

  4. 使用 Google Cloud 控制台为时序数据绘制图表。在查询结果窗格中,点击图表标签页:

    Result_visualization。

ARIMA PLUS 模型检测到 start_station_id=79 时花旗单车行程的每日总数正在减少。未来预测值将遵循此趋势,并从中确定未来时间的预测值。该图表显示了 start_station_id=79 时花旗单车每日总行程数的预测值是正数,这更有用。该具有限制的模型检测到 start_station_id=79 时花旗单车行程的每日总数正在减少,但这仍提供了有意义的预测值。

如本教程所示,forecast_limit_lower_boundforecast_limit_upper_bound 选项可帮助您在与此处所示场景类似的场景中获得更有意义的预测值,例如在预测股票价格或未来销量时。

删除数据集

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

  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.

后续步骤