scikit-learn でのオンライン予測の取得

このサンプルでは、国勢調査所得データセットに基づいて所得水準を予測するモデルをトレーニングします。モデルをローカルでトレーニングして保存したら、AI Platform にデプロイしてクエリでオンライン予測を取得します。

AI Platform に scikit-learn パイプラインをデプロイして実行できます。scikit-learn の Pipeline モジュールを使用すると、Estimator でトレーニングを行う前に複数のデータ変換を適用できます。これにより、データ処理の複数のステップがカプセル化され、各ステップで同じトレーニング データが使用されるようになります。

このチュートリアルは、GitHub で Jupyter ノートブックとして公開されています

AI Platform にモデルを公開する方法

AI Platform にモデルを公開して予測を取得するには、次の 5 つのステップを行います。

  • モデルをファイルに保存する。
  • 保存したモデルを Cloud Storage にアップロードする。
  • AI Platform にモデルリソースを作成する。
  • モデル バージョンを作成して、保存したモデルをリンクする。
  • オンライン予測を行う。

始める前に

次の操作を行って GCP アカウントを設定し、AI Platform API を有効にします。さらに、Cloud SDK をインストールして有効にします。

GCP プロジェクトの設定

  1. Google アカウントにログインします。

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

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

    [リソースの管理] ページに移動

  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 --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. コンソール ウィンドウの上部にある「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 を更新します。

    gcloud components update

フレームワークのインストール

macOS

仮想環境内で次のコマンドを実行して、scikit-learn、pandas をインストールします。

(cmle-env)$ pip install scikit-learn pandas

インストール オプションやトラブルシューティング情報などの詳細については、各フレームワークのインストール手順をご覧ください。

Cloud Shell

次のコマンドを実行して、scikit-learn、pandas をインストールします。

pip install --user scikit-learn pandas

インストール オプションやトラブルシューティング情報などの詳細については、各フレームワークのインストール手順をご覧ください。

データのダウンロード

このサンプルでトレーニングに使用している国勢調査所得データセットは、UC Irvine Machine Learning Repository でホストされています。詳しくは、データについてをご覧ください。

  • トレーニング ファイルは adult.data です。
  • 評価ファイルは adult.test です。

モデルのトレーニングと保存

モデルをトレーニングして保存する手順は次のとおりです。

  1. pandas DataFrame にデータを読み込み、scikit-learn で使用できるように準備します。
  2. scikit-learn で単純なモデルをトレーニングします。
  3. AI Platform にアップロード可能なファイルにモデルを保存します。

アップロードするモデルのトレーニングが完了している場合は、モデルをエクスポートする方法をご覧ください。

データを読み込んで変換する

scikit-learn Estimator をエクスポートする場合と同様の方法で、joblibpickle を使用して Pipeline オブジェクトをエクスポートできます。次の例では、パイプラインを使用して個々のカテゴリ別の特徴を数値に変換し、これらの値を組み合わせて、RandomForestClassifier を使用してモデルをトレーニングしています。

from sklearn.externals import joblib
import json
import numpy as np
import os
import pandas as pd
import pickle
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import FeatureUnion
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelBinarizer

# Define the format of your input data, including unused columns.
# These are the columns from the census data files.
COLUMNS = (
    'age',
    'workclass',
    'fnlwgt',
    'education',
    'education-num',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'capital-gain',
    'capital-loss',
    'hours-per-week',
    'native-country',
    'income-level'
)

# Categorical columns are columns that need to be turned into a numerical value to be used by scikit-learn
CATEGORICAL_COLUMNS = (
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country'
)

# Load the training census dataset
with open('./census_data/adult.data', 'r') as train_data:
    raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)

# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
train_features = raw_training_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
train_labels = (raw_training_data['income-level'] == ' >50K').as_matrix().tolist()

# Load the test census dataset
with open('./census_data/adult.test', 'r') as test_data:
    raw_testing_data = pd.read_csv(test_data, names=COLUMNS, skiprows=1)
# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
test_features = raw_testing_data.drop('income-level', axis=1).as_matrix().tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
test_labels = (raw_testing_data['income-level'] == ' >50K.').as_matrix().tolist()

# Since the census data set has categorical features, we need to convert
# them to numerical values. We'll use a list of pipelines to convert each
# categorical column and then use FeatureUnion to combine them before calling
# the RandomForestClassifier.
categorical_pipelines = []

# Each categorical column needs to be extracted individually and converted to a numerical value.
# To do this, each categorical column will use a pipeline that extracts one feature column via
# SelectKBest(k=1) and a LabelBinarizer() to convert the categorical value to a numerical one.
# A scores array (created below) will select and extract the feature column. The scores array is
# created by iterating over the COLUMNS and checking if it is a CATEGORICAL_COLUMN.
for i, col in enumerate(COLUMNS[:-1]):
    if col in CATEGORICAL_COLUMNS:
        # Create a scores array to get the individual categorical column.
        # Example:
        #  data = [39, 'State-gov', 77516, 'Bachelors', 13, 'Never-married', 'Adm-clerical',
        #         'Not-in-family', 'White', 'Male', 2174, 0, 40, 'United-States']
        #  scores = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        #
        # Returns: [['Sate-gov']]
        scores = []
        # Build the scores array
        for j in range(len(COLUMNS[:-1])):
            if i == j: # This column is the categorical column we want to extract.
                scores.append(1) # Set to 1 to select this column
            else: # Every other column should be ignored.
                scores.append(0)
        skb = SelectKBest(k=1)
        skb.scores_ = scores
        # Convert the categorical column to a numerical value
        lbn = LabelBinarizer()
        r = skb.transform(train_features)
        lbn.fit(r)
        # Create the pipeline to extract the categorical feature
        categorical_pipelines.append(
            ('categorical-{}'.format(i), Pipeline([
                ('SKB-{}'.format(i), skb),
                ('LBN-{}'.format(i), lbn)])))

# Create pipeline to extract the numerical features
skb = SelectKBest(k=6)
# From COLUMNS use the features that are numerical
skb.scores_ = [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
categorical_pipelines.append(('numerical', skb))

# Combine all the features using FeatureUnion
preprocess = FeatureUnion(categorical_pipelines)

# Create the classifier
classifier = RandomForestClassifier()

# Transform the features and fit them to the classifier
classifier.fit(preprocess.transform(train_features), train_labels)

# Create the overall model as a single pipeline
pipeline = Pipeline([
    ('union', preprocess),
    ('classifier', classifier)
])

モデルをエクスポートする

モデルをエクスポートするには、下記のように joblib または Python pickle ライブラリを使用します。

joblib

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

pickle

# Export the model to a file
with open('model.pkl', 'wb') as model_file:
  pickle.dump(pipeline, model_file)

モデルファイルの命名規則

Cloud Storage にアップロードする保存済みモデルのファイル名は、使用したライブラリに応じて、model.pkl または model.joblib にする必要があります。この制限により、AI Platform はエクスポート時と同じパターンを使用して、インポート時にモデルを再構築できます。

モデルのエクスポートに使用するライブラリ 正しいモデル名
pickle model.pkl
joblib model.joblib

モデルを今後繰り返し利用する場合は、それぞれの新しいモデルに専用のディレクトリが存在するよう Cloud Storage バケットを整理してください。

モデルの Cloud Storage への保存

このチュートリアルでは、AI Platform に使用しているのと同じプロジェクトで専用の Cloud Storage バケットを使用する方法が最も簡単です。

別のプロジェクトのバケットを使用している場合は、AI Platform サービス アカウントで Cloud Storage のモデルにアクセスできるようにする必要があります。適切な権限がないと、AI Platform モデル バージョンの作成リクエストが失敗します。詳しくは、ストレージの権限の付与をご覧ください。

Cloud Storage バケットの設定

このセクションでは、新しいバケットの作成方法を説明します。既存のバケットを使用することもできますが、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 環境変数を設定します。

    たとえば、次のコードは REGION を作成して、その値を us-central1 に設定します。

    REGION=us-central1
  4. 新しいバケットを作成します。

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

    注: 使用するリージョンは、AI Platform ジョブを実行するリージョンと同一にしてください。この例では us-central1 を使用しています。「使ってみる」の説明でこのリージョンが使用されているためです。

エクスポートしたモデルファイルを Cloud Storage にアップロードする

次のコマンドを実行して、保存したモデルファイルを Cloud Storage のバケットにアップロードします。

gsutil cp ./model.joblib gs://your_bucket_name/model.joblib

予測で使用するデータのフォーマット

オンライン予測のリクエストを送信する前に、AI Platform 予測サービスで使用できるようにテストデータをフォーマットする必要があります。入力インスタンスの形式は、モデルの想定と一致させる必要があります。

gcloud

1 行に 1 つの入力インスタンスを記述して input.json ファイルを作成します。次の例では、前のステップで定義した test_features リストの最初の 10 個のデータ インスタンスを使用しています。

    [25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"]
    [38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"]
    [28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"]
    [44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"]
    [18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"]
    [34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"]
    [29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"]
    [63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"]
    [24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"]
    [55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]

入力インスタンスの形式は、モデルの想定と一致させる必要があります。この例では、Census モデルに 14 個の特徴が必要なため、入力は形状の行列(num_instances, 14)でなければなりません。

REST API

1 行に 1 つの入力インスタンスを記述して input.json ファイルを作成します。次の例では、前のステップで定義した test_features リストの最初の 10 個のデータ インスタンスを使用しています。

{
  "instances": [

    [25, "Private", 226802, "11th", 7, "Never-married", "Machine-op-inspct", "Own-child", "Black", "Male", 0, 0, 40, "United-States"],
    [38, "Private", 89814, "HS-grad", 9, "Married-civ-spouse", "Farming-fishing", "Husband", "White", "Male", 0, 0, 50, "United-States"],
    [28, "Local-gov", 336951, "Assoc-acdm", 12, "Married-civ-spouse", "Protective-serv", "Husband", "White", "Male", 0, 0, 40, "United-States"],
    [44, "Private", 160323, "Some-college", 10, "Married-civ-spouse", "Machine-op-inspct", "Husband", "Black", "Male", 7688, 0, 40, "United-States"],
    [18, "?", 103497, "Some-college", 10, "Never-married", "?", "Own-child", "White", "Female", 0, 0, 30, "United-States"],
    [34, "Private", 198693, "10th", 6, "Never-married", "Other-service", "Not-in-family", "White", "Male", 0, 0, 30, "United-States"],
    [29, "?", 227026, "HS-grad", 9, "Never-married", "?", "Unmarried", "Black", "Male", 0, 0, 40, "United-States"],
    [63, "Self-emp-not-inc", 104626, "Prof-school", 15, "Married-civ-spouse", "Prof-specialty", "Husband", "White", "Male", 3103, 0, 32, "United-States"],
    [24, "Private", 369667, "Some-college", 10, "Never-married", "Other-service", "Unmarried", "White", "Female", 0, 0, 40, "United-States"],
    [55, "Private", 104996, "7th-8th", 4, "Married-civ-spouse", "Craft-repair", "Husband", "White", "Male", 0, 0, 10, "United-States"]
  ]
}

入力インスタンスの形式は、モデルの想定と一致させる必要があります。この例では、Census モデルに 14 個の特徴が必要なため、入力は形状の行列(num_instances, 14)でなければなりません。

詳細については、オンライン予測の入力形式をご覧ください。

ローカル予測を使用したモデルのテスト

gcloud を使用して、ローカル予測用にモデルをデプロイできます。このオプションの手順を実行することにより、モデルを AI Platform にデプロイする前にモデルのサニティ チェックを行うことができます。これは時間を節約するのに役立ちます。Cloud Storage にアップロードしたモデルファイルを使用すると、オンライン予測をローカルで実行し、AI Platform 予測サーバーから返される結果のプレビューを取得できます。

トレーニング機能とサービング機能の不一致をデバッグするには、テストデータの小規模なサブセットを使用してローカル予測を行います。たとえば、予測リクエストで送信したデータがモデルでの想定と一致しない場合は、クラウドのオンライン予測リクエストのコストが発生する前に、そのことを検出できます。

gcloud ai-platform local predict の使用に関する詳細をご覧ください。

  1. モデル("gs://your-bucket/")、フレームワーク、入力ファイル名が含まれる、Cloud Storage ディレクトリ用の環境変数をまだ設定していない場合は、設定します。

    MODEL_DIR="gs://your-bucket/"
    INPUT_FILE="input.json"
    FRAMEWORK="SCIKIT_LEARN"
    
  2. 予測リクエストを送信します。

    gcloud ai-platform local predict --model-dir=$MODEL_DIR \
        --json-instances $INPUT_FILE \
        --framework $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: エクスポートされたモデルファイルが保存されているディレクトリのパス。モデルファイル自体のパスではなく、ファイルを含むディレクトリへのパスを指定してください。

    • モデルのパス - gs://your_bucket_name/model.pkl
    • モデルを含むディレクトリのパス - gs://your_bucket_name/

    このディレクトリの合計サイズは 250 MB 以下にする必要があります。

  • framework: SCIKIT_LEARN または XGBOOST

  • runtimeVersion: scikit-learn と XGBoost をサポートするランタイム バージョンが使用されていることを確認するには、「1.4」以上に設定する必要があります。

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

上記の各パラメータの詳細については、バージョン リソースの 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/model.pkl ではなく、gs://your_bucket_name/model-dir/ を使用します。

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

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

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

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

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

gcloud

  1. モデルバイナリが配置されている Cloud Storage ディレクトリへのパス、モデル名、バージョン名、使用するフレームワークを格納する環境変数を設定します。

    [VALUES_IN_BRACKETS] は、適切な値に置き換えます。

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

  2. バージョンを作成します。

    gcloud ai-platform versions create $VERSION_NAME \
      --model $MODEL_NAME \
      --origin $MODEL_DIR \
      --runtime-version=1.13 \
      --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: SCIKIT_LEARN
    machineType: mls1-highmem-1
    name: projects/[YOUR-PROJECT-ID]/models/[YOUR-MODEL-NAME]/versions/[YOUR-VERSION-NAME]
    pythonVersion: '3.5'
    runtimeVersion: '1.13'
    state: READY

REST API

  1. リクエスト本文の形式を整え、バージョン オブジェクトを追加します。この例では、バージョン namedeploymentUriruntimeVersionframework を指定しています。[VALUES_IN_BRACKETS] は適切な値に置き換えます。

      {
        "name": "[YOUR-VERSION-NAME]",
        "deploymentUri": "gs://your_bucket_name/"
        "runtimeVersion": "1.13"
        "framework": "SCIKIT_LEARN"
        "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.13", "framework": "SCIKIT_LEARN", "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.13",
            "framework": "SCIKIT_LEARN",
            "machineType": "mls1-highmem-1",
            "pythonVersion": "3.5"
          }
        }
      }
    

オンライン予測リクエストの送信

バージョンが正常に作成されると、AI Platform が予測リクエストを処理する新しいサーバーを起動します。

このセクションでは、次の方法を説明します。

  1. gcloud を使用して、小規模なデータセットに対するリクエストを送信し、モデルをテストする方法。
  2. Python クライアント ライブラリを使用して、完全なテスト データセットに対する複数のリクエストを送信し、最初の 10 件の結果を表示する方法。

gcloud

このセクションでは、前のステップで作成した input.json ファイルを使用して予測リクエストを送信する方法について説明します。

  1. モデル名、バージョン名、入力ファイル名を環境変数に設定します。[VALUES_IN_BRACKETS] は、適切な値に置き換えます。

    MODEL_NAME="[YOUR-MODEL-NAME]"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    INPUT_FILE="input.json"
    
  2. 予測リクエストを送信します。

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

    個人の年間所得が $50,000 を超えると予測された場合、True が返されます。それ以外の場合は False が返されます。たとえば、最初の 10 個の結果は次のように表示されます。

    [False, False, False, True, False, False, False, False, False, False]
    

REST API

このセクションでは、前のステップで作成した input.json ファイルを使用して予測リクエストを送信する方法について説明します。

予測リクエストを送信します。

curl -X POST -H "Content-Type: application/json" -d @input.json \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
"https://ml.googleapis.com/v1/projects/${PROJECT_ID}/models/${MODEL_NAME}/versions/${VERSION_NAME}:predict"

個人の年間所得が $50,000 を超えると予測された場合、True が返されます。それ以外の場合は False が返されます。コンソールでは予測結果がブール値のリストとして表示されます。たとえば、最初の 10 個の結果は次のように表示されます。

{"predictions": [false, false, false, true, false, false, false, false, false, false]}

Python

このサンプルでは、Python クライアント ライブラリを使用して Census データセット全体に対する予測リクエストを送信し、最初の 10 個の結果を出力します。ライブラリの使用方法については、Python クライアント ライブラリをご覧ください。

[VALUES_IN_BRACKETS] は、適切な値に置き換えます。

import googleapiclient.discovery

# Fill in your PROJECT_ID, VERSION_NAME and MODEL_NAME before running
# this code.

PROJECT_ID = [YOUR PROJECT_ID HERE]
VERSION_NAME = [YOUR VERSION_NAME HERE]
MODEL_NAME = [YOUR MODEL_NAME HERE]

service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}'.format(PROJECT_ID, MODEL_NAME)
name += '/versions/{}'.format(VERSION_NAME)

# Due to the size of the data, it needs to be split in 2
first_half = test_features[:int(len(test_features)/2)]
second_half = test_features[int(len(test_features)/2):]

complete_results = []
for data in [first_half, second_half]:
    responses = service.projects().predict(
        name=name,
        body={'instances': data}
    ).execute()

    if 'error' in responses:
        print(response['error'])
    else:
        complete_results.extend(responses['predictions'])

# Print the first 10 responses
for i, response in enumerate(complete_results[:10]):
    print('Prediction: {}\tLabel: {}'.format(response, test_labels[i]))

個人の年間所得が $50,000 を超えると予測された場合、True が返されます。それ以外の場合は False が返されます。たとえば、最初の 10 個の結果は次のように表示されます。

Prediction: False Label: False
Prediction: False Label: False
Prediction: True  Label: True
Prediction: True  Label: True
Prediction: False Label: False
Prediction: False Label: False
Prediction: False Label: False
Prediction: True  Label: True
Prediction: False Label: False
Prediction: False Label: False

各入力パラメータの詳細については、AI Platform API の予測リクエストの詳細をご覧ください。

データについて

このサンプルでトレーニングに使用している国勢調査所得データセットは、UC Irvine Machine Learning Repository でホストされています。

国勢調査データ転載元: Lichman, M. (2013). UCI Machine Learning Repository http://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and Computer Science. このデータセットは、データセット ソース(http://archive.ics.uci.edu/ml)で指定される次の条件の下ですべてのユーザーが使用できるように公開されています。Google はこのデータセットを「現状有姿」で提供し、明示または黙示を問わず、いかなる保証も行いません。Google は、このデータセットの使用で、直接または間接の損害が発生したとしても一切の責任を負いません。

次のステップ

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

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

scikit-learn と XGBoost の AI Platform