在 AI 平台筆記本上的原型設計模型

1. 總覽

本實驗室將逐步介紹 AI Platform Notebook 中的各種工具,協助您探索資料及製作機器學習模型的原型。

課程內容

學習重點:

  • 建立及自訂 AI 平台筆記本執行個體
  • 使用 Git 追蹤筆記本程式碼,直接整合至 AI 平台筆記本
  • 在筆記本中使用 What-If Tool

在 Google Cloud 上執行這個實驗室的總費用約為 $1 美元。如要瞭解 AI Platform Notebooks 的定價詳情,請參閱這篇文章

2. 建立 AI Platform Notebooks 執行個體

您必須擁有啟用計費功能的 Google Cloud Platform 專案,才能執行這個程式碼研究室。如要建立專案,請按照這篇文章中的操作說明進行。

步驟 2:啟用 Compute Engine API

前往「Compute Engine」,然後選取「啟用」(如果尚未啟用)。您需要這項資訊才能建立 Notebook 執行個體。

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

前往 Cloud Console 的 AI Platform Notebooks 專區,然後按一下「New Instance」。接著選取最新的「TensorFlow 2 企業版」執行個體類型,且不加入任何 GPU:

9f2bb4dec1ba4f4f.png

為執行個體命名或使用預設名稱。接著,我們將探討自訂選項。按一下「自訂」按鈕:

63be602ba45ca7c9.png

AI Platform Notebooks 提供多種自訂選項,包括執行個體部署所在的區域、映像檔類型、機器大小、GPU 數量等。我們會使用區域和環境的預設值。針對機器設定,我們會使用 n1-standard-8 機器:

27101d232f765a17.png

我們不會新增任何 GPU,並會使用預設的啟動磁碟、網路和權限。選取「Create」建立執行個體。這項作業需要幾分鐘才能完成。

建立完成後,Notebooks 使用者介面中的執行個體旁會顯示綠色勾號。選取「Open JupyterLab」,開啟執行個體並開始製作原型:

3598f414887ea9a8.png

開啟執行個體時,請建立名為 codelab 的新目錄。以下是本研究室中會用到的目錄:

c16a821546acd92.png

按兩下新建立的 codelab 目錄,然後從啟動器中選取 Python 3 筆記本:

4390b1614ae8eae4.png

將筆記本重新命名為 demo.ipynb,或輸入你想要的名稱。

步驟 4:匯入 Python 套件

在筆記本中建立新的儲存格,並匯入本程式碼研究室中會用到的程式庫:

import pandas as pd
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

import numpy as np
import json

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

3. 將 BigQuery 資料連結至 Notebook

Google Cloud 的大數據倉儲 BigQuery 已公開許多資料集供您探索。AI Platform Notebooks 支援直接整合 BigQuery,無須驗證。

在本實驗室中,我們將使用 natality 資料集。這份資料包含美國 40 年間幾乎所有出生記錄的資料,包括嬰兒的出生體重,以及嬰兒父母的人口統計資訊。我們會使用部分特徵來預測嬰兒的出生體重。

步驟 1:將 BigQuery 資料下載至 Notebook

我們將使用 BigQuery 的 Python 用戶端程式庫,將資料下載至 Pandas DataFrame。原始資料集為 21 GB,包含 123M 列。為簡化操作,我們只會使用資料集的 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%。

步驟 2:準備訓練資料集

我們已將資料集下載至 Notebook 做為 Pandas DataFrame,現在可以進行一些預處理,並將資料集分割為訓練集和測試集。

首先,我們要從資料集中移除空值資料列,並重新洗牌:

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

接著,將標籤欄位擷取至個別變數,並建立只含特徵的 DataFrame。由於 is_male 是布林值,我們會將其轉換為整數,讓模型的所有輸入值皆為數字:

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

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

4. 初始化 Git

AI Platform Notebooks 可直接整合 Git,讓您直接在筆記本環境中進行版本控管。這項功能可讓您直接在筆記本 UI 中提交程式碼,或透過 JupyterLab 提供的終端機提交程式碼。在本節中,我們會在筆記本中初始化 Git 存放區,並透過 UI 進行第一次提交。

步驟 1:初始化 Git 存放區

在 JupyterLab 的頂端選單列中,從程式碼研究室目錄中依序選取「Git」和「Init」

d9f1729358f18e58.png

當系統詢問您是否要將這個目錄設為 Git 存放區時,請選取「是」。接著選取左側欄的 Git 圖示,查看檔案和提交的狀態:

1648d6828f11a6db.png

步驟 2:進行首次修訂

在這個 UI 中,您可以將檔案新增至修訂版本、查看檔案差異 (我們稍後會說明),以及提交變更。首先,我們要提交剛才新增的筆記本檔案。

勾選 demo.ipynb 筆記檔案旁的方塊,將其納入提交作業 (您可以忽略 .ipynb_checkpoints/ 目錄)。在文字方塊中輸入提交訊息,然後按一下勾號圖示,即可提交變更:

fe7366522a3a268f.png

在系統提示時輸入您的姓名和電子郵件地址。接著返回「History」分頁,查看第一個提交內容:

d03567c3592afb77.png

請注意,由於本實驗室發布後可能會進行更新,因此螢幕截圖可能與您的 UI 不完全相符。

5. 建構及訓練 TensorFlow 模型

我們會使用下載到筆記本的 BigQuery 出生率資料集,建立可預測嬰兒體重的模型。在本實驗室中,我們將著重於筆記本工具,而非模型本身的準確度。

步驟 1:將資料分成訓練和測試集

我們會使用 Scikit Learn train_test_split 公用程式,在建立模型前分割資料:

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

我們現在可以開始建構 TensorFlow 模型了!

步驟 2:建構及訓練 TensorFlow 模型

我們將使用 tf.keras Sequential 模型 API 建構這個模型,這個 API 可讓我們將模型定義為一組層。建構模型所需的所有程式碼都在這裡:

model = Sequential([
    Dense(64, activation='relu', input_shape=(len(x_train.iloc[0]),)),
    Dense(32, activation='relu'),
    Dense(1)]
)

接著,我們會編譯模型,以便訓練模型。我們會在此選擇模型的最佳化器、損失函式,以及模型在訓練期間記錄的指標。由於這是迴歸模型 (預測數值),我們會使用均方誤差而非準確度做為指標:

model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.MeanSquaredError(),
              metrics=['mae', 'mse'])

您可以使用 Keras 的便利 model.summary() 函式,查看模型在各層的訓練參數形狀和數量。

我們現在可以訓練模型了。我們只需呼叫 fit() 方法,並傳遞訓練資料和標籤即可。我們會在此使用 validation_split 選用參數,保留部分訓練資料,以便在每個步驟中驗證模型。理想情況下,訓練和驗證損失都會下降。不過請注意,在本例中,我們著重於模組和 Notebook 工具,而非模組品質:

model.fit(x_train, y_train, epochs=10, validation_split=0.1)

步驟 3:針對測試範例產生預測結果

為了瞭解模型的效能,我們會針對測試資料集中的前 10 個範例產生一些測試預測結果。

num_examples = 10
predictions = model.predict(x_test[:num_examples])

接著,我們會重複執行模型的預測作業,並將結果與實際值進行比較:

for i in range(num_examples):
    print('Predicted val: ', predictions[i][0])
    print('Actual val: ',y_test.iloc[i])
    print()

步驟 4:使用 git diff 並提交變更

筆記本已完成一些變更,您可以試試筆記本 Git UI 中的 Git 差異功能。demo.ipynb 筆記本現在應位於 UI 中的「已變更」部分下方。將滑鼠游標懸停在檔案名稱上,然後按一下差異圖示:

a370facb3632fb32.png

這樣一來,您應該就能看到變更的差異,如下所示:

461c502bd3ab910e.png

這次我們會透過終端機的指令列提交變更。在 JupyterLab 頂端選單列的「Git」選單中,選取「在終端機中執行 Git 指令」。如果您在執行下列指令時開啟左側邊欄的 Git 分頁,就能在 Git 使用者介面中看到變更內容。

在新的終端機例項中執行以下指令,將筆記本檔案暫存以便提交:

git add demo.ipynb

然後執行下列指令來提交變更 (您可以使用任何提交訊息):

git commit -m "Build and train TF model"

接著,您應該會在記錄中看到最新的提交內容:

a4b44045e97cb7a7.png

6. 直接在 Notebook 中使用 What-If Tool

What-If Tool 是一款互動式視覺化介面,可協助您以圖表呈現資料集,並進一步瞭解機器學習模型的輸出內容。這是 Google PAIR 團隊開發的開放原始碼工具。雖然它可與任何類型的模型搭配使用,但也具備一些專為 Cloud AI Platform 打造的功能。

What-If Tool 已預先安裝在 Cloud AI Platform Notebooks 執行個體 (含 TensorFlow) 中。我們會使用它來查看模型的整體表現,並檢查模型在測試集資料點上的行為。

步驟 1:準備假設分析工具的資料

為了充分運用 What-If 工具,我們會傳送測試集的範例,以及這些範例的真值標籤 (y_test)。這樣一來,我們就能將模型的預測結果與真值進行比較。執行下列程式碼行,建立包含測試範例及其標籤的新 DataFrame:

wit_data = pd.concat([x_test, y_test], axis=1)

在本研究室中,我們將將 What-If Tool 連結至剛剛在筆記本中訓練的模型。為此,我們需要編寫函式,讓工具用來將這些測試資料點執行至模型:

def custom_predict(examples_to_infer):
    preds = model.predict(examples_to_infer)
    return preds

步驟 2:將假設工具例項化

我們將從剛才建立的連接測試資料集,傳遞 500 個示例給 What-If 工具,以便將其例項化。我們會建立 WitConfigBuilder 的例項來設定工具,並傳遞我們的資料、我們在前面定義的自訂預測函式、目標 (我們要預測的項目) 和模型類型:

config_builder = (WitConfigBuilder(wit_data[:500].values.tolist(), data.columns.tolist() + ['weight_pounds'])
  .set_custom_predict_fn(custom_predict)
  .set_target_feature('weight_pounds')
  .set_model_type('regression'))
WitWidget(config_builder, height=800)

載入 What-If 工具後,畫面應如下所示:

fcdc1cb7ed8e364e.png

在 x 軸上,您可以看到測試資料點依據模型預測的重量值 weight_pounds 而分散開來。

步驟 3:使用 What-If Tool 探索模型行為

您可以使用 What-If Tool 執行許多有趣的操作。我們在這裡只會探討其中幾個。首先,讓我們來看看資料點編輯器。您可以選取任何資料點來查看其特徵,並變更特徵值。首先,請點選任一資料點:

2ba944f16240ff4b.png

畫面左側會顯示所選資料點的特徵值。您也可以將該資料點的實際資料標籤與模型預測的值進行比較。您也可以在左側邊欄變更特徵值,然後重新執行模型預測,查看這項變更對模型的影響。舉例來說,我們可以雙擊這個資料點,然後重新執行預測,將 gestation_weeks 變更為 30:

aaa6a937c66758cf.png

您可以使用 What-If 工具的圖表部分中的下拉式選單,建立各種自訂的視覺化資料。舉例來說,下圖 X 軸顯示模型預測的體重,Y 軸顯示母親的年齡,而點的顏色則代表推論誤差 (較深的顏色代表預測體重與實際體重之間的差異較大)。這裡顯示,隨著權重降低,模型的誤差會略微增加:

cd2ce527a9044e7b.png

接著,勾選左側的「Partial dependence plots」按鈕。這可顯示各項特徵對模型預測的影響。舉例來說,隨著妊娠時間增加,模型預測的嬰兒體重也會增加:

1fec2a64fb03f432.png

如要進一步探索 What-If Tool 的使用方式,請參考本節開頭的連結。

7. 選用:將本機 Git 存放區連結至 GitHub

最後,我們將瞭解如何將筆記本執行個體中的 Git 存放區連結至 GitHub 帳戶中的存放區。如要執行這個步驟,您必須擁有 GitHub 帳戶。

步驟 1:在 GitHub 中建立新的存放區

在 GitHub 帳戶中建立新的存放區。請為它命名並加入說明,決定是否要公開,然後選取「建立存放區」 (您不需要使用 README 進行初始化)。在下一頁中,您將按照指示透過指令列推送現有的存放區。

開啟終端機視窗,然後將新的存放區新增為遠端項目。將下方存放區網址中的 username 替換為您的 GitHub 使用者名稱,並將 your-repo 替換為您剛建立的使用者名稱:

git remote add origin git@github.com:username/your-repo.git

步驟 2:在筆記本執行個體中驗證 GitHub

接下來,您必須在筆記本執行個體中驗證 GitHub。這項程序會因您是否已在 GitHub 中啟用雙重驗證而異。

如果不確定從何處開始,請按照 GitHub 說明文件中的步驟建立 SSH 金鑰,然後將新金鑰新增至 GitHub

步驟 3:確認已正確連結 GitHub 存放區

如要確認設定正確無誤,請在終端機中執行 git remote -v。您應該會看到新存放區列為遠端項目。看到 GitHub 存放區的網址,並從筆記本驗證 GitHub 後,您就可以直接從筆記本執行個體推送至 GitHub。

如要將本機筆記本 Git 存放區與新建立的 GitHub 存放區同步,請按一下 Git 側欄頂端的雲端上傳按鈕:

eec001587bb9cfb1.png

重新整理 GitHub 存放區,您應該會看到筆記本程式碼,以及先前的提交內容!如果其他人有權存取您的 GitHub 存放區,而您想要將最新變更內容下載到筆記,請按一下雲端下載圖示,同步處理這些變更。

您可以在 Notebooks Git UI 的「History」分頁中,查看本機修訂版本是否已與 GitHub 同步。在本例中,origin/master 對應至 GitHub 上的存放區:

2c3d1eb7cf95c24e.png

每當您進行新的修訂時,只要再次按一下雲端上傳按鈕,即可將這些變更推送至 GitHub 存放區。

8. 恭喜!

您在本研究室中完成了許多工作 👏?👏?👏?

回顧一下,您已瞭解如何:

  • 建立自訂 AI 平台筆記本執行個體
  • 在該執行個體中初始化本機 Git 存放區、透過 Git 使用者介面或指令列新增修訂版本,以及在 Notebook Git 使用者介面中查看 Git 差異
  • 建構及訓練簡單的 TensorFlow 2 模型
  • 在 Notebook 執行個體中使用 What-If Tool
  • 將 Notebook Git 存放區連結至 GitHub 上的外部存放區

9. 清理

如果你想繼續使用這個筆記本,建議你在未使用時關閉筆記本。在 Cloud 控制台的 Notebook 使用者介面中,選取 Notebook,然後選取「Stop」

ba727f9a0aefbc30.png

如果您想刪除在本實驗室中建立的所有資源,只要刪除筆記本執行個體即可,無須停止執行。

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