使用 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. 設定 Notebook 環境

簡要介紹完資料後,現在來設定模型開發環境。

步驟 1:啟用 API

BigQuery 連接器使用 BigQuery Storage API。在控制台中搜尋 BigQuery Storage API,如果目前已停用,請啟用該 API。

9895a2fd3cdf8f8c.png

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

前往 Cloud Console 的 Vertex AI Workbench 區段,然後按一下「New Notebook」(新增筆記本)。然後選取最新版的「TensorFlow Enterprise 2.x」筆記本類型,且「不加入任何 GPU」

4e7b73eabf2bc061.png

使用預設選項,然後按一下「建立」。建立執行個體後,請選取「Open JupyterLab」

18c9f3c462aafaee.png

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

58523671a252b95a.png

步驟 3:下載實驗室教材

在 JupyterLab 介面中建立新的終端機視窗:依序點選「File」>「New」>「Terminal」。

然後使用下列指令複製來源素材:

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

清除筆記本中的所有儲存格 (依序點選「Edit」>「Clear All Outputs」),在其中一個前幾個儲存格中變更區域、專案和 bucket 設定,然後逐一執行儲存格。

步驟 3

在本節中,您已匯入資料,並以視覺化方式呈現各種維度。現在您已對資料有更清楚的瞭解,可以準備使用這些資料進行機器學習建模。

55839e7bc0427915.png

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

本節內容:

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

步驟 1

我們將使用剛才探索的 CSV 檔案中的原始資料,建立 BigQuery 資料表。首先,請從筆記本環境下載 CSV 檔。

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

步驟 2

接著,我們會將這項資料上傳至 BigQuery 資料表。

在控制台中前往 BigQuery (搜尋或使用這個連結):

649e7ab1c44b75e8.png

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

281b97020cd52f29.png

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

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

ad47810d44cfb289.png

選取下列任一資料表建立選項:

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

213e4177e9e79544.png

步驟 3

現在要建立模型了!BigQuery ML 提供類似 SQL 的簡單語法,可讓您建立各種模型類型。

在查詢編輯器中,貼上/輸入這項查詢,並視需要將兩處的「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 (即 赤池資訊量準則) 遞增排序,這項指標可相對指出模型品質。因此,第一列中的模型 AIC 最低,可視為最佳模型。

您會看到 ARIMA 模型的 p、d 和 q 參數,以及模型中發現的季節性。在本例中,最佳模型包含每週和每年的季節性因素。

5b5b1e129c70a340.png

步驟 5

現在,我們可以使用 ML.FORECAST 函式預測結果了!

貼上/輸入下列內容 (如有需要,請將 demo 換成其他名稱):

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

這項查詢只會使用我們的模型預測 7 天後的結果!我們可以看到下方傳回的七個資料列。預測結果也會包含信賴區間 (預設為 0.95,但可在查詢中設定)。

b8a7f22657dc2d27.png

做得好!我們只用了幾項 BQML 查詢,就建立了一個時間序列模型。

6. 建立自訂預測模型

本節內容:

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

步驟 1

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

步驟 2

清除筆記本中的所有儲存格 (依序點選「Edit」>「Clear All Outputs」),在其中一個前幾個儲存格中變更區域、專案和 bucket 設定,然後逐一執行儲存格。

步驟 3

在筆記本中,您已探索多種模型架構:LSTM、CNN 和統計模型。您可以查看每個模型在測試資料上的效能:

a528df58f4e6d372.png

7. 在雲端訓練及預測

本節內容:

  • 準備要用於雲端訓練的資料和模型
  • 使用 AI Platform Training 訓練模型並監控工作進度
  • 使用 AI Platform Prediction 透過模型進行預測

步驟 1

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

步驟 2

清除筆記本中的所有儲存格 (依序點選「Edit」>「Clear All Outputs」),在其中一個前幾個儲存格中變更區域、專案和 bucket 設定,然後逐一執行儲存格。

步驟 3

在上一節中,我們在 Workbench 筆記本中訓練模型並進行預測。在本節中,我們示範如何從筆記本使用 Vertex AI Python SDK,透過 Vertex AI 服務進行訓練和部署。

a3f6b5dc895a24fb.png

8. 挑戰

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

我們不會提供詳細說明,只會給予一些提示 (如有需要!)。

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

步驟 1

首先,請瞭解資料集。

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

如要進一步瞭解資料,請試用資料集說明中列出的幾個查詢範例:

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

在 BigQuery UI 中選取「建立查詢」,即可查看如何存取資料集。請注意,選取陳述式是從 bigquery-public-data.new_york_311.311_service_requests 查詢。

步驟 2

我們已準備好開始。在本節中,請修改「Explore and Visualize」筆記本,以便使用這項資料。

提示

  • 複製 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 使用者介面中,選取筆記本,然後選取「停止」

57213ef2edad9257.png

如要刪除在本實驗室中建立的所有資源,請刪除工作台筆記本,而非停止執行。

使用 Cloud 控制台的導覽選單,瀏覽至「儲存空間」,然後刪除您建立的兩個 bucket,以儲存模型資產 (警告:只有在您專為本實驗室建立新 bucket 時,才執行這項操作)。