使用 scikit-learn 和 XGBoost 進行預測

AI Platform 線上預測服務可管理雲端中用於執行模型的運算資源。這些模型可能是您在別處 (本機或透過其他服務) 完成訓練並匯出為檔案的 scikit-learn 或 XGBoost 模型。本頁說明使用 AI Platform 從這些匯出的模型中取得線上預測的程序。

總覽

在本教學課程中,您將使用 Iris 資料集訓練簡單的模型來預測花的種類。當您在本機訓練並儲存模型之後,就會將模型部署至 AI Platform,然後查詢該模型以取得線上預測。

本教學課程需使用 Python 2.7。如要使用 Python 3.5,請參閱如何使用 XGBoost 取得線上預測,或是如何使用 scikit-learn 取得線上預測

事前準備

請完成下列步驟以設定 GCP 帳戶、啟動 AI Platform API,以及安裝並啟動 Cloud SDK。

設定 GCP 專案

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。瞭解如何確認您已啟用專案的計費功能

  4. 啟用AI Platform ("Cloud Machine Learning Engine") and Compute Engine必要的 API。

    啟用 API

  5. 安裝並初始化 Cloud SDK

設定環境

請選擇下列其中一個選項,在 macOS 的本機或 Cloud Shell 的遠端環境中設定環境。

如果您是 macOS 使用者,建議使用下列「MACOS」分頁設定環境;「CLOUD SHELL」分頁中的 Cloud Shell 可在 macOS、Linux 及 Windows 中使用。Cloud Shell 能讓您迅速開始試用 AI Platform,但並不適合用來進行持續的開發工作。

macOS

  1. 查看 Python 的安裝狀態
    請確認您已安裝 Python;如果沒有,請加以安裝。

    python -V
  2. 查看 pip 的安裝狀態
    pip 是 Python 的套件管理工具,隨附在目前的 Python 版本中。請執行 pip --version 以查看您是否已安裝 pip。如果尚未安裝,請參閱如何安裝 pip

    您可以使用下列指令來升級 pip

    pip install -U pip

    詳情請參閱 pip 說明文件

  3. 安裝 virtualenv
    virtualenv 是可用來建立獨立 Python 環境的工具。請執行 virtualenv --version 以查看您是否已安裝 virtualenv。如果尚未安裝,請安裝 virtualenv

    pip install --user --upgrade virtualenv

    如要為本指南建立獨立的開發環境,請在 virtualenv 中建立新的虛擬環境。舉例來說,下列指令會啟動名為「cmle-env」的環境:

    virtualenv cmle-env
    source cmle-env/bin/activate
  4. 為達到本教學課程的目的,請在虛擬環境中執行其餘指令。

    請參閱如何使用 virtualenv 的詳細資訊。如要離開 virtualenv,請執行deactivate

Cloud Shell

  1. 開啟 Google Cloud Platform Console。

    Google Cloud Platform Console

  2. 按一下主控台視窗頂端的 [Activate Google Cloud Shell] (啟用 Google Cloud Shell) 按鈕。

    啟用 Google Cloud Shell

    Cloud Shell 工作階段會在主控台底部的新頁框中開啟,並顯示指令列提示字元。殼層工作階段可能需要幾秒鐘的時間才能完成初始化。

    Cloud Shell 工作階段

    Cloud Shell 工作階段已準備就緒。

  3. 設定 gcloud 指令列工具以使用您選取的專案。

    gcloud config set project [selected-project-id]

    其中的 [selected-project-id] 是專案 ID (請省略括號)。

驗證 Google Cloud SDK 元件

如何驗證 Google Cloud SDK 元件的安裝狀態:

  1. 列出您的模型:

    gcloud ai-platform models list
  2. 如果您尚未建立任何模型,指令會傳回空白的清單:

    Listed 0 items.

    開始建立模型後,即可使用這個指令查看模型清單。

  3. 如果您先前已安裝 gcloud,請更新 :

    gcloud components update

安裝架構

macOS

請在虛擬環境中執行下列指令,以便安裝在 AI Platform 執行階段 1.14 版中使用的 scikit-learn、XGBoost 和 pandas 版本:

(cmle-env)$ pip install scikit-learn==0.20.2 xgboost==0.81 pandas==0.24.0

在上述指令中提供版本編號之後,您就能確保虛擬環境中的依附元件與執行階段版本中的依附元件相符。您在 AI Platform 中執行程式碼時,這也有助於避免發生非預期的行為。

如需更多詳細資料、安裝選項與疑難排解資訊,請參閱各個架構的安裝操作說明:

Cloud Shell

執行下列指令以安裝 scikit-learn、XGBoost 和 pandas:

pip install --user scikit-learn xgboost pandas

如需更多詳細資料、安裝選項與疑難排解資訊,請參閱各個架構的安裝操作說明:

scikit-learn 和 XGBoost 的版本

AI Platform 執行階段版本會定期更新,以提供對新版 scikit-learn 和 XGBoost 的支援。請參閱每個執行階段版本的完整詳細資料

訓練及儲存模型

請先從針對 Iris 資料集訓練簡單的模型開始。

scikit-learn

您可以依照模型保存的 scikit-learn 範例訓練及匯出模型,如下所示:

from sklearn.externals import joblib
from sklearn import datasets
from sklearn import svm

# Load the Iris dataset
iris = datasets.load_iris()

# Train a classifier
classifier = svm.SVC()
classifier.fit(iris.data, iris.target)

# Export the classifier to a file
joblib.dump(classifier, 'model.joblib')

如要匯出模型,您也可以選擇使用 pickle 程式庫,如下所示:

import pickle
with open('model.pkl', 'wb') as model_file:
  pickle.dump(classifier, model_file)

XGBoost

您可以使用 Booster 物件的「save_model」方法匯出模型。

為達到本教學課程的目的,我們只使用 scikit-learn 搭配 XGBoost 來匯入 Iris 資料集。

from sklearn import datasets
import xgboost as xgb

# Load the Iris dataset
iris = datasets.load_iris()

# Load data into DMatrix object
dtrain = xgb.DMatrix(iris.data, label=iris.target)

# Train XGBoost model
bst = xgb.train({}, dtrain, 20)

# Export the classifier to a file
bst.save_model('./model.bst')

如要匯出模型,您也可以選擇使用 pickle 程式庫,如下所示:

import pickle
with open('model.pkl', 'wb') as model_file:
  pickle.dump(bst, model_file)

模型檔案命名規定

視您使用的程式庫而定,您上傳到 Cloud Storage 的已儲存模型檔案必須命名為:model.pklmodel.joblibmodel.bst。這限制可確保 AI Platform 在匯入模型時用來重建模型的模式,會與匯出模型時使用的模式相同。

如果您建立自訂預測處理常式 (Beta 版),這規定就不適用。

scikit-learn

用於匯出模型的程式庫 正確的模型名稱
pickle model.pkl
joblib model.joblib

XGBoost

用於匯出模型的程式庫 正確的模型名稱
pickle model.pkl
joblib model.joblib
xgboost.Booster model.bst

為了讓模型日後能順利進行疊代,請整理您的 Cloud Storage 值區,讓每個新模型都有專屬目錄。

將模型儲存在 Cloud Storage 中

為達成本教學課程的目的,最簡單的方法就是使用您用於 AI Platform 的專案中的專屬 Cloud Storage 值區。

如果您使用的值區位於不同專案,則必須確保您的 AI Platform 服務帳戶可以存取 Cloud Storage 中的模型。如果沒有適當的權限,建立 AI Platform 模型版本的要求將會失敗。詳情請參閱如何授予儲存空間權限

設定 Cloud Storage 值區

本節說明如何建立新值區。您可以使用現有的值區,但該值區的所在地區必須與您預計要執行 AI Platform 工作的地區相同。此外,如果該值區不屬於您用來執行 AI Platform 的專案,您就必須明確地將該值區的存取權授予 AI Platform 服務帳戶

  1. 指定新值區的名稱。Cloud Storage 中所有值區的名稱皆不得重複。

    BUCKET_NAME="your_bucket_name"

    舉例來說,請使用您的專案名稱,並在後面附加 -mlengine

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-mlengine
  2. 查看您建立的值區名稱。

    echo $BUCKET_NAME
  3. 選取值區的地區,然後設定 REGION 環境變數。

    請使用您預計要讓 AI Platform 工作執行的地區。請參閱 AI Platform 服務的可用地區

    舉例來說,下列程式碼會建立 REGION,並將該變數設定為 us-central1

    REGION=us-central1
  4. 建立新值區:

    gsutil mb -l $REGION gs://$BUCKET_NAME

將匯出的模型檔案上傳至 Cloud Storage

請執行下列指令,將本教學課程之前匯出的模型上傳到 Cloud Storage 的值區中:

gsutil cp ./model.joblib gs://$BUCKET_NAME/model.joblib

您可以將同一個 Cloud Storage 值區用於多個模型檔案。在值區內部,每個模型檔案都必須位於自己的目錄中。

設定預測用資料的格式

gcloud

請建立 input.json 檔案,並把其中的每個輸入內容項目都單獨列為一行:

[6.8,  2.8,  4.8,  1.4]
[6.0,  3.4,  4.5,  1.6]

請注意,輸入內容項目的格式必須符合模型預期的格式。在本範例中,Iris 模型需要 4 個特徵,因此您的輸入內容必須為形狀矩陣 (num_instances, 4)。

REST API

請建立採用簡單的浮點清單格式的 input.json 檔案,並把其中的每個輸入內容項目都單獨列為一行:

{
  "instances": [

    [6.8,  2.8,  4.8,  1.4],
    [6.0,  3.4,  4.5,  1.6]

  ]
}

請注意,輸入內容項目的格式必須符合模型預期的格式。在本範例中,Iris 模型需要 4 個特徵,因此您的輸入內容必須為形狀矩陣 (num_instances, 4)。

對於 XGBoost,AI Platform 並不支援讓輸入內容項目採用稀疏表示法。如果某個特徵的值為零,請在對應的輸入內容中使用 0.0。如果某個特徵的值消失了,請在對應的輸入內容中使用 NaN

詳情請參閱設定線上預測用的輸入內容格式

使用本機預測作業來測試模型

在您將模型部署到 AI Platform Prediction 之前,可以使用 gcloud ai-platform local predict 指令測試模型的預測效果。這個指令會使用您本機環境中的依附元件來執行預測作業,並採用 gcloud ai-platform predict 在執行線上預測時所用的格式來傳回結果。在本機環境中測試預測作業,可協助您在線上預測要求產生費用之前就發現錯誤。

針對 --model-dir 引數,請指定包含已匯出機器學習模型的目錄,無論這目錄是在本機機器上,還是在 Cloud Storage 中都沒問題。針對 --framework 引數,請指定 tensorflowscikit-learnxgboost。您無法搭配自訂預測處理常式來使用 gcloud ai-platform local predict 指令。

下列範例說明如何執行本機預測作業:

gcloud ai-platform local predict --model-dir local-or-cloud-storage-path-to-model-directory/ \
  --json-instances local-path-to-prediction-input.json \
  --framework name-of-framework

部署模型和版本

AI Platform 使用「模型」和「版本」資源來組織經過訓練的模型。在 AI Platform 中,模型是指存放機器學習模型各個版本的容器。

如要部署模型,請在 AI Platform 中建立模型資源、建立該模型的版本,然後將模型版本連結到儲存在 Cloud Storage 中的模型檔案。

建立模型資源

AI Platform 使用模型資源整理不同版本的模型。

主控台

  1. 開啟 GCP Console 中 AI Platform 的「models」(模型) 頁面:

    開啟 GCP Console 的「models」(模型) 頁面

  2. 視需求建立要加入新版本的模型:

    1. 按一下「Models」(模型) 頁面頂端的 [New Model] (新增模型) 按鈕。這會將您導向至「Create model」(建立模型) 頁面。

    2. 在「Model name」(模型名稱) 方塊中,輸入模型的專用名稱。您也可以在「Description」(說明) 欄位中輸入模型的說明。

    3. 按一下 [Create] (建立)

    4. 確認您已返回「Models」(模型) 頁面,且您的新模型出現在清單中。

gcloud

請建立您模型版本的模型資源,但要填入您想要的模型名稱 (請省略括號):

gcloud ai-platform models create "[YOUR-MODEL-NAME]"

REST API

  1. 模型物件放在要求主體中,以設定要求的格式。您至少必須指定模型名稱。請填入您想要的模型名稱 (請省略括號):

    {"name": "[YOUR-MODEL-NAME]"}
    
  2. 對下列路徑發出 REST API 呼叫,但要將 [VALUES_IN_BRACKETS] 替換成適當的值:

    POST https://ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/
    

    舉例來說,您可以使用 cURL 提出下列要求:

    curl -X POST -H "Content-Type: application/json" \
      -d '{"name": "[YOUR-MODEL-NAME]"}' \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      "https://ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models"
    

    畫面會顯示類似以下的輸出內容:

    {
      "name": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]",
      "regions": [
        "us-central1"
      ]
    }
    

詳情請參閱 AI Platform 模型 API

建立模型版本

現在您已準備好使用經過訓練且已上傳到 Cloud Storage 的模型來建立模型版本。請在建立版本時指定下列參數:

  • name:請勿與 AI Platform 模型中的其他名稱重複。
  • deploymentUri:Cloud Storage 中的模型目錄路徑。

    • 如果您部署的是 TensorFlow 模型,這就是 SavedModel 目錄。
    • 如果您部署的是 scikit-learn 或 XGBoost 模型,這就是包含您 model.joblibmodel.pklmodel.bst 檔案的目錄。
    • 如果您部署的是自訂預測處理常式,這就是包含您所有模型構件的目錄。這個目錄的大小總計不得超過 500 MB
  • frameworkTENSORFLOWSCIKIT_LEARNXGBOOST

  • runtimeVersion:視您模型所需的依附元件而定的執行階段版本。如果您部署的是 scikit-learn 或 XGBoost 模型,就必須使用 1.4 或較新的版本。

  • pythonVersion:必須設定為「3.5」,以便與利用 Python 3 匯出的模型檔案相容。如果沒有設定,系統會使用預設值「2.7」。

  • machineType (選填):AI Platform Prediction 在提供預測的節點所用的虛擬機器類型。進一步瞭解機器類型。如果沒有設定,系統會使用預設值 mls1-c1-m2

如要進一步瞭解上述的每個參數,請參閱版本資源適用的 AI Platform Training 和 Prediction API

請參閱每個執行階段版本的完整詳細資料

主控台

  1. 在「Models」(模型) 頁面上,選取您要用來建立版本的模型資源名稱。這會將您導向至「Model Details」(模型詳細資料) 頁面。

    開啟 GCP Console 的「models」(模型) 頁面

  2. 按一下「Model Details」(模型詳細資料) 頁面頂端的 [New Version] (新增版本) 按鈕。這會將您導向至「Create version」(建立版本) 頁面。

  3. 在「Name」(名稱) 欄位中輸入版本名稱。您也可以在「Description」(說明) 欄位中輸入版本的說明。

  4. 將下列關於如何訓練模型的資訊,輸入到對應的下拉式方塊中:

    • 選取您用來訓練模型的「Python version」(Python 版本)
    • 選取「Framework」(架構) 和「Framework version」(架構版本)。
    • 選取「ML runtime version」(ML 執行階段版本)。進一步瞭解 AI Platform 執行階段版本
  5. 您也可以選取要執行線上預測的「Machine type」(機器類型)。這個欄位的預設值為「Single core CPU」(單核心 CPU)。

  6. 在「Model URI」(模型 URI)欄位中,輸入您上傳模型檔案時使用的 Cloud Storage 值區位置。您可以使用「Browse」(瀏覽) 按鈕尋找正確的路徑。

    請務必指定含有檔案的「目錄」路徑,而「非」模型檔案本身的路徑。舉例來說,請使用 gs://your_bucket_name/model-dir/,而非 gs://your_bucket_name/model-dir/saved_model.pbgs://your_bucket_name/model-dir/model.pkl

  7. 選取線上預測部署作業的「Scaling」(資源調度) 選項:

    • 如果您選取 [Auto scaling] (自動調整資源配置),畫面會顯示選填的「Minimum number of nodes」(節點數量下限) 欄位。您可以輸入在調降服務資源配置時,隨時保持運作狀態的節點數量下限。這個欄位預設為 0。

    • 如果您選取 [Manual scaling] (手動調整資源配置),則必須輸入您希望能隨時保持運作的「Number of nodes」(節點數量)。

      進一步瞭解預測費用的計價方式

  8. 如要完成模型版本的建立程序,請按一下 [Save] (儲存)

gcloud

  1. 設定環境變數以儲存您模型二進位檔所在的 Cloud Storage 目錄路徑、模型名稱、版本名稱,以及您選擇的架構。

    當您利用 gcloud 工具建立版本時,可提供採用大寫字母與底線的架構名稱 (例如 SCIKIT_LEARN),或是採用小寫英文字母與連字號的架構名稱 (例如 scikit-learn)。這兩種做法導致的結果是完全相同的。

    請將 [VALUES_IN_BRACKETS] 替換成適當的值:

    MODEL_DIR="gs://your_bucket_name/"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    MODEL_NAME="[YOUR-MODEL-NAME]"
    FRAMEWORK="[YOUR-FRAMEWORK_NAME]"
    

  2. 建立版本:

    gcloud ai-platform versions create $VERSION_NAME \
      --model $MODEL_NAME \
      --origin $MODEL_DIR \
      --runtime-version=1.14 \
      --framework $FRAMEWORK \
      --python-version=3.5
    

    建立版本需要幾分鐘的時間。完成後,畫面會顯示以下輸出:

    Creating version (this might take a few minutes)......done.

  3. 取得新版本的相關資訊:

    gcloud ai-platform versions describe $VERSION_NAME \
      --model $MODEL_NAME
    

    畫面會顯示類似以下的輸出內容:

    createTime: '2018-02-28T16:30:45Z'
    deploymentUri: gs://your_bucket_name
    framework: [YOUR-FRAMEWORK-NAME]
    machineType: mls1-c1-m2
    name: projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]
    pythonVersion: '3.5'
    runtimeVersion: '1.14'
    state: READY

REST API

  1. 設定要求主體的格式以包含版本物件。以下範例會指定版本的 namedeploymentUriruntimeVersionframework。請將 [VALUES_IN_BRACKETS] 替換成適當的值:

      {
        "name": "[YOUR-VERSION-NAME]",
        "deploymentUri": "gs://your_bucket_name/"
        "runtimeVersion": "1.14"
        "framework": "[YOUR_FRAMEWORK_NAME]"
        "pythonVersion": "3.5"
      }
    
  2. 對下列路徑發出 REST API 呼叫,但要將 [VALUES_IN_BRACKETS] 替換成適當的值:

      POST https://ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions
    

    舉例來說,您可以使用 cURL 提出下列要求:

        curl -X POST -H "Content-Type: application/json" \
          -d '{"name": "[YOUR-VERSION-NAME]", "deploymentUri": "gs://your_bucket_name/", "runtimeVersion": "1.14", "framework": "[YOUR_FRAMEWORK_NAME]", "pythonVersion": "3.5"}' \
          -H "Authorization: Bearer `gcloud auth print-access-token`" \
          "https://ml.googleapis.com/v1/projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions"
    

    建立版本需要幾分鐘的時間。完成後,畫面會顯示類似以下的輸出內容:

      {
        "name": "projects/[YOUR-PROJECT-ID]/operations/create_[YOUR-MODEL-NAME]_[YOUR-VERSION-NAME]-[TIMESTAMP]",
        "metadata": {
          "@type": "type.googleapis.com/google.cloud.ml.v1.OperationMetadata",
          "createTime": "2018-07-07T02:51:50Z",
          "operationType": "CREATE_VERSION",
          "modelName": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]",
          "version": {
            "name": "projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]",
            "deploymentUri": "gs://your_bucket_name",
            "createTime": "2018-07-07T02:51:49Z",
            "runtimeVersion": "1.14",
            "framework": "[YOUR_FRAMEWORK_NAME]",
            "machineType": "mls1-c1-m2",
            "pythonVersion": "3.5"
          }
        }
      }
    

傳送線上預測要求

當您成功建立模型版本之後,AI Platform 就會啟動能立刻開始處理預測要求的新伺服器。

gcloud

  1. 設定代表模型名稱、版本名稱,以及輸入檔案名稱的環境變數:

    MODEL_NAME="iris"
    VERSION_NAME="v1"
    INPUT_FILE="input.json"
    
  2. 傳送預測要求:

    gcloud ai-platform predict --model $MODEL_NAME --version \
      $VERSION_NAME --json-instances $INPUT_FILE
    

Python

本範例假設您熟悉 Python 適用的 Google Cloud 用戶端程式庫。如果您並不熟悉,請參閱使用 Python 用戶端程式庫

import googleapiclient.discovery

def predict_json(project, model, instances, version=None):
    """Send json data to a deployed model for prediction.
    Args:
        project (str): project where the AI Platform Model is deployed.
        model (str): model name.
        instances ([[float]]): List of input instances, where each input
           instance is a list of floats.
        version: str, version of the model to target.
    Returns:
        Mapping[str: any]: dictionary of prediction results defined by the
            model.
    """
    # Create the AI Platform service object.
    # To authenticate set the environment variable
    # GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>
    service = googleapiclient.discovery.build('ml', 'v1')
    name = 'projects/{}/models/{}'.format(project, model)

    if version is not None:
        name += '/versions/{}'.format(version)

    response = service.projects().predict(
        name=name,
        body={'instances': instances}
    ).execute()

    if 'error' in response:
        raise RuntimeError(response['error'])

    return response['predictions']

如要進一步瞭解上述的每個參數,請參閱預測輸入內容適用的 AI Platform API

後續步驟