1. 總覽
在本實驗室中,您將使用 What-if Tool 分析以財務資料訓練的 XGBoost 模型。分析模型後,您會將模型部署至 Cloud 的新 Vertex AI。
課程內容
內容如下:
- 在託管筆記本中,使用公開抵押資料集訓練 XGBoost 模型
- 使用 What-If Tool 分析模型
- 將 XGBoost 模型部署至 Vertex AI
在 Google Cloud 上執行這個實驗室的總費用約為 $1 美元。
2. Vertex AI 簡介
本實驗室使用 Google Cloud 最新推出的 AI 產品服務。Vertex AI 整合了 Google Cloud 機器學習服務,提供流暢的開發體驗。以 AutoML 訓練的模型和自訂模型,先前需透過不同的服務存取。這項新服務將兩者併至單一 API,並加入其他新產品。您也可以將現有專案遷移至 Vertex AI。如有任何意見,請參閱支援頁面。
Vertex AI 包含許多不同的產品,可支援端對端機器學習工作流程。本實驗室將著重於下列產品:Prediction 和 Notebooks。

3. XGBoost 快速入門
XGBoost 是一種機器學習框架,可使用決策樹和梯度提升來建構預測模型。這項技術會根據樹狀結構中不同葉節點的相關分數,將多個決策樹集合在一起。
下圖是簡單決策樹模型的視覺化呈現,可根據天氣預報評估是否應進行體育賽事:

為什麼要使用 XGBoost 建立這個模型?傳統類神經網路在圖像和文字等非結構化資料方面表現最佳,而決策樹在結構化資料方面通常表現極佳,例如我們將在本程式碼研究室中使用的房貸資料集。
4. 設定環境
您必須擁有已啟用計費功能的 Google Cloud Platform 專案,才能執行這項程式碼研究室。如要建立專案,請按照這裡的說明操作。
步驟 1:啟用 Compute Engine API
前往「Compute Engine」,然後選取「啟用」 (如果尚未啟用)。您需要這項資訊才能建立筆記本執行個體。
步驟 2:啟用 Vertex AI API
前往 Cloud 控制台的 Vertex 專區,然後按一下「啟用 Vertex AI API」。

步驟 3:建立 Notebooks 執行個體
在 Cloud 控制台的「Vertex」部分,按一下「Notebooks」:

然後選取「新增執行個體」。然後選取「TensorFlow Enterprise 2.3」執行個體類型,且不加入任何 GPU:

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

接著執行下列指令,安裝 Vertex AI 支援的最新版 XGBoost:
pip3 install xgboost==1.2
完成後,請從啟動器開啟 Python 3 Notebook 執行個體。您可以在筆記本中開始使用!
步驟 5:匯入 Python 套件
在筆記本的第一個儲存格中,新增下列匯入內容並執行儲存格。如要執行,請按下頂端選單中的向右箭頭按鈕,或按下 Command-Enter 鍵:
import pandas as pd
import xgboost as xgb
import numpy as np
import collections
import witwidget
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.utils import shuffle
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
5. 下載及處理資料
我們將使用 ffiec.gov 的房貸資料集訓練 XGBoost 模型。我們已對原始資料集進行一些前置處理,並建立較小的版本供您訓練模型。模型會預測特定房貸申請是否會獲得核准。
步驟 1:下載預先處理的資料集
我們已在 Google Cloud Storage 中提供資料集版本。如要下載,請在 Jupyter 筆記本中執行下列 gsutil 指令:
!gsutil cp 'gs://mortgage_dataset_files/mortgage-small.csv' .
步驟 2:使用 Pandas 讀取資料集
建立 Pandas DataFrame 之前,我們會先建立每個資料欄資料類型的 dict,讓 Pandas 正確讀取資料集:
COLUMN_NAMES = collections.OrderedDict({
'as_of_year': np.int16,
'agency_code': 'category',
'loan_type': 'category',
'property_type': 'category',
'loan_purpose': 'category',
'occupancy': np.int8,
'loan_amt_thousands': np.float64,
'preapproval': 'category',
'county_code': np.float64,
'applicant_income_thousands': np.float64,
'purchaser_type': 'category',
'hoepa_status': 'category',
'lien_status': 'category',
'population': np.float64,
'ffiec_median_fam_income': np.float64,
'tract_to_msa_income_pct': np.float64,
'num_owner_occupied_units': np.float64,
'num_1_to_4_family_units': np.float64,
'approved': np.int8
})
接著,我們將建立 DataFrame,並傳遞上方指定的資料類型。如果原始資料集是以特定方式排序,請務必隨機排序資料。我們使用名為 shuffle 的 sklearn 公用程式執行這項操作,該公用程式已在第一個儲存格中匯入:
data = pd.read_csv(
'mortgage-small.csv',
index_col=False,
dtype=COLUMN_NAMES
)
data = data.dropna()
data = shuffle(data, random_state=2)
data.head()
data.head() 可讓我們在 Pandas 中預覽資料集的前五列。執行上述儲存格後,您應該會看到類似下列的內容:

這些是我們用來訓練模型的特徵。捲動至最後,您會看到最後一欄 approved,這是我們要預測的內容。值為 1 表示特定應用程式已獲准,值為 0 則表示遭拒。
如要查看資料集中核准 / 拒絕值的分布情形,並建立標籤的 NumPy 陣列,請執行下列指令:
# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())
labels = data['approved'].values
data = data.drop(columns=['approved'])
資料集中約有 66% 的核准應用程式。
步驟 3:為類別值建立虛擬資料欄
這個資料集包含類別和數值,但 XGBoost 要求所有特徵都必須是數值。我們將利用 Pandas get_dummies 函式,而非使用單一熱編碼來表示類別值,以供 XGBoost 模型使用。
get_dummies 會採用具有多個可能值的資料欄,並轉換為一系列只有 0 和 1 的資料欄。舉例來說,假設我們有一個「color」資料欄,可能的值為「blue」和「red」,get_dummies 會將此轉換為 2 個名為「color_blue」和「color_red」的資料欄,並包含所有布林值 0 和 1。
如要為類別特徵建立虛擬資料欄,請執行下列程式碼:
dummy_columns = list(data.dtypes[data.dtypes == 'category'].index)
data = pd.get_dummies(data, columns=dummy_columns)
data.head()
這次預覽資料時,您會看到單一特徵 (如下圖所示的 purchaser_type) 分割成多個資料欄:

步驟 4:將資料拆分為訓練集和測試集
機器學習的重要概念是訓練 / 測試分割。我們會使用大部分資料訓練模型,並保留其餘資料,用於測試模型是否能處理從未見過的資料。
在筆記本中新增下列程式碼,使用 Scikit-learn 函式 train_test_split 分割資料:
x,y = data.values,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
現在,您可以建構及訓練模型了!
6. 建構、訓練及評估 XGBoost 模型
步驟 1:定義及訓練 XGBoost 模型
在 XGBoost 中建立模型非常簡單。我們會使用 XGBClassifier 類別建立模型,只需要為特定分類工作傳遞正確的 objective 參數即可。在本範例中,我們使用 reg:logistic,因為我們有二元分類問題,且希望模型在 (0,1) 範圍內輸出單一值:0 代表未核准,1 代表已核准。
下列程式碼會建立 XGBoost 模型:
model = xgb.XGBClassifier(
objective='reg:logistic'
)
您只需呼叫 fit() 方法,並傳遞訓練資料和標籤,即可使用一行程式碼訓練模型。
model.fit(x_train, y_train)
步驟 2:評估模型準確率
現在可以使用 predict() 函式,透過訓練好的模型對測試資料產生預測結果。
接著,我們會使用 Scikit-learn 的 accuracy_score() 函式,根據模型在測試資料上的表現計算準確度。我們會將真值連同模型為測試集中每個樣本預測的值傳遞給這個函式:
y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred.round())
print(acc, '\n')
您應該會看到準確率約為 87%,但由於機器學習一律含有隨機性元素,因此您的準確率會略有不同。
步驟 3:儲存模型
如要部署模型,請執行下列程式碼,將模型儲存至本機檔案:
model.save_model('model.bst')
7. 使用 What-If Tool 解讀模型
步驟 1:建立假設情境工具的視覺化效果
如要將假設情境工具連結至本機模型,您需要將測試範例子集連同這些範例的真值傳遞給該工具。讓我們建立 500 個測試範例的 NumPy 陣列,以及這些範例的實際資料標籤:
num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples],y_test[:num_wit_examples].reshape(-1,1)))
只要建立 WitConfigBuilder 物件,並將要分析的模型傳遞給該物件,即可例項化 What-if Tool。
由於 What-if Tool 預期模型中的每個類別 (在本例中為 2 個) 都有一份得分清單,因此我們會搭配 What-If Tool 使用 XGBoost 的 predict_proba 方法:
config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
.set_custom_predict_fn(model.predict_proba)
.set_target_feature('mortgage_status')
.set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)
請注意,系統需要一分鐘才能載入圖表。載入後,您應該會看到下列內容:

y 軸顯示模型的預測結果,其中 1 代表高可信度 approved 預測,0 則代表高可信度 denied 預測。X 軸只是所有載入資料點的分布範圍。
步驟 2:探索個別資料點
What-If Tool 的預設檢視畫面是「資料點編輯器」分頁。您可以在這裡點選任何個別資料點,查看其特徵、變更特徵值,並瞭解這項變更對模型預測個別資料點的影響。
在下方範例中,我們選擇的資料點接近 .5 門檻。與這個特定資料點相關聯的房貸申請來自 CFPB。我們將該特徵變更為 0,並將 agency_code_Department of Housing and Urban Development (HUD) 的值變更為 1,藉此瞭解如果這筆貸款改由 HUD 發放,模型的預測結果會如何變化:

如「假設情境工具」左下方的部分所示,變更這項特徵後,模型的 approved 預測值大幅減少了 32%。這可能表示貸款來源機構對模型輸出內容有重大影響,但我們需要進行更多分析才能確定。
在使用者介面的左下部分,我們也可以看到每個資料點的實際值,並與模型的預測值進行比較:

步驟 3:反事實分析
接著,點選任一資料點,然後將「顯示最接近的反事實資料點」滑桿向右移動:

選取這個選項後,系統會顯示與您選取的原始資料點特徵值最相似,但預測結果相反的資料點。接著捲動瀏覽特徵值,即可查看兩個資料點的差異 (差異會以綠色粗體字醒目顯示)。
步驟 4:查看偏依賴關係圖
如要查看各項特徵對模型整體預測的影響,請勾選「偏依圖」方塊,並確認已選取「全域偏依圖」:

從這裡可以看出,HUD 貸款遭拒的機率略高。由於機構代碼是布林特徵,因此值只能是 0 或 1,圖表才會呈現這種形狀。
applicant_income_thousands 是數值特徵,從偏依程度圖中可以看出,收入越高,申請獲得核准的機率就越高,但收入達到約 $20 萬美元後,機率就不會再增加。超過 $20 萬美元後,這項特徵就不會影響模型的預測結果。
步驟 5:探索整體成效和公平性
接著前往「成效與公平性」分頁。這會顯示模型在所提供資料集上的整體成效統計資料,包括混淆矩陣、PR 曲線和 ROC 曲線。
選取「實際資料特徵」mortgage_status,即可查看混淆矩陣:

這個混淆矩陣會以總數百分比的形式,顯示模型的正確和錯誤預測結果。將「實際為 Yes / 預測為 Yes」和「實際為 No / 預測為 No」方塊加總,應該會與模型的準確度相同 (在本例中約為 87%,但由於訓練機器學習模型時有隨機性,您的模型可能會略有不同)。
您也可以實驗門檻滑桿,提高和降低模型需要傳回的正向分類分數,然後再決定是否預測貸款為 approved,並查看這項操作如何改變準確率、偽陽性和偽陰性的結果。在本例中,門檻約為 0.55 時,準確度最高。
接著,在左側的「依據切片」下拉式選單中,選取 loan_purpose_Home_purchase:

現在您會看到兩組資料的成效:「0」區塊代表貸款並非用於購屋,「1」區塊則代表貸款用於購屋。比較這兩個區隔的準確度、偽陽率和偽陰性率,找出成效差異。
展開資料列查看混淆矩陣,您會發現模型預測的「核准」貸款申請中,有 70% 是用於購屋,只有 46% 是用於其他用途 (確切百分比會因模型而異):

如果從左側的圓形按鈕選取「群體均等」,系統會調整這兩個門檻,讓模型預測兩個切片中類似百分比的申請人會獲得 approved。這會對每個切片的準確度、偽陽性和偽陰性造成什麼影響?
步驟 6:探索功能發布情形
最後,前往 What-if Tool 的「特徵」分頁。這會顯示資料集中每個特徵的值分布情形:

您可以使用這個分頁,確保資料集平衡。舉例來說,資料集中來自農場服務署的貸款似乎很少。為提高模型準確率,我們可能會考慮加入該機構的更多貸款 (如有資料)。
我們在此僅說明幾項假設情境工具的探索構想。歡迎繼續使用這項工具,還有許多領域值得探索!
8. 將模型部署至 Vertex AI
我們已在本機運作模型,但如果能從任何位置 (不只是這個筆記本!) 預測模型,那就太好了。在這個步驟中,我們會將其部署至雲端。
步驟 1:為模型建立 Cloud Storage bucket
首先,請定義一些環境變數,我們會在程式碼研究室的其餘部分使用這些變數。請在下方填入 Google Cloud 雲端專案名稱、要建立的 Cloud Storage 值區名稱 (必須是全域不重複的名稱),以及模型第一個版本的版本名稱:
# Update the variables below to your own Google Cloud project ID and GCS bucket name. You can leave the model name we've specified below:
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
MODEL_NAME = 'xgb_mortgage'
現在我們準備建立儲存值區,以儲存 XGBoost 模型檔案。部署時,我們會將 Vertex AI 指向這個檔案。
在筆記本中執行下列 gsutil 指令,建立區域儲存空間 bucket:
!gsutil mb -l us-central1 $MODEL_BUCKET
步驟 2:將模型檔案複製到 Cloud Storage
接著,我們會將 XGBoost 儲存的模型檔案複製到 Cloud Storage。執行下列 gsutil 指令:
!gsutil cp ./model.bst $MODEL_BUCKET
前往 Cloud 控制台中的儲存空間瀏覽器,確認檔案已複製完成:

步驟 3:建立模型並部署至端點
我們即將完成,可以將模型部署到雲端!在 Vertex AI 中,模型可以保留多個端點。首先,我們會建立模型,然後在該模型中建立端點並部署。
首先,使用 gcloud CLI 建立模型:
!gcloud beta ai models upload \
--display-name=$MODEL_NAME \
--artifact-uri=$MODEL_BUCKET \
--container-image-uri=us-docker.pkg.dev/cloud-aiplatform/prediction/xgboost-cpu.1-2:latest \
--region=us-central1
artifact-uri 參數會指向儲存 XGBoost 模型的儲存空間位置。container-image-uri 參數會告知 Vertex AI 要使用哪個預先建構的容器來提供服務。這項指令完成後,請前往 Vertex 主控台的模型專區,取得新模型的 ID。您可以在下列位置找到:

複製該 ID 並儲存至變數:
MODEL_ID = "your_model_id"
現在,您可以在這個模型中建立端點。我們可以使用下列 gcloud 指令執行這項操作:
!gcloud beta ai endpoints create \
--display-name=xgb_mortgage_v1 \
--region=us-central1
完成後,您應該會在筆記本輸出內容中看到端點位置的記錄。找出顯示端點已建立的行,路徑如下所示:projects/project_ID/locations/us-central1/endpoints/endpoint_ID.。然後將下列值替換為您在上方建立的端點 ID:
ENDPOINT_ID = "your_endpoint_id"
如要部署端點,請執行下列 gcloud 指令:
!gcloud beta ai endpoints deploy-model $ENDPOINT_ID \
--region=us-central1 \
--model=$MODEL_ID \
--display-name=xgb_mortgage_v1 \
--machine-type=n1-standard-2 \
--traffic-split=0=100
端點部署作業會在 5 到 10 分鐘內完成。端點部署期間,請前往控制台的模型部分。按一下模型,您應該會看到端點正在部署:

部署作業完成後,載入旋轉圖示會變成綠色勾號。
步驟 4:測試已部署的模型
如要確認已部署的模型是否正常運作,請使用 gcloud 進行預測測試。首先,請儲存 JSON 檔案,並加入測試集中的範例:
%%writefile predictions.json
{
"instances": [
[2016.0, 1.0, 346.0, 27.0, 211.0, 4530.0, 86700.0, 132.13, 1289.0, 1408.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0]
]
}
執行下列 gcloud 指令來測試模型:
!gcloud beta ai endpoints predict $ENDPOINT_ID \
--json-request=predictions.json \
--region=us-central1
輸出內容應會顯示模型的預測結果。這個範例已獲准,因此您應該會看到接近 1 的值。
9. 清除
如要繼續使用這部筆電,建議在不使用時關機。在 Cloud 控制台的 Notebooks 使用者介面中,選取筆記本,然後選取「停止」:

如要刪除在本實驗室中建立的所有資源,請直接刪除筆記本執行個體,而不是停止執行個體。
如要刪除已部署的端點,請前往 Vertex 控制台的「端點」部分,然後點選刪除圖示:

如要刪除 Storage Bucket,請使用 Cloud 控制台中的導覽選單瀏覽至 Storage,選取 bucket,然後按一下「Delete」:
