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 の [モデル] セクションに移動し、まだ有効になっていない場合は [有効にする] をクリックします。

ステップ 2: Compute Engine API を有効にする
まだ有効になっていない場合は、[Compute Engine] に移動して [有効にする] を選択します。これはノートブック インスタンスを作成するために必要です。
ステップ 3: AI Platform Notebooks インスタンスを作成する
Cloud コンソールの AI Platform Notebooks セクションに移動し、[新しいインスタンス] をクリックします。次に、最新の Python インスタンス タイプを選択します。

デフォルトのオプションを使用して、[作成] をクリックします。インスタンスが作成されたら、[JUPYTERLAB を開く] を選択します。
ステップ 4: XGBoost をインストールする
JupyterLab インスタンスが開いたら、XGBoost パッケージを追加する必要があります。
そのためには、ランチャーからターミナルを選択します。

次に、次のコマンドを実行して、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 ドキュメントより)。

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

ステップ 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 コンソールのモデル セクションを確認します。新しいバージョンがデプロイされていることを確認します。

デプロイが正常に完了すると、読み込みスピナーがあった場所に緑色のチェックマークが表示されます。デプロイには 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 で、ノートブックを選択して [停止] を選択します。

このラボで作成したすべてのリソースを削除する場合は、ノートブック インスタンスを停止するのではなく、削除します。
Cloud コンソールのナビゲーション メニューで [ストレージ] に移動し、モデルアセットの保存用に作成した両方のバケットを削除します。