在 Cloud AI 平台上建構、訓練及部署 XGBoost 模型

1. 總覽

在本研究室中,您將逐步瞭解 GCP 上完整的機器學習工作流程。在 Cloud AI Platform Notebooks 環境中,您必須從 BigQuery 公開資料集擷取資料、建構並訓練 XGBoost 模型,然後將模型部署至 AI 平台以進行預測。

課程內容

學習重點:

  • 在 AI 平台筆記本中擷取及分析 BigQuery 資料集
  • 建構 XGBoost 模型
  • 將 XGBoost 模型部署至 AI Platform 並取得預測結果

在 Google Cloud 中執行這個研究室的總費用約為 $1 美元。

2. 設定環境

您需要已啟用計費功能的 Google Cloud Platform 專案,才能執行這個程式碼研究室。如要建立專案,請按照這裡的操作說明進行。

步驟 1:啟用 Cloud AI Platform Models API

前往 Cloud 控制台的 AI Platform 模型專區,然後按一下「啟用」(如果尚未啟用)。

d0d38662851c6af3.png

步驟 2:啟用 Compute Engine API

前往「Compute Engine」,並選取「啟用」 (如果尚未啟用)。建立筆記本執行個體時會用到。

步驟 3:建立 AI 平台筆記本執行個體

前往 Cloud 控制台的 AI 平台筆記本專區,然後按一下「新增執行個體」。接著,選取最新的 Python 執行個體類型:

a81c82876c6c16f9.png

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

步驟 4:安裝 XGBoost

開啟 JupyterLab 執行個體後,您需要新增 XGBoost 套件。

方法是在啟動器中選取「Terminal」:

28dcf2790ce77c96.png

然後執行下列指令,安裝 AI Platform 支援的最新版 XGBoost:

pip3 install xgboost==0.82

完成後,從啟動器開啟 Python 3 筆記本執行個體。現在可以開始使用筆記本了!

步驟 5:匯入 Python 套件

在筆記本的第一個儲存格中新增下列匯入項目,然後執行儲存格。按下頂端選單中的向右箭頭按鈕,或按下 Command 鍵,即可開啟模式:

import pandas as pd
import xgboost as xgb
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery

3. 探索 BigQuery 資料集

BigQuery 已公開讓您探索許多資料集。在這個研究室中,我們將使用出生率資料集。這項數據包含 40 年期間內,幾乎所有美國出生的相關資料,包括孩子的出生體重,以及嬰兒父母的人口統計資訊。我們會使用部分功能來預測嬰兒的出生體重。

步驟 1:將 BigQuery 資料下載至筆記本

我們會使用 BigQuery 適用的 Python 用戶端程式庫,將資料下載到 Pandas DataFrame。原始資料集有 21 GB,含有 1.23 億列。為求簡單,我們只會使用資料集中的 10,000 列資料。

建構查詢,並使用下列程式碼預覽產生的 DataFrame。我們從原始資料集取得 4 個特徵,以及嬰兒體重 (我們的模型預測的事物)。資料集倒數多年後,我們只會使用 2000 年以後的資料:

query="""
SELECT
  weight_pounds,
  is_male,
  mother_age,
  plurality,
  gestation_weeks
FROM
  publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()

如要取得資料集中的數值特徵摘要,請執行以下指令:

df.describe()

這是指數字欄的平均值、標準差、最小值和其他指標。最後,讓我們取得布林值資料欄的部分資料,指出嬰兒的性別。這一切都要歸功於 Pandas'value_counts 方法:

df['is_male'].value_counts()

看來資料集的性別差異幾乎是 50/50。

4. 準備用於訓練的資料

在本節中,我們會將資料分割為訓練集和測試集,為模型訓練做好準備。

步驟 1:擷取標籤欄

首先,從資料集中捨棄空值的資料列並重組資料:

df = df.dropna()
df = shuffle(df, random_state=2)

接著,將標籤欄擷取到獨立的變數中,然後建立只包含我們的特徵的 DataFrame:

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])

現在如果您透過執行 data.head() 預覽資料集,應該會看到我們將用於訓練的四個特徵。

步驟 2:將類別特徵轉換為整數

由於 XGBoost 要求的所有資料都是數字,因此我們需要變更 is_male 資料欄中資料的表示方式,目前為「是」/「否」字串。方法很簡單,只要變更資料欄的類型即可:

data['is_male'] = data['is_male'].astype(int)

步驟 3:將資料拆分為訓練集和測試集

我們會使用筆記本開頭處匯入的 Scikit Learn 的 train_test_split 公用程式,將資料拆分為訓練集和測試集:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

您現在可以開始建構並訓練模型了!

5. 快速 XGBoost 入門

XGBoost 是機器學習架構,會使用決策樹狀圖梯度提升來建構預測模型。其運作方式是依據與樹狀結構中不同分葉節點相關聯的分數,將多個決策樹聚在一起。

下圖是多個模型的簡化示意圖,這是一個模型,用來評估某人是否喜歡特定的電腦遊戲 (資料來源為 XGBoost 說明文件):

fb061cd8c8f69999.png

為什麼這個模型採用 XGBoost?根據研究顯示,在圖片和文字等非結構化資料中,傳統類神經網路的執行效果最佳,但決策樹通常在本程式碼研究室會使用的貸款資料集等結構化資料上提供極佳的效率。

6. 建構、訓練及評估 XGBoost 模型

步驟 1:定義及訓練 XGBoost 模型

在 XGBoost 中建立模型十分簡單。我們會使用 XGBRegressor 類別建立模型,只需要為特定工作傳遞正確的 objective 參數。這裡我們使用迴歸模型,因為我們要預測數值 (嬰兒體重)。如果改為對資料進行分類,以確定嬰兒體重是否超過或低於 6 磅,則我們會使用分類模型。

在本例中,我們將使用 reg:squarederror 做為模型的目標。

下列程式碼會建立 XGBoost 模型:

model = xgb.XGBRegressor(
    objective='reg:linear'
)

您可以使用一行程式碼來訓練模型,呼叫 fit() 方法,然後傳送訓練資料和標籤。

model.fit(x_train, y_train)

步驟 2:使用測試資料評估模型

我們現在可以透過 predict() 函式,使用訓練完成的模型,針對測試資料產生預測結果:

y_pred = model.predict(x_test)

我們來看看模型在測試集的前 20 個值上的成效。我們在下方顯示了預測的嬰兒體重,以及每個測試範例的實際嬰兒體重:

for i in range(20):
    print('Predicted weight: ', y_pred[i])
    print('Actual weight: ', y_test.iloc[i])
    print()

步驟 3:儲存模型

如要部署模型,請執行下列指令,將模型儲存至本機檔案:

model.save_model('model.bst')

7. 將模型部署至 Cloud AI Platform

我們的模型在本機運作,但如果能隨處 (而不只是這個筆記本) 進行預測,就會很棒。在這個步驟中,我們會將其部署至雲端。

步驟 1:為模型建立 Cloud Storage 值區

首先,定義一些在程式碼研究室的其他部分會用到的環境變數。請在下列值中填入您的 Google Cloud 專案名稱、您要建立的 Cloud Storage 值區名稱 (必須是全域不重複的名稱),以及模型第一個版本的版本名稱:

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'baby_weight'

現在,我們已準備好建立 Storage 值區,用來儲存 XGBoost 模型檔案。部署時,我們會將 Cloud AI Platform 指向這個檔案。

在筆記本中執行這個 gsutil 指令來建立值區:

!gsutil mb $MODEL_BUCKET

步驟 2:將模型檔案複製到 Cloud Storage

接著,我們會將 XGBoost 儲存的模型檔案複製到 Cloud Storage。執行下列 gsutil 指令:

!gsutil cp ./model.bst $MODEL_BUCKET

請前往 Cloud 控制台中的儲存空間瀏覽器,確認檔案已複製完成:

31e2567fa0117214.png

步驟 3:建立及部署模型

下列 ai-platform gcloud 指令會在專案中建立新模型。我們會命名為 xgb_mortgage

!gcloud ai-platform models create $MODEL_NAME

接下來要部署模型。只要使用以下 gcloud 指令即可:

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT

執行期間,請查看 AI Platform 控制台的模型部分。您應該會看到已在該處部署的新版本:

a431661f9c3e6cb2.png

成功完成部署後,載入旋轉圖示的位置會顯示綠色勾號。部署作業需要 2 至 3 分鐘才能完成。

步驟 4:測試已部署的模型

如要確認您部署的模型是否正常運作,請透過 gcloud 進行測試,確認已部署的模型可正常運作。首先,請儲存內含兩個測試集範例的 JSON 檔案:

%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]

將下列 gcloud 指令的輸出內容儲存至變數,然後輸出模型,藉此測試模型:

prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)

輸出內容中應會顯示模型的預測結果。這兩個範例的實際嬰兒體重分別為 1.9 和 8.1 磅。

8. 清除

如要繼續使用這個筆記本,建議您在未使用時將其關閉。在 Cloud 控制台的「Notebooks」(筆記本) UI 中,依序選取筆記本和「Stop」(停止)

879147427150b6c7.png

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

使用 Cloud 控制台中的導覽選單前往「儲存空間」,然後刪除您為了儲存模型資產而建立的兩個值區。