1. 總覽
在本實驗室中,您將逐步瞭解 GCP 上的完整機器學習工作流程。您將在 Cloud AI Platform Notebooks 環境中,從 BigQuery 公開資料集擷取資料、建構及訓練 XGBoost 模型,然後將模型部署到 AI Platform 進行預測。
課程內容
內容如下:
- 在 AI Platform Notebooks 中擷取及分析 BigQuery 資料集
- 建構 XGBoost 模型
- 將 XGBoost 模型部署至 AI Platform 並取得預測結果
在 Google Cloud 上執行這個實驗室的總費用約為 $1 美元。
2. 設定環境
您必須擁有已啟用計費功能的 Google Cloud Platform 專案,才能執行這項程式碼研究室。如要建立專案,請按照這裡的操作說明進行。
步驟 1:啟用 Cloud AI Platform Models API
前往 Cloud Console 的 AI Platform Models 區段,如果尚未啟用,請點選「啟用」。

步驟 2:啟用 Compute Engine API
前往「Compute Engine」,然後選取「啟用」 (如果尚未啟用)。您需要這項資訊才能建立筆記本執行個體。
步驟 3:建立 AI Platform Notebooks 執行個體
前往 Cloud Console 的 AI Platform Notebooks 專區,然後點選「建立執行個體」。然後選取最新的 Python 執行個體類型:

使用預設選項,然後按一下「建立」。建立執行個體後,請選取「Open JupyterLab」:
步驟 4:安裝 XGBoost
開啟 JupyterLab 執行個體後,您需要新增 XGBoost 套件。
如要這麼做,請從啟動器選取「終端機」:

然後執行下列指令,安裝 AI Platform 支援的最新版 XGBoost:
pip3 install xgboost==0.82
完成後,請從啟動器開啟 Python 3 Notebook 執行個體。您可以在筆記本中開始使用!
步驟 5:匯入 Python 套件
在筆記本的第一個儲存格中,新增下列匯入內容並執行儲存格。如要執行,請按下頂端選單中的向右箭頭按鈕,或按下 Command-Enter 鍵:
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 資料欄中資料的表示方式,目前是 True / False 字串。只要變更該資料欄的類型,即可達成這個目的:
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 文件):

為什麼要使用 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 bucket
首先,請定義一些環境變數,我們會在程式碼研究室的其餘部分使用這些變數。請在下方填入 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'
現在我們準備建立儲存值區,以儲存 XGBoost 模型檔案。部署時,我們會將 Cloud AI Platform 指向這個檔案。
在筆記本中執行下列 gsutil 指令,建立 bucket:
!gsutil mb $MODEL_BUCKET
步驟 2:將模型檔案複製到 Cloud Storage
接著,我們會將 XGBoost 儲存的模型檔案複製到 Cloud Storage。執行下列 gsutil 指令:
!gsutil cp ./model.bst $MODEL_BUCKET
前往 Cloud 控制台中的儲存空間瀏覽器,確認檔案已複製完成:

步驟 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 控制台的模型部分。您應該會看到新版本正在部署:

部署作業完成後,載入旋轉圖示會變成綠色勾號。部署作業應會在 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 使用者介面中,選取筆記本,然後選取「停止」:

如要刪除在本實驗室中建立的所有資源,請直接刪除筆記本執行個體,而不是停止執行個體。
使用 Cloud 控制台的導覽選單瀏覽至「儲存空間」,然後刪除您建立的兩個 bucket,以儲存模型資產。