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 アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. AI Platform ("Cloud Machine Learning Engine") および 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 がすでにインストールされているかどうかを確認します。pip --version。インストールされていない場合は、pip のインストール方法をご覧ください

    次のコマンドを使用して、pip をアップグレードできます。

    pip install -U pip

    詳細については、pip のドキュメントをご覧ください。

  3. virtualenv をインストールします
    virtualenv は独立した Python 環境を作成するためのツールです。次のコマンドを実行して、virtualenv がすでにインストールされているかどうかを確認します。virtualenv --version。インストールされていない場合は、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. コンソール ウィンドウの上部にある「Cloud Shell をアクティブにする」ボタンをクリックします。

    Google Cloud Shell の有効化

    コンソールの下部の新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。シェル セッションが初期化されるまで、数秒かかる場合があります。

    Cloud Shell セッション

    Cloud Shell セッションが使用できる状態になります。

  3. 選択したプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

    gcloud config set project [selected-project-id]

    ここで、[selected-project-id] はプロジェクト 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 メソッドを使用して、モデルをエクスポートします。

このチュートリアルでは、Iris データセットをインポートするためにのみ、scikit-learn と XGBoost を組み合わせて使用します。

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 はエクスポート時と同じパターンを使用して、インポート時にモデルを再構築できます。

カスタム予測ルーチン(ベータ版)を作成する場合、この要件は適用されません。

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

1 行に 1 つの入力インスタンスを記述して 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-learn、または xgboost を指定します。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 はモデルリソースを使用して、さまざまなバージョンのモデルを整理します。

Console

  1. GCP Console で AI Platform モデルのページを開きます。

    GCP Console でモデルを開く

  2. 必要に応じて、新しいバージョンを追加するモデルを作成します。

    1. [モデル] ページの上部にある [新しいモデル] ボタンをクリックします。[モデルの作成] ページが表示されます。

    2. モデルの一意の名前を [モデル名] ボックスに入力します。必要に応じて、[説明] フィールドにモデルの説明を入力します。

    3. [作成] をクリックします。

    4. [モデル] ページに戻り、新しいモデルがリストに表示されていることを確認します。

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.joblib ファイル、model.pkl ファイル、または model.bst ファイルが格納されているディレクトリです。
    • カスタム予測ルーチンをデプロイしている場合、これはすべてのモデル アーティファクトが格納されたディレクトリです。このディレクトリの合計サイズは 500 MB 以下でなければなりません。
  • framework: TENSORFLOWSCIKIT_LEARN、または XGBOOST

  • runtimeVersion: モデルに必要な依存関係に基づくランタイム バージョン。scikit-learn モデルまたは XGBoost モデルをデプロイしている場合、これは 1.4 以上でなければなりません。

  • pythonVersion: Python 3 でエクスポートされたモデルファイルと互換性を持たせるには、3.5 に設定する必要があります。設定しない場合、デフォルトで 2.7 になります。

  • machineType(省略可): AI Platform Prediction が予測を提供するノードに使用する仮想マシンのタイプ。詳細については、マシンタイプをご覧ください。設定しない場合、デフォルトで mls1-c1-m2 になります。

上記の各パラメータの詳細については、バージョン リソースの AI Platform トレーニングと Prediction API をご覧ください。

各ランタイム バージョンの詳細をご覧ください。

Console

  1. [モデル] ページで、バージョンの作成に使用するモデルリソースの名前を選択します。[モデルの詳細] ページが表示されます。

    GCP Console でモデルを開く

  2. [モデルの詳細] ページの上部にある [新しいバージョン] ボタンをクリックします。[バージョンの作成] ページが表示されます。

  3. [名前] フィールドにバージョン名を入力します。必要に応じて、[説明] フィールドにバージョンの説明を入力します。

  4. 対応するプルダウン ボックスに、モデルのトレーニング方法に関連する次の情報を入力します。

    • モデルのトレーニングに使用した Python のバージョンを選択します。
    • フレームワークとフレームワーク バージョンを選択します。
    • ML ランタイムのバージョンを選択します。詳細については、AI Platform のランタイム バージョンをご覧ください。
  5. 必要に応じて、オンライン予測を実行するマシンタイプを選択します。このフィールドのデフォルトは「シングルコア CPU」です。

  6. [モデル URI] フィールドに、モデルファイルをアップロードした Cloud Storage バケットの場所を入力します。[参照] ボタンを使用すると、正しいパスを見つけることができます。

    モデルファイル自体のパスではなく、ファイルを含むディレクトリへのパスを指定してください。たとえば、gs://your_bucket_name/model-dir/saved_model.pbgs://your_bucket_name/model-dir/model.pkl ではなく gs://your_bucket_name/model-dir/ を使用します。

  7. オンライン予測デプロイの [スケーリング] オプションを選択します。

    • 自動スケーリングを選択すると、オプションの [ノードの最小数] フィールドが表示されます。サービスがスケールダウンしたときにも稼働し続けるノードの最小数を入力できます。このフィールドのデフォルトは 0 です。

    • 手動スケーリングを選択すると、常に稼働し続ける [ノードの数] を入力する必要があります。

      詳細については、予測費用の料金をご覧ください。

  8. モデル バージョンの作成を終了するには、[保存] をクリックします。

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 をご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Google Cloud 機械学習ドキュメント