限制 ARIMA_PLUS 時間序列模型的預測值

本教學課程說明如何使用限制,縮小 ARIMA_PLUS 時間序列模型傳回的預測結果範圍。在本教學課程中,您將使用相同資料建立兩個時間序列模型,一個模型會使用限制,另一個則不會。這樣一來,您就能比較模型傳回的結果,並瞭解指定限制所造成的差異。

在本教學課程中,您將使用 new_york.citibike_trips 資料訓練模型。這個資料集包含紐約市 Citi Bike 行程的相關資訊。

開始本教學課程之前,請先熟悉單一時間序列預測。完成根據 Google Analytics 資料進行單一時間序列預測教學課程,瞭解這個主題。

所需權限

  • 如要建立資料集,您必須具備 bigquery.datasets.create IAM 權限。

  • 如要建立模型,您必須具備下列權限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 如要執行推論,您必須具備下列權限:

    • bigquery.models.getData
    • bigquery.jobs.create

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

目標

在本教學課程中,您會使用下列項目:

費用

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

  • BigQuery
  • BigQuery ML

如要進一步瞭解 BigQuery 費用,請參閱「BigQuery 定價」頁面。

如要進一步瞭解 BigQuery ML 費用,請參閱「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. Enable the BigQuery API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

建立資料集

如要建立 BigQuery 資料集,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

  3. 在「Explorer」中展開專案,然後按一下「資料集」。

  4. 在「Datasets」(資料集) 頁面,按一下「Create dataset」(建立資料集)。

  5. 在「建立資料集」窗格中,執行下列操作:

    • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial。

    • 在「資料位置」部分,選取「US」。

    其餘預設設定則保持不變。

  6. 點選「建立資料集」。

bq

如要建立新的資料集,請使用 bq mk --dataset 指令。

  1. 建立名為 bqml_tutorial 的資料集,並將資料位置設為 US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. 確認資料集已建立:

    bq ls

API

使用定義的資料集資源呼叫 datasets.insert 方法:

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

試用這個範例前,請先按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定操作說明操作。詳情請參閱 BigQuery DataFrames 參考文件。

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

以圖表呈現要預測的時間序列

建立模型前,建議您先查看輸入時間序列。

SQL

在下列查詢中,FROM bigquery-public-data.new_york.citibike_trips 子句表示您要查詢 new_york 資料集中的 citibike_trips 資料表。

在 SELECT 陳述式中,查詢會使用 EXTRACT 函式,從 starttime 欄擷取日期資訊。查詢會使用 COUNT(*) 子句,取得每日 Citi Bike 行程總數。

#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.

BigQuery DataFrames

試用這個範例前,請先按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定操作說明操作。詳情請參閱 BigQuery DataFrames 參考文件。

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

在下列範例中,bigquery-public-data.new_york.citibike_trips 表示您正在查詢 new_york 資料集中的 citibike_trips 資料表。

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.new_york.citibike_trips")

features = bpd.DataFrame(
    {
        "num_trips": df.starttime,
        "date": df["starttime"].dt.date,
    }
)
num_trips = features.groupby(["date"]).count()

num_trips.plot.line()

結果大致如下: Result_visualization

建立時間序列模型

使用紐約市 Citi Bike 行程資料建立時間序列模型。

下列 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 模型中的超參數。演算法會擬合數十個候選模型,並選擇赤池訊息量準則 (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 的 Citi Bike 每日行程總數預測值為負數,這不具實用價值。改用有上限的模型,則可改善預測資料。

建立有上限的時間序列模型

使用紐約市 Citi Bike 行程資料,建立設有限制的時序模型。

下列 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
  3. 按一下「執行」。

    BQUI_chart。

  4. 使用 Google Cloud 控制台繪製時間序列資料圖表。在「查詢結果」窗格中,點選「圖表」分頁標籤:

    Result_visualization.

ARIMA PLUS 模型偵測到 start_station_id=79 的 Citi Bike 每日行程總數正在減少。未來的預測值會遵循這個趨勢,且預測時間越久,預測值就越小。圖表顯示,start_station_id=79 的 Citi Bike 每日行程總數預測值為正數,這更有用。設有限制的模型會偵測到 start_station_id=79 的 Citi Bike 每日行程總數減少,但仍會提供有意義的預測值。

如本教學課程所示,在類似此處所示的情境中 (例如預測股價或未來銷售量),forecast_limit_lower_bound 和 forecast_limit_upper_bound 選項可協助您取得更有意義的預測值。

刪除資料集

刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。

  1. 如有需要,請在Google Cloud 控制台開啟 BigQuery 頁面。

    前往「BigQuery」頁面

  2. 在導覽窗格中,按一下您建立的 bqml_tutorial 資料集。

  3. 按一下視窗右側的「刪除資料集」。這個動作將會刪除資料集、資料表,以及所有資料。

  4. 在「Delete dataset」(刪除資料集) 對話方塊中,輸入資料集名稱 (bqml_tutorial) 來確認刪除指令,然後點選「Delete」(刪除)。

刪除專案

如要刪除專案,請進行以下操作:

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

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

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

後續步驟