はじめに
AutoAIは、IBM Cloud上のサービスWatson StudioおよびOpenShiftベースの製品CP4D(Cloud Pak for Data)上で稼働する機械学習モデル自動構築ツールです。
第三部では「モデル構築編」で作成した機械学習モデルをWatson Machine Learing上のWebサービスとしてデプロイし、呼出しテストを行ってみます。
この他の「AutoAIでお手軽機械学習」シリーズの記事は以下の通りです。
AutoAIでお手軽機械学習(その1) 準備編
AutoAIでお手軽機械学習(その2) モデル構築編
AutoAIでお手軽機械学習(その4) Jupyter Notebook編
AutoAIでお手軽機械学習(その5) API編
[2020-01-27] 40,000件のテストデータを利用するシナリオに変更
[2020-03-16] githubのリポジトリ移動 & 汎用的な予測用コード追加
[2020-07-20] AutoAI日本語化に伴い全面的に更新
[2020-09-23] Watson MLのアーキテクチャ変更に伴い更新
[2020-11-03] cp4dタグ追加
デプロイメントスペースの作成
2020-09-01にWatson MLはアーキテクチャが変更になり、Webサービス作成のためにデプロイメント・スペースを定義することが必要になりました。デプロイメントスペースに関しては、下の図を見ていただくと概念がわかると思います。
従来 Watson Studioでは、成果物がすべてプロジェクトに保存される形になっていました。
実行環境であるWatson Machine Learningとしての、成果物の保存先がデプロイメント・スペースとして明確に定義される形になったのです。
プロジェクト管理画面の表示
最初に次のURLを指定して、Watson Studioにログインします。
https://dataplatform.cloud.ibm.com
ログイン後に、作成済みのプロジェクト管理画面を表示します。プロジェクトの選択手順は「その2」に記載しましたので、わからない方はそちらを参照してください。
デプロイメントスペース一覧表示
プロジェクト管理の画面が表示されたら、画面左上の「三」のような場所をクリックします。
下のようなメニューが出たら、「デプロイメントスペース」の一つ下の「すべてのスペースの表示」をクリックします。
デプロイメントスペースの新規作成
下のようなデプロイメントスペース一覧の画面が表示されますが、この段階ではまだ一つもデプロイメントスペースがないはずです。
画面右上の「New deployment space」のリンクをクリックします。
下のような画面が出てきますので、上の「空のスペースを作成」を選んで下さい。
名称は「space01」など、適当な名前を入力して画面右下の「作成」ボタンをクリックします。
下のような画面になりますので、しばらく待って下さい。
最終的に、次のような画面になればデプロイメント・スペースの作成に成功しています。右側の「新しいスペースの表示」をクリックして下さい。
Watson MLインスタンスとの関連付け
下のようなデプロイメントスペースの管理画面に遷移するので
① 一番右の「設定」タブを選択し、
② Watson MLの下の「Associate instance」のリンクをクリックします
下の画面になるので、
① ドロップダウンから関連付けるWatson MLのインスタンスを選択(多分1つしか選択できない)
② 「保存」をクリックします。
これで、デプロイメント・スペースの設定は完了しました。再び画面右上の「三」のアイコンをクリックし、今度はプロジェクト管理画面(My First Project)を選択します。これで、一番最初のプロジェクト管理画面に戻るはずです。
デプロイ手順
準備ができたので、前の記事で作ったAutoAIのモデルをWebサービス化します。
手順は
(1) モデルの保存
(2) モデルのプロモート
(3) モデルのデプロイ
の3段階になります。下の図を再掲しますので、それぞれのステップで何をやるのか理解して下さい。
(1) モデルの保存
左から2つめの「資産」タブに、「AutoAI実験」という欄があるはずです。その中で「その2」で作成したモデル「営業成約予測」のリンクをクリックします。
詳細画面の下の方に次のようなリストが出て来ます。
マウスポインタを、保存したいモデルの行に移動すると、次のような保存用ボタンが表示されます。
クリックすると、下の画面になるので、「モデル」を選択します。
次の画面が出てくるので、デフォルトの状態で画面右下の「保存」をクリックします。
保存に成功すると、画面右上に次のようなパネルが表示されます。
(2) モデルのプロモート
次のステップは、保存したモデルのプロモートです。
保存の成功を確認したら。画面上部の「マイ・プロジェクト」の右側のプロジェクト名の領域をクリックします。
ここをクリックすると、プロジェクト管理のメインメニューに遷移します。
「資産」タブであることを確認後、画面を下の方にスクロールすると、「Watson Machine Learningモデル」という項目が出てきて、先ほど保存したモデルが一覧に含まれているはずです。このリンクをクリックして下さい。
下のようなモデル管理画面が表示されます。
ここで、画面右上の「デプロイメント・スペースにプロモート」のリンクをクリックして下さい。
下のような画面に遷移します。「ターゲット・スペース」の欄に先ほど作ったデプロイメント・スペースが選ばれていることを確認した上で、画面右下の「プロモート」ボタンをクリックします。
プロモートに成功すると、下のような画面が表示されます。
(3)モデルのデプロイ
プロモートに成功したら、最後のステップはモデルのデプロイです。
ここで、再び、画面右上の「三」のアイコンをクリックし、下のメニューを表示させます。
今度は、事前に作成したデプロイメントスペース(図ではspace01)を選択します。
下のように資産タブの「モデル」の項目の中に先ほどプロモートしたモデルがあるはずです。そのリンクをクリックします。
下の画面に遷移するので、「デプロイメントの作成」ボタンをクリックします。
下のような「デプロイメントの作成」の画面になります。
この画面で
① デプロイメント・タイプとして「オンライン」を選択
② 名称を設定 (図ではbank-marketing-web
としています)
③ 画面右下の「作成」ボタンをクリック
すると、次のような画面が表示されます。最初は状況が「進行中」になっています。
しばらく待っていると、下のように状況が「デプロイ済み」に変化します。これで作ったモデルのWebサービス化が完了しました。
Webサービスのテスト
それでは、今デプロイしたWebサービスの呼び出しテストをしてみましょう。
最初に管理画面についている簡易テスト機能を利用してみます。
(1) 簡易テスト機能から項目値を入力してテストする
Watson Studioでは、生成したWeBサービスに簡易テスト機能がついていて、ここから簡単な呼び出しテストが可能です。まずは、この機能を使ってテストを実施してみましょう。
デプロイメントスペースの管理画面から
① 左から2つ目の「デプロイメント」タブを選択
② デプロイメントのリストから先ほど作ったWebサービス(下の図の場合bank-marketing-web
のリンクをクリックします。
下の画面になったら、右の「テスト」タブをクリックします。
次のような画面が出てくるので、一つ一つ項目をセットしていきます。
最後に予測ボタンをクリックします。
入力する値としては、例えば下の検証用CSVデータ(学習には使っていないデータ)の値を参考にしてください。
今回販促結果 = 成功 のテストデータ
項目名 | 値 |
---|---|
年齢 | 44 |
職業 | management |
婚姻 | divorced |
学歴 | tertiary |
債務不履行 | いいえ |
平均残高 | 2367 |
住宅ローン | いいえ |
個人ローン | いいえ |
連絡手段 | cellular |
最終通話日 | 22 |
最終通話月 | sep |
最終通話秒数 | 263 |
通話回数_販促中 | 1 |
前回販促後_経過日数 | 184 |
通話回数_販促前 | 6 |
前回販促結果 | success |
今回販促結果 = 失敗 のテストデータ
項目名 | 値 |
---|---|
年齢 | 46 |
職業 | blue-collar |
婚姻 | single |
学歴 | secondary |
債務不履行 | いいえ |
平均残高 | 0 |
住宅ローン | いいえ |
個人ローン | いいえ |
連絡手段 | unknown |
最終通話日 | 21 |
最終通話月 | may |
最終通話秒数 | 27 |
通話回数_販促中 | 10 |
前回販促後_経過日数 | -1 |
通話回数_販促前 | 0 |
前回販促結果 | unknown |
すべての項目の入力が終わったら、「予測」ボタンをクリックすると、予測結果がJSON形式で得られます。
下記に、予測結果例と、JSONデータの読み方を示します。
(2) 簡易テスト機能からjsonで一括テスト
上の方法でテストするのは、今回のモデルのように入力値が多い場合に煩雑です。このような場合、json形式データで複数のテストを同時に行うことができますので、今度はそのケースを試してみます。
下の画面で、JSON入力アイコンをクリックしてください。
JSONデータのサンプルは結果が「成功」のケース、「失敗」のケースそれぞれについて、テストデータから20件分とってきたものを下記に張り付けておきましたので、こちらをコピペして利用します。
今回販促結果 = 成功のテストデータ
{"input_data": [{"fields": ["年齢", "職業", "婚姻", "学歴", "債務不履行", "平均残高", "住宅ローン", "個人ローン", "連絡手段", "最終通話日", "最終通話月", "最終通話秒数", "通話回数_販促中", "前回販促後_経過日数", "通話回数_販促前", "前回販促結果"], "values": [[30, "technician", "single", "tertiary", "いいえ", 2325, "いいえ", "いいえ", "cellular", 10, "aug", 263, 1, 127, 7, "failure"], [44, "management", "divorced", "tertiary", "いいえ", 2367, "いいえ", "いいえ", "cellular", 22, "sep", 263, 1, 184, 6, "success"], [81, "retired", "married", "primary", "いいえ", 243, "いいえ", "いいえ", "cellular", 27, "oct", 131, 1, -1, 0, "unknown"], [27, "admin.", "married", "secondary", "いいえ", 897, "いいえ", "いいえ", "cellular", 5, "jun", 397, 1, -1, 0, "unknown"], [60, "retired", "married", "secondary", "いいえ", 523, "いいえ", "いいえ", "cellular", 11, "feb", 467, 1, 182, 3, "success"], [58, "retired", "divorced", "secondary", "いいえ", 1080, "はい", "いいえ", "cellular", 29, "jul", 1058, 2, -1, 0, "unknown"], [51, "blue-collar", "married", "primary", "いいえ", 541, "いいえ", "いいえ", "cellular", 11, "aug", 663, 3, -1, 0, "unknown"], [31, "services", "single", "secondary", "いいえ", 1027, "いいえ", "いいえ", "cellular", 2, "jul", 217, 3, -1, 0, "unknown"], [61, "self-employed", "married", "tertiary", "いいえ", 10861, "いいえ", "いいえ", "cellular", 25, "oct", 225, 1, 91, 5, "success"], [34, "admin.", "married", "secondary", "いいえ", 1406, "はい", "いいえ", "cellular", 20, "aug", 63, 2, 85, 1, "success"], [39, "technician", "single", "tertiary", "いいえ", 393, "いいえ", "いいえ", "cellular", 26, "mar", 281, 1, -1, 0, "unknown"], [35, "management", "single", "tertiary", "いいえ", 1618, "はい", "はい", "cellular", 7, "may", 542, 1, -1, 0, "unknown"], [57, "admin.", "single", "secondary", "いいえ", 2223, "いいえ", "いいえ", "cellular", 12, "aug", 1064, 1, -1, 0, "unknown"], [24, "self-employed", "single", "tertiary", "いいえ", 2984, "はい", "いいえ", "unknown", 27, "may", 935, 1, -1, 0, "unknown"], [35, "admin.", "divorced", "secondary", "いいえ", 1224, "はい", "いいえ", "cellular", 3, "nov", 187, 1, -1, 0, "unknown"], [22, "student", "single", "secondary", "いいえ", 254, "いいえ", "いいえ", "cellular", 13, "jan", 143, 2, -1, 0, "unknown"], [51, "management", "single", "tertiary", "いいえ", 151, "はい", "いいえ", "cellular", 8, "sep", 638, 1, 427, 3, "success"], [51, "blue-collar", "married", "primary", "いいえ", 0, "はい", "はい", "cellular", 25, "jul", 946, 3, -1, 0, "unknown"], [34, "blue-collar", "single", "primary", "いいえ", 79, "いいえ", "いいえ", "telephone", 10, "jul", 336, 4, -1, 0, "unknown"], [57, "admin.", "married", "secondary", "いいえ", 2120, "いいえ", "いいえ", "cellular", 19, "aug", 687, 4, -1, 0, "unknown"]]}]}
今回販促結果 = 失敗のテストデータ
{"input_data": [{"fields": ["年齢", "職業", "婚姻", "学歴", "債務不履行", "平均残高", "住宅ローン", "個人ローン", "連絡手段", "最終通話日", "最終通話月", "最終通話秒数", "通話回数_販促中", "前回販促後_経過日数", "通話回数_販促前", "前回販促結果"], "values": [[46, "blue-collar", "single", "secondary", "いいえ", 0, "いいえ", "いいえ", "unknown", 21, "may", 27, 10, -1, 0, "unknown"], [41, "technician", "married", "secondary", "いいえ", 352, "はい", "いいえ", "cellular", 18, "nov", 129, 2, -1, 0, "unknown"], [26, "student", "single", "tertiary", "いいえ", 641, "はい", "いいえ", "cellular", 15, "may", 55, 1, 368, 1, "failure"], [49, "housemaid", "married", "primary", "いいえ", 640, "いいえ", "いいえ", "telephone", 13, "aug", 214, 4, -1, 0, "unknown"], [46, "entrepreneur", "married", "tertiary", "いいえ", 406, "はい", "いいえ", "telephone", 15, "jul", 232, 4, -1, 0, "unknown"], [46, "blue-collar", "married", "primary", "いいえ", 225, "いいえ", "いいえ", "cellular", 22, "aug", 157, 6, -1, 0, "unknown"], [26, "student", "single", "secondary", "いいえ", 1164, "いいえ", "いいえ", "cellular", 9, "jul", 116, 1, 301, 1, "other"], [55, "retired", "married", "tertiary", "いいえ", 357, "はい", "いいえ", "cellular", 11, "aug", 526, 1, 103, 1, "failure"], [28, "technician", "single", "secondary", "いいえ", 3, "いいえ", "いいえ", "telephone", 18, "may", 40, 8, 349, 6, "failure"], [39, "admin.", "single", "secondary", "いいえ", 2040, "はい", "いいえ", "unknown", 2, "jun", 145, 2, -1, 0, "unknown"], [31, "blue-collar", "married", "primary", "いいえ", 7424, "はい", "いいえ", "unknown", 21, "oct", 54, 1, -1, 0, "unknown"], [34, "management", "married", "tertiary", "いいえ", -73, "はい", "いいえ", "cellular", 11, "jul", 90, 1, -1, 0, "unknown"], [44, "services", "married", "secondary", "いいえ", 3843, "はい", "いいえ", "cellular", 17, "nov", 70, 1, 150, 2, "other"], [39, "services", "married", "tertiary", "いいえ", 6497, "いいえ", "いいえ", "unknown", 18, "jun", 567, 1, -1, 0, "unknown"], [55, "retired", "married", "primary", "いいえ", -90, "はい", "はい", "unknown", 7, "may", 634, 2, -1, 0, "unknown"], [31, "blue-collar", "married", "secondary", "いいえ", 2591, "はい", "いいえ", "cellular", 20, "nov", 55, 1, -1, 0, "unknown"], [54, "services", "married", "secondary", "いいえ", 770, "いいえ", "いいえ", "cellular", 4, "aug", 151, 1, -1, 0, "unknown"], [46, "services", "married", "secondary", "いいえ", -522, "はい", "いいえ", "cellular", 31, "jul", 61, 2, -1, 0, "unknown"], [31, "technician", "married", "tertiary", "いいえ", 8, "いいえ", "いいえ", "unknown", 29, "may", 71, 5, -1, 0, "unknown"], [44, "unemployed", "married", "tertiary", "いいえ", 17747, "はい", "いいえ", "cellular", 5, "feb", 8, 7, -1, 0, "unknown"]]}]}
呼出し結果例を以下に示します。
今回作ったモデルでは正解が「成功」のデータ20件に対して正解となったのは10件、正解が「失敗」のデータ20件に対して、正解となったのは20件でした。
(3) Watson StudioのJupyter NotebookからAPIを利用して一括テスト
最後に、アプリケーションからAPIを使ってWebサービスを呼び出してみます。
シナリオとして、テスト用にリザーブしてある40,690件全件のデータに対する分類結果を、Watson StudioのJupyter Notebook上のPython から取得してみます。
Notebookのソース全体のリンクはこちら
Watson Studioのプロジェクト管理画面から先ほどと同じようにプロジェクトに追加をクリックします。
下の画面で今度は、Notebookを選択します。
下の画面で以下の入力をします。
① 「URLから」タブをクリック
② 名前の欄に 「営業成約予測モデルの精度評価」などの名称を入力
③ Notebook URLの欄に下記のURLを入力
④ 作成ボタンをクリック
入力するURL:
https://github.com/makaishi2/sample-data/raw/master/notebooks/bank-marketing-autoai-test.ipynb
読み込んだNotebook内ではAPIKeyの設定とAPIのScoring URL設定の2つのセルを設定します。
情報入手の手順はNotebook内に記載がありますので、そちらを参照して下さい。
設定後は shift+enter
でセルを順に実行してください。うまくいくと、40,690件の全テストデータに対して、モデルの予測結果がわかる形になります。
最後に、Notebook上で表示されるはずのグラフサンプルを紹介します。
混同行列
ROC AUC曲線
非常にきれいなROC曲線で面積の値も0.915なので、相当精度の高いモデルということができます。
モデルを使った場合と使わない場合の成約率の比較
モデル利用前には11.7%だった成約率は、モデル利用後には41.3%までアップする結果となりました。
これだけ精度がアップすれば、リアルなユースケースでも業務的に十分役に立ちそうです。
汎用的予測コード
AutoAIのモデル作成は本当にお手軽にできますが、予測に関してはAPI Callが必要で若干ハードルが高いです。そこで、学習時と同じフォーマットのCSVファイルを入力に、すべての行に対して予測し、結果をEXCELに保存する汎用的なサンプルコードを作りました。
このコードを活用していただければ、予測に関しても簡単に行うことができると思います。
コードのリンクは以下になります。
結果表のイメージを二値分類ケース、多値分類ケースそれぞれについて添付します。