使用 TimesFM 多变量模型预测单个时序

本教程介绍了如何将 AI.FORECAST 函数与 BigQuery ML 内置的 TimesFM 3.0 模型搭配使用,对单个时序执行多变量预测。通过纳入影响目标的其他变量,多元预测有助于提高预测准确性。

本教程演示了如何通过纳入历史交易价值(一种过去的协变量)以及日期是否为周末(一种未来的协变量)来预测伏特加和威士忌的销量。

目标

  • 准备一个用于多元预测的统一数据集。
  • 将 AI.FORECAST 函数与 TimesFM 3.0 模型搭配使用以生成预测。

费用

本教程使用 Google Cloud的可计费组件,包括以下组件:

  • BigQuery
  • BigQuery ML

如需了解详情,请参阅 BigQuery 价格和 BigQuery ML 价格。

准备工作

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 启用 BigQuery API(如果尚未启用)。

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获取此权限。 了解如何授予角色。

    启用 API

    对于新项目,BigQuery API 会自动启用。

所需的角色

如需获得完成本教程中的任务所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

这些预定义角色包含完成本教程中的任务所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需完成本教程中的任务,您需要拥有以下权限:

  • 创建数据集: bigquery.datasets.create
  • 创建模型:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 运行推理:
    • bigquery.models.getData
    • bigquery.jobs.create

您也可以使用自定义角色或其他预定义角色来获取这些权限。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介。

准备输入数据

与其他可能需要为历史协变量和未来协变量分别提供单独表的多元模型不同,使用 TimesFM 3.0 的 AI.FORECAST 函数只需要一个输入表或查询。

在运行预测之前,请确保您的数据符合以下要求:

  • 历史行:包含时间戳、目标变量和过去协变量的非 null 值。
  • 未来行:仅包含时间戳和未来协变量的非 null 值。 对于这些未来行,目标列和过去的协变量列必须设置为 NULL。

输入表必须包含具有以下数据的列:

  • 销售日期。
  • 相应日期售出的伏特加酒瓶数。这是目标列。
  • 相应日期售出的威士忌瓶数。这是目标列。
  • 相应日期的平均交易金额。这是预测中使用的过往协变量。
  • 相应日期是否为周末。这是预测中使用的未来协变量。

预测单个多元时序

以下查询预测了 2023 年 7 月前两周 2633 号商店售出的伏特加和威士忌瓶数。它使用平均交易价值作为过去协变量,并使用日期是否为周末作为未来协变量。

请按照以下步骤使用 TimesFM 3.0 模型预测数据:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

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

    WITH historical_sales AS (
      SELECT
        date AS sales_date,
        store_number,
        SUM(CASE WHEN category_name LIKE '%VODKA%' THEN bottles_sold ELSE 0 END) AS vodka_bottles,
        SUM(CASE WHEN category_name LIKE '%WHISKEY%' THEN bottles_sold ELSE 0 END) AS whiskey_bottles,
        AVG(sale_dollars) AS avg_transaction_value,                          -- Past covariate
        IF(EXTRACT(DAYOFWEEK FROM date) IN (1, 7), 1.0, 0.0) AS is_weekend   -- Future covariate
      FROM `bigquery-public-data.iowa_liquor_sales.sales`
      WHERE date BETWEEN '2023-01-01' AND '2023-06-30'
        AND store_number = '2633'
      GROUP BY sales_date, store_number
    ),
    future_horizon AS (
      SELECT
        future_date AS sales_date,
        store_number,
        CAST(NULL AS INT64) AS vodka_bottles,
        CAST(NULL AS INT64) AS whiskey_bottles,
        CAST(NULL AS FLOAT64) AS avg_transaction_value,
        IF(EXTRACT(DAYOFWEEK FROM future_date) IN (1, 7), 1.0, 0.0) AS is_weekend
      FROM UNNEST(GENERATE_DATE_ARRAY('2023-07-01', '2023-07-14')) AS future_date
      CROSS JOIN (SELECT DISTINCT store_number FROM historical_sales)
    ),
    combined_sales AS (
      SELECT * FROM historical_sales
      UNION ALL
      SELECT * FROM future_horizon
    )
    SELECT
      FORMAT_DATE('%Y-%m-%d', sales_date) AS sales_date,
      vodka_bottles.value AS vodka_value,
      vodka_bottles.prediction_interval_lower_bound AS vodka_lower,
      vodka_bottles.prediction_interval_upper_bound AS vodka_upper,
      whiskey_bottles.value AS whiskey_value,
      whiskey_bottles.prediction_interval_lower_bound AS whiskey_lower,
      whiskey_bottles.prediction_interval_upper_bound AS whiskey_upper
    FROM AI.FORECAST(
      TABLE combined_sales,
      model => 'TimesFM 3.0',
      timestamp_col => 'sales_date',
      target_cols => ['vodka_bottles', 'whiskey_bottles'],
      past_covariate_cols => ['avg_transaction_value'],
      future_covariate_cols => ['is_weekend'],
      id_cols => ['store_number'],
      horizon => 14,
      confidence_level => 0.90
    );
    

输出类似于以下内容,为清晰起见,对值进行了四舍五入:

+------------+-------------+-------------+-------------+---------------+---------------+---------------+
| sales_date | vodka_value | vodka_lower | vodka_upper | whiskey_value | whiskey_lower | whiskey_upper |
+------------+-------------+-------------+-------------+---------------+---------------+---------------+
| 2023-07-01 | 408         | -334        | 1977        | 21            | -34           | 113           |
| 2023-07-02 | 806         | -281        | 2992        | 29            | -23           | 149           |
| ...        | ...         | ...         | ...         | ...           | ...           | ...           |
+------------+-------------+-------------+-------------+---------------+---------------+---------------+

清理

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

删除项目

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

    转到“管理资源”

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

后续步骤