LoginSignup
7
11

More than 3 years have passed since last update.

Google Cloud AI Platform、What-if Toolを使ってみた①

Last updated at Posted at 2019-11-27

1. はじめに

2. 環境セットアップ

Step 0: プロジェクトの作成

  1. リソース管理のページに行く
  2. [プロジェクトを作成]
  3. プロジェクト名を入力して[作成]クリックスクリーンショット 2019-11-27 10.14.00.png

Step 1: Cloud AI Platform Models APIの有効化

  1. AI Platform Models sectionに移動
  2. [APIを有効にする]をクリックスクリーンショット 2019-11-27 10.18.39.png

Step 2: Compute Engine APIの有効化

  1. Compute Engineのページに移動
  2. [有効にする]をクリックスクリーンショット 2019-11-27 10.20.42.png

Step 3: AI Platform Notebooksインスタンスの作成

  1. AI Platform Notebooksセクションに移動
  2. [ノートブック]-[新しいインスタンス]から最新のTF 1.xwithout GPUsを選択して作成スクリーンショット 2019-11-27 10.25.29.png
  3. インスタンス名を入力して、[作成]をクリックスクリーンショット 2019-11-27 10.31.09.png
  4. インスタンスが作成できたら、[JUPYTERLABを開く]をクリックスクリーンショット 2019-11-27 10.34.29.png

Step 4: XGBoostのインストール

XGBoostパッケージをターミナルから追加していきます。
1. [Terminal]をクリックスクリーンショット 2019-11-27 10.36.42.png
2. コマンド実行

$ pip3 install xgboost

準備完了です。(結構時間かかります。)

Step 5: Pythonパッケージのインポート

notebookの最初のセルに以下のimport文を記述して実行してください。

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

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.utils import shuffle
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

3. データのダウンロードと前処理

mortgageデータセットをXGBoostモデルで学習します。事前に処理された小サイズバージョンを使います。このモデルは住宅ローンを承認できるか否かの判別をします。

Step 1: 事前処理データのダウンロード

Google Cloud Storageからデータセットを取得できます。Jupyter notebookでgsutilコマンドを実行してダウンロードします。

!gsutil cp 'gs://mortgage_dataset_files/mortgage-small.csv' .

Step 2: Pandasを使ってデータセットを読込

まずdatatypeを定義するdictionaryを作成します。

COLUMN_NAMES = collections.OrderedDict({
 'as_of_year': np.int16,
 'agency_code': 'category',
 'loan_type': 'category',
 'property_type': 'category',
 'loan_purpose': 'category',
 'occupancy': np.int8,
 'loan_amt_thousands': np.float64,
 'preapproval': 'category',
 'county_code': np.float64,
 'applicant_income_thousands': np.float64,
 'purchaser_type': 'category',
 'hoepa_status': 'category',
 'lien_status': 'category',
 'population': np.float64,
 'ffiec_median_fam_income': np.float64,
 'tract_to_msa_income_pct': np.float64,
 'num_owner_occupied_units': np.float64,
 'num_1_to_4_family_units': np.float64,
 'approved': np.int8
})

定義したdatatypeに沿って、DataFrameを作成します。オリジナルのデータセットはsortされているので、shuffle(sklearnの)するのがポイントです。

data = pd.read_csv(
 'mortgage-small.csv',
 index_col=False,
 dtype=COLUMN_NAMES
)
data = data.dropna()
data = shuffle(data, random_state=2)
data.head()

data.head()で最初の5行をプレビューします。以下のような感じです。
スクリーンショット 2019-11-27 12.58.06.png

approvedカラムが予測対象です。1が承認、0が否認を示します。

approvedの分散度合いを見るために、以下のコマンドを実行します。

# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())

labels = data['approved'].values
data = data.drop(columns=['approved'])

66%くらいが承認となっているはずです。

Step 3: カテゴリカル値のダミーカラムを作成

このデータセットはカテゴリカル値を含みますが、XGBoostは数値のみしか扱えません。pandasのget_dummiesを使ってon-hot encodingで変換します。

ダミーカラムの作成のために以下のコマンドを実行します。

dummy_columns = list(data.dtypes[data.dtypes == 'category'].index)
data = pd.get_dummies(data, columns=dummy_columns)
data.head()

purchaser_typeが変換された後の様子
スクリーンショット 2019-11-27 13.07.10.png

Step 4: 訓練データとテストデータの分割

訓練データとテストデータに分割することは機械学習では重要なコンセプトです。データの大半を訓練データに使って、後ほど残りをテストデータに使います。

Scikit Learnのfunctionのtrain_test_splitを使う以下のコードを実行します。

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

学習前の準備が終わりました。

4. XGBoostモデルのビルド、学習、評価

Step 1: XGBoostモデルの定義

モデルの作成はとてもシンプルです。XGBClassifierを使ってモデルを作り、objectiveに目的のアルゴリズムを指定します。今回は単純な2値のクラス分類で、ロジスティック回帰を指定します。reg:logisticを使います。

model = xgb.XGBClassifier(
    objective='reg:logistic'
)

fit()で学習を実行します。

model.fit(x_train, y_train)

学習は数分かかります。

Step 2: モデルのaccuracyを評価

predict()を使って予測をします。
Scikit Learnのaccuracy_scoreを使って、accuracyを計算します。

y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred.round())
print(acc, '\n')

だいたい87%くらいになるはずです。

Step 3: モデルの保存

モデルをデプロイするために以下のコードでローカルにモデルを保存します。

model.save_model('model.bst')

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

ローカルで動いたモデルをクラウドにデプロイします。

Step 1: Cloud Storage bucketの作成

まずは環境変数の定義をします。

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'financial-ml-260301'
MODEL_BUCKET = 'gs://financial_ml_bucket'
VERSION_NAME = 'v1'

XGBoostモデルファイルをCloud AI Platformに格納する準備ができました。

gsutilコマンドを実行してbucketを作成します。

!gsutil mb $MODEL_BUCKET

Step 2: モデルをCloud Storageにコピー

以下のコマンドでモデルファイルをCloud Storageにコピーします。

!gsutil cp ./model.bst $MODEL_BUCKET

google cloud consoleのstorage browserでコピーされたことを確認することができます。スクリーンショット 2019-11-27 13.32.50.png

Step 3: モデルの作成とデプロイ

最初にgcloud CLIでprojectの設定をします。

!gcloud config set project $GCP_PROJECT

ai-platformコマンドで新しいモデルを作成します。xgb_mortgageと呼びます。

!gcloud ai-platform models create xgb_mortgage

以下のコマンドでモデルをデプロイします。

!gcloud ai-platform versions create $VERSION_NAME \
--model=xgb_mortgage \
--framework='XGBOOST' \
--runtime-version=1.14 \
--origin=$MODEL_BUCKET \
--python-version=3.5 \
--project=$GCP_PROJECT

AI Platform consoleのmodel sectionで新しいバージョンがデプロイされている様子が見れます。
スクリーンショット 2019-11-27 13.45.35.png

デプロイ完了まで2ー3分かかります。

Step 4: デプロイしたモデルのテスト

テストセットをJSONファイルで保存します。

%%writefile predictions.json
[2016.0, 1.0, 346.0, 27.0, 211.0, 4530.0, 86700.0, 132.13, 1289.0, 1408.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0]

以下のコードでモデルのテストを実行します。

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

1に近い値が出力され、承認が予測できていると思います。

6. What-if Toolによるモデルの解釈

Step 1: What-if Toolの可視化

What-if Toolに接続するため、テストセットのサブセットが必要です。Numpy arrayを500作成しましょう。

num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples].values,y_test[:num_wit_examples].reshape(-1,1)))

WitConfigBuilderを使っていきます。今回のモデルは2クラススコアが期待できるので、任意のadjust_predictionパラメータを使います。以下のコードで正しいフォーマットに変換します。

def adjust_prediction(pred):
  return [1 - pred, pred]

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
  .set_ai_platform_model(GCP_PROJECT, MODEL_NAME, VERSION_NAME, adjust_prediction=adjust_prediction)
  .set_target_feature('mortgage_status')
  .set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)

以下のような図が表示されます。
スクリーンショット 2019-11-27 14.00.24.png

続く・・・

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11