使用 ARIMA_PLUS 單變數模型預測分層時間序列

本教學課程將說明如何使用 ARIMA_PLUS 單變數時間序列模型預測分層時間序列。這項功能會根據指定欄的歷史值,預測該欄的未來值,並針對一或多個感興趣的維度,計算該欄的匯總值。

系統會針對每個時間點,以及一或多個指定感興趣維度的欄中的每個值,計算預測值。舉例來說,如果您想預測每日交通事故,並指定包含狀態資料的維度欄,預測資料就會包含狀態 A 的每日值,接著是狀態 B 的每日值,依此類推。如果您想預測每日交通事故,以及包含州和城市資料的指定維度欄,預測資料就會包含州 A 和城市 A 的每日值,接著是州 A 和城市 B 的每日值,依此類推。在階層式時間序列模型中,階層式對照可用於匯總並對每個子項時間序列與其父項進行對照。舉例來說,州 A 中所有城市的預估值總和必須等於州 A 的預估值。

在本教學課程中,您會針對相同資料建立兩個時間序列模型,一個使用分層預測,另一個則不使用。這樣一來,您就能比較模型傳回的結果。

本教學課程使用公開 bigquery-public-data.iowa_liquor.sales.sales 資料表的資料。這份表格包含使用愛荷華州公開酒類銷售資料,針對不同商店內超過 100 萬種酒類產品的資訊。

在閱讀本教學課程之前,強烈建議您先參閱「使用單變量模型預測多個時間序列」。

所需權限

  • 如要建立資料集,您必須具備 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 新專案會自動啟用 BigQuery。如要在現有的專案中啟用 BigQuery,請前往

    Enable the BigQuery API.

    Enable the API

  7. 建立資料集

    建立 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)

    建立時間序列模型

    使用愛荷華州酒類銷售資料建立時間序列模型。

    下列 GoogleSQL 查詢會建立模型,預測 2015 年在 Polk、Linn 和 Scott 縣銷售的每日瓶數總數。

    在以下查詢中,OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句表示您要建立以 ARIMA 為基礎的時間序列模型。您可以使用 CREATE MODEL 陳述式的 TIME_SERIES_ID 選項,在輸入資料中指定一或多個要取得預測資料的資料欄。CREATE MODEL 陳述式的 auto_arima_max_order 選項會控制 auto.ARIMA 演算法中超參數調整的搜尋空間。CREATE MODEL 陳述式的 decompose_time_series 選項預設為 TRUE,因此在下一個步驟評估模型時,系統會傳回時間序列資料的相關資訊。

    OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句表示您正在建立以 ARIMA 為基礎的時間序列模型。根據預設,auto_arima=TRUE,因此 auto.ARIMA 演算法會自動調整 ARIMA_PLUS 模型中的超參數。演算法會套用數十個候選模型,並選擇最佳模型,也就是赤池訊息量準則 (AIC) 最低的模型。如果時間序列中含有美國節日模式,將 holiday_region 選項設為 US,即可更準確地模擬這些美國節日時間點。

    請按照下列步驟建立模型:

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

      前往 BigQuery

    2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

      CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast`
        OPTIONS (
          MODEL_TYPE = 'ARIMA_PLUS',
          TIME_SERIES_TIMESTAMP_COL = 'date',
          TIME_SERIES_DATA_COL = 'total_bottles_sold',
          TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
          HOLIDAY_REGION = 'US')
      AS
      SELECT
        store_number,
        zip_code,
        city,
        county,
        date,
        SUM(bottles_sold) AS total_bottles_sold
      FROM
        `bigquery-public-data.iowa_liquor_sales.sales`
      WHERE
        date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
        AND county IN ('POLK', 'LINN', 'SCOTT')
      GROUP BY store_number, date, city, zip_code, county;

      查詢完成 (約需 37 秒) 後,liquor_forecast 模型就會顯示在「Explorer」窗格中。由於查詢使用 CREATE MODEL 陳述式建立模型,因此沒有查詢結果。

    使用模型預測資料

    使用 ML.FORECAST 函式預測未來的時間序列值。

    在以下查詢中,STRUCT(20 AS horizon, 0.8 AS confidence_level) 子句表示查詢會預測 20 個未來時間點,並產生信賴水準為 80% 的預測區間。

    如要使用模型預測資料,請按照下列步驟操作:

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

      前往 BigQuery

    2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

      SELECT *
      FROM
        ML.FORECAST(
          MODEL `bqml_tutorial.liquor_forecast`,
          STRUCT(20 AS horizon, 0.8 AS confidence_level))
      ORDER BY store_number, county, city, zip_code, forecast_timestamp;

      結果應如下所示:

      使用單變數模型的多個時間序列

      輸出結果會從第一個時間序列的預測資料開始,即 store_number=2190zip_code=50314city=DES MOINEScounty=POLK。捲動資料時,您會看到每個後續獨特時間序列的預測值。如要產生匯總不同維度 (例如特定縣市的預測資料) 的預測資料,您必須產生階層式預測資料。

    建立階層式時間序列模型

    使用愛荷華州酒類銷售資料,建立階層式時間序列預測。

    下列 GoogleSQL 查詢會建立模型,針對 2015 年 Polk、Linn 和 Scott 縣的每日售出瓶數產生階層式預測資料。

    在以下查詢中,CREATE MODEL 陳述式中的 HIERARCHICAL_TIME_SERIES_COLS 選項表示您要根據指定的一組資料欄建立階層式預測資料。每個資料欄都會匯總並匯總。舉例來說,從先前的查詢來看,這表示 store_number 欄值會匯總,以便顯示每個 countycityzip_code 值的預測資料。另外,zip_codestore_number 值也會匯總,以顯示每個 countycity 值的預測資料。資料欄順序很重要,因為它會定義階層結構。

    請按照下列步驟建立模型:

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

      前往 BigQuery

    2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

      CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_hierarchical`
        OPTIONS (
          MODEL_TYPE = 'ARIMA_PLUS',
          TIME_SERIES_TIMESTAMP_COL = 'date',
          TIME_SERIES_DATA_COL = 'total_bottles_sold',
          TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
          HIERARCHICAL_TIME_SERIES_COLS = ['zip_code', 'store_number'],
          HOLIDAY_REGION = 'US')
      AS
      SELECT
        store_number,
        zip_code,
        city,
        county,
        date,
        SUM(bottles_sold) AS total_bottles_sold
      FROM
        `bigquery-public-data.iowa_liquor_sales.sales`
      WHERE
        date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
        AND county IN ('POLK', 'LINN', 'SCOTT')
      GROUP BY store_number, date, city, zip_code, county;

      查詢作業大約需要 45 秒才能完成,完成後「bqml_tutorial.liquor_forecast_hierarchical」模型就會顯示在「探索器」窗格中。由於查詢是使用 CREATE MODEL 陳述式建立模型,因此沒有查詢結果。

    使用階層式模型預測資料

    使用 ML.FORECAST 函式,從模型中擷取階層式預測資料。

    如要使用模型預測資料,請按照下列步驟操作:

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

      前往 BigQuery

    2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

      SELECT
        *
      FROM
        ML.FORECAST(
          MODEL `bqml_tutorial.liquor_forecast_hierarchical`,
          STRUCT(30 AS horizon, 0.8 AS confidence_level))
      WHERE city = 'LECLAIRE'
      ORDER BY county, city, zip_code, store_number, forecast_timestamp;

      結果應如下所示:

      階層式時間序列範例。

      請注意,系統會如何顯示 LeClaire、store_number=NULLzip_code=NULLcity=LECLAIREcounty=SCOTT 等城市的匯總預測資料。查看其他資料列時,請留意其他子群組的預測值。舉例來說,下圖顯示郵遞區號 52753store_number=NULLzip_code=52753city=LECLAIREcounty=SCOTT 的匯總預測資料:

      階層式時間序列範例。

    清除所用資源

    如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

    • 您可以刪除建立的專案。
    • 或者您可以保留專案並刪除資料集。

    刪除資料集

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

    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.

    後續步驟