Cloud AI Platform での XGBoost モデルの構築、トレーニング、デプロイ

1. 概要

このラボでは、GCP で ML ワークフロー全体を一通り見ていきます。Cloud AI Platform Notebooks 環境から、BigQuery の一般公開データセットからデータを取り込み、XGBoost モデルを構築してトレーニングし、そのモデルを AI Platform にデプロイして予測を行います。

学習内容

次の方法を学習します。

  • AI Platform Notebooks で BigQuery データセットを取り込んで分析する
  • XGBoost モデルを構築する
  • XGBoost モデルを AI Platform にデプロイして予測を取得する

このラボを Google Cloud で実行するための総費用は約 $1 です。

2. 環境を設定する

この Codelab を実行するには、課金が有効になっている Google Cloud Platform プロジェクトが必要です。プロジェクトを作成するには、こちらの手順に沿って操作してください。

ステップ 1: Cloud AI Platform Models API を有効にする

まだ有効になっていない場合は、Cloud コンソールの [AI Platform モデル] セクションに移動して [有効にする] をクリックします。

d0d38662851c6af3.png

ステップ 2: Compute Engine API を有効にする

まだ有効になっていない場合は、[Compute Engine] に移動して [有効にする] を選択します。これはノートブック インスタンスを作成するために必要です。

ステップ 3: AI Platform Notebooks インスタンスを作成する

Cloud コンソールの [AI Platform Notebooks] セクションに移動し、[新しいインスタンス] をクリックします。最新の Python インスタンス タイプを選択します。

a81c82876c6c16f9.png

デフォルトのオプションを使用して、[作成] をクリックします。インスタンスが作成されたら、[JupyterLab を開く] を選択します。

ステップ 4: XGBoost をインストールする

JupyterLab インスタンスが開いたら、XGBoost パッケージを追加する必要があります。

ランチャーから [ターミナル] を選択します。

28dcf2790ce77c96.png

次のコマンドを実行して、AI Platform でサポートされている XGBoost の最新バージョンをインストールします。

pip3 install xgboost==0.82

完了したら、ランチャーから Python 3 ノートブック インスタンスを開きます。これで、ノートブックで作業を開始する準備ができました。

ステップ 5: Python パッケージをインポートする

ノートブックの最初のセルに次の import を追加してセルを実行します。実行するには、上部のメニューで右矢印ボタンを押すか、Command+Enter キーを押します。

import pandas as pd
import xgboost as xgb
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery

3. BigQuery データセットの探索

BigQuery では、多くのデータセットが一般公開されています。このラボでは、出生率データセットを使用します。これには、子供の出生時体重や新生児の両親のユーザー属性情報など、米国での 40 年間にわたるほぼすべての出生に関するデータが含まれています。特徴のサブセットを使用して、新生児の出生時体重を予測します。

ステップ 1: BigQuery データをノートブックにダウンロードする

BigQuery 用の Python クライアント ライブラリを使用して、データを Pandas DataFrame にダウンロードします。元のデータセットは 21 GB で、1 億 2,300 万行が含まれています。簡潔にするために、データセットの 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 対 50 のバランスになっているようです。

4. トレーニング用データを準備する

このセクションでは、データをトレーニング セットとテストセットに分割して、モデルのトレーニング用に準備します。

ステップ 1: ラベル列を抽出する

まず、データセットから null 値を持つ行を削除し、データをシャッフルします。

df = df.dropna()
df = shuffle(df, random_state=2)

次に、ラベル列を別の変数に抽出し、特徴のみを含む DataFrame を作成します。

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])

data.head() を実行してデータセットをプレビューすると、トレーニングに使用する 4 つの特徴が表示されます。

ステップ 2: カテゴリ特徴を整数に変換する

XGBoost ではすべてのデータが数値である必要があるため、is_male 列のデータの表現方法を変更する必要があります。この列は現在、True / False の文字列です。これは、列の型を変更するだけで実行できます。

data['is_male'] = data['is_male'].astype(int)

ステップ 3: データをトレーニング セットとテストセットに分割する

ノートブックの最初にインポートした Scikit Learn の train_test_split ユーティリティを使用して、データをトレーニング セットとテストセットに分割します。

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

これで、モデルを構築してトレーニングする準備が整いました。

5. XGBoost の概観

XGBoost: ディシジョン ツリー勾配ブーストを使用して予測モデルを構築する ML フレームワーク。ツリー内の異なるリーフノードに関連付けられたスコアに基づいて、複数のディシジョン ツリーをアンサンブルします。

下の図は、特定のコンピュータ ゲームが気に入るかどうかを評価するモデルのアンサンブル ツリー ネットワークを簡略化したものです(これは XGBoost のドキュメントから引用しています)。

fb061cd8c8f69999.png

このモデルに XGBoost を使用する理由従来のニューラル ネットワークは、画像やテキストなどの非構造化データに対して最高のパフォーマンスを発揮することがわかっていますが、ディシジョン ツリーは多くの場合、この Codelab で使用する住宅ローンのデータセットのような構造化データに対して非常に効果的です。

6. XGBoost モデルの構築、トレーニング、評価

ステップ 1: XGBoost モデルを定義してトレーニングする

XGBoost でモデルを作成するのは簡単です。モデルの作成には XGBRegressor クラスを使用します。必要な操作は、特定のタスクに適した objective パラメータを渡すことだけです。ここでは数値(新生児の体重)を予測するため、回帰モデルを使用しています。データをバケット化して赤ちゃんの体重が 12 kg を上回っているか下回っているかを判断する場合は、分類モデルを使用します。

この場合、モデルの目標として reg:squarederror を使用します。

次のコードは、XGBoost モデルを作成します。

model = xgb.XGBRegressor(
    objective='reg:linear'
)

1 行のコードでモデルをトレーニングできます。fit() メソッドを呼び出して、トレーニング データとラベルを渡します。

model.fit(x_train, y_train)

ステップ 2: テストデータでモデルを評価する

これで、トレーニング済みモデルを使用し、predict() 関数でテストデータの予測を生成できます。

y_pred = model.predict(x_test)

テストセットの最初の 20 個の値でモデルがどのように機能したかを見てみましょう。以下では、各テスト例について、予測された新生児の体重と実際の新生児の体重を出力します。

for i in range(20):
    print('Predicted weight: ', y_pred[i])
    print('Actual weight: ', y_test.iloc[i])
    print()

ステップ 3: モデルを保存する

モデルをデプロイするには、次のコードを実行してローカル ファイルに保存します。

model.save_model('model.bst')

7. Cloud AI Platform にモデルをデプロイする

モデルをローカルで動作させることができましたが、このノートブックだけでなく、どこからでもモデルに対して予測を実行できれば便利です。このステップでは、クラウドにデプロイします。

ステップ 1: モデル用の Cloud Storage バケットを作成する

まず、この Codelab の残りの部分で使用する環境変数を定義しましょう。Google Cloud プロジェクトの名前、作成する Cloud Storage バケットの名前(グローバルに一意であることが必要)、モデルの最初のバージョンのバージョン名を以下の値に入力します。

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'baby_weight'

これで、XGBoost モデルファイルを保存するストレージ バケットを作成する準備が整いました。デプロイ時に、Cloud AI Platform にこのファイルを指定します。

ノートブック内から次の gsutil コマンドを実行して、バケットを作成します。

!gsutil mb $MODEL_BUCKET

ステップ 2: モデルファイルを Cloud Storage にコピーする

次に、XGBoost の保存済みモデルファイルを Cloud Storage にコピーします。次の gsutil コマンドを実行します。

!gsutil cp ./model.bst $MODEL_BUCKET

Cloud コンソールの Storage ブラウザに移動して、ファイルがコピーされたことを確認します。

31e2567fa0117214.png

ステップ 3: モデルを作成してデプロイする

次の ai-platform gcloud コマンドを実行すると、プロジェクトに新しいモデルが作成されます。これを xgb_mortgage とします。

!gcloud ai-platform models create $MODEL_NAME

次に、モデルをデプロイします。そのためには、次の gcloud コマンドを使用します。

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT

その間に、AI Platform コンソールの [モデル] セクションを確認します。新しいバージョンがデプロイされていることを確認します。

a431661f9c3e6cb2.png

デプロイが正常に完了すると、読み込み中アイコンがある場所に緑色のチェックマークが表示されます。デプロイには 2 ~ 3 分かかります。

ステップ 4: デプロイしたモデルをテストする

デプロイしたモデルが機能していることを確認するには、gcloud を使用してテストし、予測を行います。まず、テストセットの 2 つの例を含む JSON ファイルを保存します。

%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]

次の gcloud コマンドの出力を変数に保存し、出力して、モデルをテストします。

prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)

モデルの予測が出力に表示されます。この 2 つの例の実際の赤ちゃんの体重は、それぞれ 1.9 ポンドと 8.1 ポンドです。

8. クリーンアップ

このノートブックを引き続き使用する場合は、未使用時にオフにすることをおすすめします。Cloud コンソールの Notebooks UI で、ノートブックを選択して [停止] を選択します。

879147427150b6c7.png

このラボで作成したすべてのリソースを削除する場合は、ノートブック インスタンスを停止するのではなく削除します。

Cloud コンソールのナビゲーション メニューで [ストレージ] に移動し、モデルアセットを保存するために作成した両方のバケットを削除します。