限制 `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. 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. Verify 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. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Enable the API

  8. 建立資料集

    建立 BigQuery 資料集來儲存機器學習模型。

    控制台

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

      前往 BigQuery 頁面

    2. 在「Explorer」窗格中,按一下專案名稱。

    3. 依序點按 「View actions」(查看動作) >「Create dataset」(建立資料集)

      「建立資料集」選單選項。

    4. 在「建立資料集」頁面中,執行下列操作:

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

      • 針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))

      • 其餘設定請保留預設狀態,然後按一下「Create dataset」(建立資料集)

    bq

    如要建立新的資料集,請使用 bq mk 指令搭配 --location 旗標。如需可能的完整參數清單,請參閱 bq mk --dataset 指令參考資料。

    1. 建立名為「bqml_tutorial」的資料集,並將資料位置設為「US」,以及說明設為「BigQuery ML tutorial dataset」:

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      這個指令採用 -d 捷徑,而不是使用 --dataset 旗標。如果您省略 -d--dataset,該指令預設會建立資料集。

    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) 會顯示在「Explorer」窗格中。由於查詢使用 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。

    圖表顯示,Citi Bike 每日總行程數的預測值為負數,這並無參考價值。start_station_id=79改用設有上限的模型,可提升預測資料的準確度。

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

    使用紐約市 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) 會顯示在「Explorer」窗格中。由於查詢使用 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 模型偵測到 Citi Bike 的每日總趟次數正在減少 (start_station_id=79)。未來的預測值會遵循這項趨勢,預測值會隨著時間推移而逐漸減少。圖表顯示,CitiBike 每日總行程數的預測值為正數,這更有參考價值。start_station_id=79設有限制的模型會偵測到 start_station_id=79 的 Citi Bike 每日總趟次數正在減少,但仍會提供有意義的預測值。

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

    刪除資料集

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

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

      前往 BigQuery 頁面

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

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

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

    刪除專案

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

    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.

    後續步驟