使用 Vertex AI 和 BigQuery ML 進行時間序列預測

1. 總覽

在本研究室中,您將瞭解如何使用 TensorFlow 建構時間序列預測模型,並瞭解如何使用 Vertex AI 部署這些模型。

課程內容

學習重點:

  • 轉換資料,以便用於機器學習模型
  • 以圖表呈現及探索資料
  • 使用 BigQuery ML 建立時間序列預測模型
  • 使用 LSTM 和 CNN 架構,使用 TensorFlow 建構時間序列預測模型

2. 時間序列預測簡介

本程式碼研究室的重點,在於如何使用 Google Cloud Platform 套用時間序列預測技術。這並非一般時間序列預測課程,但概念的快速導覽可能會對使用者有所幫助。

時間序列資料

首先,什麼是時間序列?而是會在固定時間間隔內記錄資料的資料集。時間序列資料集同時含有時間,以及至少一個依賴時間的變數。

85af6a1ff05c69f2.png

元件

時間序列可拆解為元件:

  • 趨勢:在可預測的模式中向上或向下移動
  • 季節性:在特定期間重複,例如一天、週、月、季等。
  • 隨機:剩餘波動

季節性因素可能有多個因素。舉例來說,客服中心在一週或特定月份的通話量都可能呈現模式。除了時間以外,殘存的可能還有其他變數可以解釋。

6e8d45bbbbc388ec.png

電台

為獲得最佳預測結果,時間序列資料應設為「持續性」,其中平均值和變異數等統計資料屬性在一段時間後會保持不變。不同技術 (如差異與分解) 可應用到原始資料,使資料更加不穩定。

舉例來說,下圖所示的二氧化碳濃度呈現每年重複的趨勢,且呈現上升趨勢。( 資料來源)

ab82857e2e7d0b89.png

移除線性趨勢後,由於資料現在擁有固定的平均值,因此更適合用於預測。

c936381ab1095528.png

將時間序列資料用於機器學習

如要在機器學習問題中使用時間序列資料,則需要轉換這些資料,以便使用先前的值預測未來的值。下表示範瞭如何建立延遲變數以協助預測目標。

d667a941dbd470f5.png

瞭解一些基本概念後,接著就來探索資料和預測吧!

3. 設定筆記本環境

既然我們已簡單介紹一下資料,接著就來設定模型開發環境。

步驟 1:啟用 API

BigQuery 連接器會使用 BigQuery Storage API。在控制台中搜尋 BigQuery Storage API,並啟用這個 API (如果目前已停用)。

9895a2fd3cdf8f8c.png

步驟 2:建立 Vertex AI Workbench 筆記本

前往 Cloud 控制台的 Vertex AI Workbench 部分,然後按一下「新增筆記本」。接著,選取最新的「TensorFlow 企業版 2.x」筆記本類型,但「不含 GPU」

4e7b73eabf2bc061.png

使用預設選項,然後點選「建立」。執行個體建立完成後,請選取「Open JupyterLab」

18c9f3c462aafaee.png

接著,從 JupyterLab 建立 Python 3 筆記本:

58523671a252b95a.png

步驟 3:下載研究室教材

透過 JupyterLab 介面建立新的終端機視窗:File ->新功能 ->。

接著使用以下指令複製來源內容:

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. 探索資料並以圖表呈現

在本節中,您將進行以下作業:

  • 建立查詢,將資料歸入時間序列
  • 填入缺少的值
  • 以視覺化方式呈現資料
  • 將時間序列分解為趨勢和季節性要素

步驟 1

在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 並開啟 01-explore.ipynb

步驟 2

清除筆記本中的所有儲存格 (依序點選「編輯」>「清除所有輸出內容」),在前幾個儲存格中變更區域、專案和值區設定,然後逐一執行儲存格。

步驟 3

您已在本節中匯入資料,並以各種維度呈現資料。對資料有更清楚的瞭解後,即可開始使用這項資料進行機器學習模型模擬。

55839e7bc0427915.png

5. 使用 BigQuery 時間序列預測功能建立模型

在本節中,您將進行以下作業:

  • 將時間序列輸入資料匯入 BigQuery 資料表
  • 使用 BQML 語法建立時間序列模型
  • 瞭解如何評估模型參數和準確率
  • 使用模型預測

步驟 1

接下來,我們要使用剛剛探索的 CSV 檔案建立 BigQuery 資料表。首先,從筆記本環境下載 CSV。

training-data-analyst/courses/ai-for-time-series/notebooks/data 目錄中,以滑鼠右鍵按一下 cta_ridership.csv,然後下載至您的本機環境。

步驟 2

接著,我們會將這些資料上傳到 BigQuery 資料表。

透過搜尋或使用這個連結,前往控制台中的 BigQuery:

649e7ab1c44b75e8.png

您可將資料表新增至新的或現有資料集,並將相關資料表分組。如果尚未建立資料集,可以按一下左下角的專案,然後選取右下角的「Create Dataset」(建立資料集)

281b97020cd52f29.png

請選擇您選擇的名稱 (例如 demo),接受預設值,然後繼續。

選取該資料集後,選取右下角的「Create Table」建立新資料表。

ad47810d44cfb289.png

選取資料表建立選項:

  • 使用下列資料建立資料表:上傳
  • 選取檔案:cta_ridership.csv
  • 資料表名稱:cta_ridership
  • 結構定義:勾選方塊來自動偵測「結構定義和輸入參數」

213e4177e9e79544.png

步驟 3

現在,讓我們來建立模型!BigQuery ML 採用與 SQL 類似的簡單語法,可讓您建立多種模型類型。

在查詢編輯器中貼上/輸入這項查詢。如有需要,在 2 個位置以資料集名稱取代「demo」

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

現在我們來逐一瞭解語法的重要元素:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

這個陳述式會建立模型。此陳述式有多個變體,例如:CREATE MODEL,但我們選擇在這裡取代名稱相同的現有模型。

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

這裡會定義模型選項,第一個選項是模型類型。選取 ARIMA 會建立時間序列預測模型。

TIME_SERIES_TIMESTAMP_COL=‘service_date'

含有日期/時間資訊的資料欄

TIME_SERIES_DATA_COL=‘total_rides'

資料欄

HOLIDAY_REGION=‘us'

這個選用參數讓我們能夠將假日納入模型中。由於先前步驟的資料探索顯示,乘客的節慶季節較低,且這些資料來自美國伊利諾州芝加哥,因此我們將美國的節日納入這個模型中。

AS SELECT ... FROM ...

這個部分會選取要用來訓練模型的輸入資料。

您還可以在查詢中加入其他許多選項,例如如果您有多個時間序列,請指定資料欄,或選擇要自動探索 ARIMA 模型參數。詳情請參閱時間序列模型的 CREATE MODEL 陳述式語法參考資料。

步驟 4

接下來讓我們進一步瞭解模型。訓練完成後,請再次執行其他查詢,並視需要再次取代「demo」

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

現在來解讀結果吧。每一列都會列出候選模型,以及其參數和評估統計資料。系統會依 AIC 的遞增順序傳回結果或 Akaike 資訊條件,並提供模型品質的相對指標。因此,第一列的模型 AIC 最低,屬於最佳模型。

您可以看到 ARIMA 模型的 p、d 和 q 參數,以及模型中發現的季節性。在本例中,熱門模式會同時納入每週和每年的季節性變化。

5b5b1e129c70a340.png

步驟 5

現在可以使用 ML.FORECAST 函式進行預測了!

在下方貼上/輸入以下內容 (視需要替換示範):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

這項查詢只是運用我們的模型預測過去 7 天的時間!我們可以看到下方傳回的七列。預測結果也包含信賴區間,預設值為 0.95,但可在查詢中設定。

b8a7f22657dc2d27.png

好極了:我們建立了一個時間序列模型,而且只使用幾個 BQML 查詢。

6. 建立自訂預測模型

在本節中,您將進行以下作業:

  • 移除資料中的離群值
  • 執行多步驟預測
  • 在時間序列模型中加入額外特徵
  • 瞭解用於時間序列預測的類神經網路架構:LSTM 和 CNN
  • 瞭解統計模型,包括 Holt-Winters 指數平滑
  • Ensemble 模型

步驟 1

在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 並開啟 02-model.ipynb

步驟 2

清除筆記本中的所有儲存格 (依序點選「編輯」>「清除所有輸出內容」),在前幾個儲存格中變更區域、專案和值區設定,然後逐一執行儲存格。

步驟 3

在筆記本中,您已瞭解多個模型架構:LSTM、CNN 和統計模型。您可以針對每個模型,根據測試資料查看模型成效:

a528df58f4e6d372.png

7. 在雲端中進行訓練和預測

在本節中,您將進行以下作業:

  • 準備在雲端中訓練的資料和模型
  • 透過 AI 平台訓練訓練模型,並監控工作進度
  • 搭配 AI 平台預測使用模型進行預測

步驟 1

在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 並開啟 03-cloud-training.ipynb

步驟 2

清除筆記本中的所有儲存格 (依序點選「編輯」>「清除所有輸出內容」),在前幾個儲存格中變更區域、專案和值區設定,然後逐一執行儲存格。

步驟 3

在上一節中,我們訓練了模型並進行預測,這些模型全都在 Workbench 筆記本中。在本節中,我們將說明如何從筆記本使用 Vertex AI 適用的 Python SDK,以使用 Vertex AI 服務進行訓練和部署。

a3f6b5dc895a24fb.png

8. 挑戰

在本節中,您將嘗試將所學概念應用到新的資料集!

我們不會提供詳細操作說明,只有您可以獲得一些提示。

目標是預測來自紐約市的 311 項服務要求。這類非緊急要求包括噪音申訴、路燈問題等

步驟 1

首先來瞭解資料集

首先,請存取 City of New York 311 Service Request 資料集。

如要進一步瞭解資料,請嘗試參考資料集說明中列出的幾個範例查詢,方法如下:

  • 在 311 服務要求中,與冰淇淋車有關的要求有多少個?
  • 哪些天接到與派對有關的 311 服務要求最多?

在 BigQuery UI 中,選取「Create Query」(建立查詢),瞭解如何存取資料集。請注意,Select 陳述式是從 bigquery-public-data.new_york_311.311_service_requests 查詢。

步驟 2

我們準備好大顯身手了。在本節中,請修改「探索並視覺化」筆記本,以便處理這項資料。

提示

  • 複製 01-explore.ipynb 筆記本,即可開始使用。
  • 如要探索資料,請嘗試以下查詢:
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • 如要按照月份取得事件數量,請使用這個查詢:
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • 更新常數區段中的資料欄變數。在上述查詢中,目標資料欄為 y,日期欄為 ds。沒有其他功能。
  • 建議您變更要在下一個研究室匯出資料的檔案名稱。
  • 使用以下方式匯出資料:df.to_csv(YOUR-EXPORT-FILENAME, index=False)

步驟 3

現在,我們要使用每月資料來建立時間序列模型。

提示:

  • 複製 02-model.ipynb 筆記本,即可開始使用。
  • 更新資料集參數:
  • 請更新 target_colts_col 參數,以符合新的資料集。
  • 更新模型參數:
  • 每月頻率 (開始月份代碼為「MS」)
  • 輸入步驟:12 (回溯期為 12 個月)
  • 輸出步驟:3 (預測未來 3 個月)
  • 季別:12 (季節性為 12 個月)
  • 如果您在先前的筆記本中變更了輸入檔案名稱,請變更檔案名稱。
  • 如果在月中執行查詢,最後一個月的每月總計會低於預期。因此,為配合本研究室的學習目標,我們先使用 df = df[:-1] 移除資料集中的最後一個月份:
  • 資料中似乎沒有任何明顯的離群值,因此請略過這些儲存格,或是為這些儲存格加上註解。
  • 調整這個新模型的 LSTM 單位、CNN 篩選器和核心大小。

9. 清除

如要繼續使用這個筆記本,建議您在未使用時將其關閉。在 Cloud 控制台的 Workbench 使用者介面中,選取筆記本,然後選取「Stop」

57213ef2edad9257.png

如要刪除在本研究室中建立的所有資源,只要刪除工作台筆記本即可,不必停止資源。

透過 Cloud 控制台中的導覽選單前往「儲存空間」,然後刪除您為了儲存模型資產而建立的兩個值區 (警告:只有在您專為本研究室建立新值區的情況下,才需要執行這項操作)。