限制 `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. 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

  8. 建立資料集

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

    控制台

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

      前往「BigQuery」頁面

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

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

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

    4. 在「Create dataset」頁面上執行下列操作:

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

      • 在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」

      • 保留其餘預設設定,然後點選「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 快速入門:使用 BigQuery DataFrames,按照 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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。

    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 快速入門:使用 BigQuery DataFrames,按照 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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。

    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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。

    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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。

    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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。

    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) 有下降的趨勢。未來的預測值會遵循這項趨勢,且預測數字會隨著時間推移而變得較小。圖表顯示,在 start_station_id=79 為正數的情況下,紐約市自行車每日總趟數的預測值較實用。設有限制的模型會偵測 Citi Bike 單日總趟數 (start_station_id=79) 有下降趨勢,但仍會提供有意義的預測值。

    如本教學課程所示,在預測股價或未來銷售數字等類似情境中,您可以使用 forecast_limit_lower_boundforecast_limit_upper_bound 選項,取得更有意義的預測值。

    刪除資料集

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

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

      前往「BigQuery」頁面

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

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

    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.

    後續步驟