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:
為執行個體命名或使用預設名稱。接著,我們將探討自訂選項。按一下「自訂」按鈕:
AI Platform Notebooks 提供多種自訂選項,包括執行個體部署所在的區域、映像檔類型、機器大小、GPU 數量等。我們會使用區域和環境的預設值。針對機器設定,我們會使用 n1-standard-8 機器:
我們不會新增任何 GPU,並會使用預設的啟動磁碟、網路和權限。選取「Create」建立執行個體。這項作業需要幾分鐘才能完成。
建立完成後,Notebooks 使用者介面中的執行個體旁會顯示綠色勾號。選取「Open JupyterLab」,開啟執行個體並開始製作原型:
開啟執行個體時,請建立名為 codelab 的新目錄。以下是本研究室中會用到的目錄:
按兩下新建立的 codelab 目錄,然後從啟動器中選取 Python 3 筆記本:
將筆記本重新命名為 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」:
當系統詢問您是否要將這個目錄設為 Git 存放區時,請選取「是」。接著選取左側欄的 Git 圖示,查看檔案和提交的狀態:
步驟 2:進行首次修訂
在這個 UI 中,您可以將檔案新增至修訂版本、查看檔案差異 (我們稍後會說明),以及提交變更。首先,我們要提交剛才新增的筆記本檔案。
勾選 demo.ipynb
筆記檔案旁的方塊,將其納入提交作業 (您可以忽略 .ipynb_checkpoints/
目錄)。在文字方塊中輸入提交訊息,然後按一下勾號圖示,即可提交變更:
在系統提示時輸入您的姓名和電子郵件地址。接著返回「History」分頁,查看第一個提交內容:
請注意,由於本實驗室發布後可能會進行更新,因此螢幕截圖可能與您的 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 中的「已變更」部分下方。將滑鼠游標懸停在檔案名稱上,然後按一下差異圖示:
這樣一來,您應該就能看到變更的差異,如下所示:
這次我們會透過終端機的指令列提交變更。在 JupyterLab 頂端選單列的「Git」選單中,選取「在終端機中執行 Git 指令」。如果您在執行下列指令時開啟左側邊欄的 Git 分頁,就能在 Git 使用者介面中看到變更內容。
在新的終端機例項中執行以下指令,將筆記本檔案暫存以便提交:
git add demo.ipynb
然後執行下列指令來提交變更 (您可以使用任何提交訊息):
git commit -m "Build and train TF model"
接著,您應該會在記錄中看到最新的提交內容:
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 工具後,畫面應如下所示:
在 x 軸上,您可以看到測試資料點依據模型預測的重量值 weight_pounds
而分散開來。
步驟 3:使用 What-If Tool 探索模型行為
您可以使用 What-If Tool 執行許多有趣的操作。我們在這裡只會探討其中幾個。首先,讓我們來看看資料點編輯器。您可以選取任何資料點來查看其特徵,並變更特徵值。首先,請點選任一資料點:
畫面左側會顯示所選資料點的特徵值。您也可以將該資料點的實際資料標籤與模型預測的值進行比較。您也可以在左側邊欄變更特徵值,然後重新執行模型預測,查看這項變更對模型的影響。舉例來說,我們可以雙擊這個資料點,然後重新執行預測,將 gestation_weeks 變更為 30:
您可以使用 What-If 工具的圖表部分中的下拉式選單,建立各種自訂的視覺化資料。舉例來說,下圖 X 軸顯示模型預測的體重,Y 軸顯示母親的年齡,而點的顏色則代表推論誤差 (較深的顏色代表預測體重與實際體重之間的差異較大)。這裡顯示,隨著權重降低,模型的誤差會略微增加:
接著,勾選左側的「Partial dependence plots」按鈕。這可顯示各項特徵對模型預測的影響。舉例來說,隨著妊娠時間增加,模型預測的嬰兒體重也會增加:
如要進一步探索 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 側欄頂端的雲端上傳按鈕:
重新整理 GitHub 存放區,您應該會看到筆記本程式碼,以及先前的提交內容!如果其他人有權存取您的 GitHub 存放區,而您想要將最新變更內容下載到筆記,請按一下雲端下載圖示,同步處理這些變更。
您可以在 Notebooks Git UI 的「History」分頁中,查看本機修訂版本是否已與 GitHub 同步。在本例中,origin/master
對應至 GitHub 上的存放區:
每當您進行新的修訂時,只要再次按一下雲端上傳按鈕,即可將這些變更推送至 GitHub 存放區。
8. 恭喜!
您在本研究室中完成了許多工作 👏?👏?👏?
回顧一下,您已瞭解如何:
- 建立自訂 AI 平台筆記本執行個體
- 在該執行個體中初始化本機 Git 存放區、透過 Git 使用者介面或指令列新增修訂版本,以及在 Notebook Git 使用者介面中查看 Git 差異
- 建構及訓練簡單的 TensorFlow 2 模型
- 在 Notebook 執行個體中使用 What-If Tool
- 將 Notebook Git 存放區連結至 GitHub 上的外部存放區
9. 清理
如果你想繼續使用這個筆記本,建議你在未使用時關閉筆記本。在 Cloud 控制台的 Notebook 使用者介面中,選取 Notebook,然後選取「Stop」:
如果您想刪除在本實驗室中建立的所有資源,只要刪除筆記本執行個體即可,無須停止執行。
使用 Cloud 控制台的「導覽」選單,前往「儲存空間」,然後刪除您建立用於儲存模型資產的兩個值區。