使用 TimesFM 多變數模型預測單一時間序列

本教學課程說明如何使用 BigQuery ML 內建的 AI.FORECAST 函式搭配 TimesFM 3.0 模型,對單一時間序列執行多元預測。多元變數預測功能會納入影響目標的其他變數,有助於提高預測準確率。

本教學課程將示範如何納入歷史交易價值 (過去的共變數) 和日期是否為週末 (未來的共變數),預測伏特加和威士忌的銷售量。

目標

  • 準備單一整合式資料集,用於多變數預測。
  • 使用 AI.FORECAST 函式和 TimesFM 3.0 模型產生預測結果。

費用

本教學課程使用的 Google Cloud計費元件包括:

  • BigQuery
  • BigQuery ML

詳情請參閱「BigQuery 定價」和「BigQuery ML 定價」一文。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 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

  3. Verify 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.

    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

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

  6. 如果尚未啟用 BigQuery API,請啟用。

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

    新專案會自動啟用 BigQuery API。

必要的角色

如要取得完成本教學課程中工作所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備完成本教學課程中工作所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要完成本教學課程中的工作,必須具備下列權限:

  • 建立資料集: bigquery.datasets.create
  • 建立模型:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 執行推論:
    • bigquery.models.getData
    • bigquery.jobs.create

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「IAM 簡介」。

準備輸入資料

其他多元模型可能需要分別使用資料表來儲存歷史和未來共變數,但 AI.FORECAST 函式搭配 TimesFM 3.0 時,只需要單一輸入資料表或查詢。

執行預測前,請確認資料符合下列規定:

  • 歷史資料列:包含時間戳記、目標和過去共變數的非空值。
  • 後續資料列:只包含時間戳記和未來共變數的非空值。 這些未來資料列的目標資料欄和過去的共變數資料欄必須設為 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 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

後續步驟