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 パッケージをインポートする

ノートブックの最初のセルに次のインポートを追加し、セルを実行します。実行するには、上部メニューの右矢印ボタンを押すか、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 は、ディシジョン ツリー勾配ブーストを使用して予測モデルを構築する機械学習フレームワークです。これは、ツリー内のさまざまなリーフノードに関連付けられたスコアに基づいて、複数のディシジョン ツリーをアンサンブルすることで機能します。

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

fb061cd8c8f69999.png

このモデルに XGBoost を使用する理由従来のニューラル ネットワークは画像やテキストなどの非構造化データで最高のパフォーマンスを発揮することが示されていますが、ディシジョン ツリーは、この Codelab で使用する住宅ローン データセットなどの構造化データで非常に優れたパフォーマンスを発揮することがよくあります。

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

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

XGBoost でのモデルの作成は簡単です。XGBRegressor クラスを使用してモデルを作成します。特定のタスクに適切な objective パラメータを渡すだけで済みます。ここでは、数値(新生児の体重)を予測するため、回帰モデルを使用しています。赤ちゃんが 6 ポンドより重いか軽いかを判断するためにデータをバケット化する場合は、分類モデルを使用します。

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

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

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

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

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 Console のストレージ ブラウザに移動して、ファイルがコピーされたことを確認します。

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 コンソールのナビゲーション メニューで [ストレージ] に移動し、モデルアセットの保存用に作成した両方のバケットを削除します。