1. はじめに
- Analyzing a financial ML model deployed on AI Platform with the What-If Toolのチュートリアルをやります。
- ただ日本語にしただけの記事です。
2. 環境セットアップ
Step 0: プロジェクトの作成
- リソース管理のページに行く
- [プロジェクトを作成]
- プロジェクト名を入力して[作成]クリック
Step 1: Cloud AI Platform Models APIの有効化
- AI Platform Models sectionに移動
- [APIを有効にする]をクリック
Step 2: Compute Engine APIの有効化
- Compute Engineのページに移動
- [有効にする]をクリック
Step 3: AI Platform Notebooksインスタンスの作成
- AI Platform Notebooksセクションに移動
- [ノートブック]-[新しいインスタンス]から最新のTF 1.xの without GPUsを選択して作成
- インスタンス名を入力して、[作成]をクリック
- インスタンスが作成できたら、[JUPYTERLABを開く]をクリック
Step 4: XGBoostのインストール
XGBoostパッケージをターミナルから追加していきます。
$ 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行をプレビューします。以下のような感じです。
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()
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でコピーされたことを確認することができます。
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で新しいバージョンがデプロイされている様子が見れます。
デプロイ完了まで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)
続く・・・