はじめに
前回の記事では、サンプルデータセットを使用してClassificationの機械学習のモデルをトレーニング(学習)し、その精度を評価しました。実装というほどの実装はほとんどすることなく、機械学習のモデルをトレーニングできました。このわかりやすく、かつ構築の簡単さがAzure Machine Learningの最大のメリットです。
さて前回までの内容は、機械学習のモデルをトレーニングするところまででした。今回は、前回トレーニングした機械学習モデルを外部から使用できるようにWebサービスを公開します。
前回の状態の確認
まずは前回記事で作成した状態を確認しましょう。前回は「Adult Census Income Binary Classification dataset」というサンプルデータセットを入力に「Two-Class Boosted Decision Tree」という二項分類のアルゴリズムを使用して機械学習のモデルをトレーニングし、「Score Model」を使用して教師ありデータを元に予測を行い、「Evaluate Model」でモデルの精度を評価しました。
[1] Experiment全体が正常終了していることを確認する
Experiment全体の実行が正常終了している場合、サンプルデータセット「Adult Census Income Binary Classification dataset」以外はすべて緑色のレ点が表示されています。
[2]Web Serviceメニューが選択可能であることを確認する
さらにもう1点確認しましょう。画面下部の「SET UP WEB SERVICE」アイコンにマウスポイントを置きます。すると、2つのメニュー
・「Predictive Web Servcie [Recommended]」
・「Retraining Web Service」
が表示されます。「Predictive Web Servcie [Recommended]」が白文字で表示されている場合はExperiment全体は正常終了しています。
「Predictive Web Servcie [Recommended]」がグレーアウトしている場合、Experiment全体が正常終了していません。画面下部の「RUN」アイコンをクリックして全体を終了させてください。
Webサービス公開用のExperimentを作成する
それでは公開用のWebサービスを作成しましょう。公開用のWebサービスはトレーニング済みのモデルとどのような関係になるでしょうか。それは次のような形となります。
1.HttpのリクエストをInputとして受け付け
2.Inputを作成済みのモデルに渡して予測した結果を受け取り
3.受け取った結果をリクエスト元に返却する
トレーニング済みのモデルに対して値を渡して予測する実装は前回記事の中にもありました。「Score Model」モジュールがその役割を担当します。「Score Model」はトレーニング済みのモデルと、予測するためのインプットを受け取り、結果を出力しました(前回記事の「トレーニング済みモデルを使用して予測を行う」を参照)。
Webサービスでも、予測する時には「Score Model」を使用する点は変わりません。ということは、前回記事で作成したExperimentに対して次のような修正を行えば良さそうです。
1.Input用のモジュールを追加する
2.Inputの値を「Score Model」に渡す
3.Output用のモジュールを追加し、「Score Model」の出力値を受け取る
しかし、これではHttpのリクエストが来たらその度にモデルを作成することになります。結果を返すまでの時間がかかり過ぎますし、そもそも予測を行うときには作成しておいたモデルを使用したいものです。
そこで、まずは作成したモデルを保存することになります。モデルの保存はとても簡単です。「Train Model」の出力を右クリックして「Save as Trained Model」を選択します。
この保存したモデルを「Score Model」の入力に繋げれば良いわけです。つまり前回記事で作成したExperimentに対する修正の手順は以下のようになります。
1.Input用のモジュールを追加する
2.Inputの値を「Score Model」に渡す
3.作成したモデルを保存し、「Score Model」に繋げる
4.「Train Model」を削除する
5.Output用のモジュールを追加し、「Score Model」の出力値を受け取る
作成したモデルを使用するように修正したので、モデルを作成するための「Train Model」はもう必要ありませんから削除しています。
では上記手順に沿って作業してみましょう・・・と言いたいところですが、ちょっと待ってください。本当にExperimentを修正しても良いのでしょうか。
一般的に機械学習のモデルは一度トレーニングすれば終わりではありません。データが増えるに従い、何度もトレーニングを行ってモデルを更新していくことで精度を高めていくことを期待します。つまり前回作成したモデルトレーニング用のExperimetはこれからも繰り返し使用したいExperimentなのです。修正してはいけません。
ということはWebサービス用に新規でExperimentを作成すれば良い、ということになります。確かにそうすればモデルトレーニング用のExperimentには影響を与えることがありませんので、良い考えですが、全くのゼロの状態からExperimentを作成するのは面倒です。
そこで全くの新規で作るのではなく、モデルトレーニング用のExperimentをコピーしてからさきほど考えた修正を適用すれば最も簡単にWebサービス用のExperimentを作成できることがわかります。
ではWebサービス用のExperimentとしてモデルトレーニング用のExperimentをコピーし、修正していきましょう。実はこのとても煩雑な作業はMachine Learning Studio(以降MLStudio)が全て自動でやってくれるのです。
Webサービス公開用のExperimentを作成する
前回作成し、正常終了しているExperimentの画面下部にある「SET UP WEB SERVICE」アイコンにマウスポイントを置き、表示される2つのメニュー
・「Predictive Web Servcie[Recommended]」
・「Retraining Web Service」
のうち「Predictive Web Servcie[Recommended]」をクリックします。
すると、自動的に画面がタブ表示となり、アニメーションと共に不要なモジュールが削除され、新しいモジュールが挿入されます。
タブを見ると、「Training experiment」と「Predictive experiment」と2つのタブがあることがわかります。「Training experiment」は前回作成した機械学習のモデルを作成するExperimentです。
そして「Predictive experiment」が今作成されたWebサービス用のExperimentです。Predictiveとは予測という意味ですが、外部から受け付けた入力値をモデルに渡して予測させ、その結果を出力するExperimentなので「Predictive experiment」という名前なのだと思われます。
註:「Predictive Web Servcie[Recommended]」を選択すると、まるでWebサービスが作られるかのように思いますが、そうではなくPredictするための(予測するための)Experimentが作成されることは忘れてはいけないポイントです。Webサービスの作成はさらに別に手順が必要です。
中をよく見てみましょう。「Web service input」と「Web servcie output」の青い2つのモジュールが作成され、線で繋がれています。また、「Train Model」が削除されて、代わりにトレーニング済みのモデルに置き換わっています。先ほど考えたExperimentの修正手順がすべて自動的に行われていることがわかります。
インプットデータのスキーマの修正
「Predictive experiment」には、データ入出力用の新しいモジュールが自動的に挿入されています。「Web service input」と「Web service output」です。名前の通り、このモジュールがWebサービスの入出力を担当するわけですが、少しだけ修正が必要です。
「Web service input」は「Select Columns in Dataset」と自動的に線で繋がっているかと思います。「Web service input」が外部からデータを受け取る入口となることがわかりますが、ではサンプルデータ「Adult Census Income Binary Classification dataset」はもう必要がないはずなのにどうして削除されなかったのでしょうか。実は「Web service input」はどのようなデータがやってくるのかを知る必要があるのですがそれを定義するプロパティを持っていません。
そのため、「Web service input」の接続先(この場合は「Select Columns in Dataset」)へ「Adult Census Income Binary Classification dataset」を接続することで「Web service input」に対してスキーマ情報(列の数、列の型)を教えているのです。
ところで、「Adult Census Income Binary Classification dataset」は教師ありデータですから、実測値である「income」列を持っています。 (※income列は、収入が5万ドル以上か、以下かを示す文字列です)ということは、このままではWebサービスの入力値なのに、予測結果であるincome値を入力することになります。これはおかしいですね。Webサービスを使用する側があらかじめ予測結果を知っていることになってしまいます。
[1]「Select Columns in Dataset」を配置する
Webサービスのスキーマを変更するために予測結果である「income」列を削除しましょう。「income」列を削除した結果を「Web service input」の結線先に繋ぎます。 では、画面左側のモジュールパレットの検索窓で「select columns」と入力します。検索された「Select Columns in Dataset」をキャンバスにドラッグ&ドロップします。
[2]サンプルデータの出力先を変更する
「Adult Census Income Binary Classification dataset」の下辺から出ている線を削除し、今ドラッグ&ドロップした「Select Columns in Dataset」の上辺に繋ぎます。
[3]列選択画面を立ち上げる
「Adult Census Income Binary Classification dataset」と繋いだ「Select Columns in Dataset」をクリックして選択し、右側のプロパティから「Lanch column selector」をクリックします。
[4]income列を除外する
列選択画面では、いくつかの便利な選択方法が用意されています。今回は列を除外する便利な方法をご紹介します。列選択画面の一番左に「BY NAME」と「WITH RULES」が表示されいて、「BY NAME」が選択された状態だと思います。次の手順でincome列を除外します。
①「WITH RULES」を選択します。
②「ALL COLUMNS」を選択します。
③「Include」をクリックすると、ドロップダウンが展開されて「Include」「Exclude」が表示されます。「Exclude」を選択します。
④エラーアイコンが表示されている「Press enter to enter column name」テキストボックスをクリックしてください。列名の一覧がドロップダウンで表示されます。「income」を選択します。
⑤右下のレ点を選択し、列選択画面を終了します。
[5]「Web service input」の接続先と同じ場所に線を繋ぐ
「Web service input」に対して新しいスキーマを教えます。 「Web service input」の下辺から出ている線が繋がっている場所(元からあった「Select Columns in Dataset」の上辺)に対して、「income」列を削除した「Select Columns in Dataset」から線を繋ぎます。
これで無事にincome列を削除したスキーマを「Web service input」に教えることができました。しかし、本連載の第1回をもう一度振り返ると、もう2つの列「fnlwgt」列と「occupation」列を削除していました。このままでは、この2つの列は不要なのにも関わらず、「Web service input」の入力値として渡さなければなりません。
[6]「fnlwgt」列と「occupation」列を削除する
「income」列を削除した「Select Columns in Dataset」の列選択画面を再び立ち上げて、「fnlwgt」列と「occupation」列を削除します。
これでWebサービスの入力値からは除外できたのでOKなのですが、最初からあった「Select Columns in Dataset」はもう不要となりました。削除します。
「Web service input」で受け付けたインプットデータをどこへ渡せばよいでしょうか。削除した「Select Columns in Dataset」は「Score Model」にデータを渡していましたので、「Web service input」から直接「Score Model」にデータを渡すように線を繋げばいいですね。また、スキーマ情報である「Select Columns in Dataset」の出力も「Score Model」に繋ぐ必要があります。
註:MLStudioが自動生成した「Predictive experiment」には「Training experiment」と同じ「Select Columns in Dataset」が存在しており、「fnlwgt」列と「occupation」列が削除された状態です。この「Select Columns in Dataset」に対して「income」列を削除しても、「Web service input」は3つの列「fnlwgt」「occupation」「income」が削除されたスキーマを認識することはできません。「Web service input」にスキーマを教えるためには、入力データのスキーマを構成した「Select Columns in Dataset」を「Web service input」の出力先端子に対して接続する必要があります。
Predictive experimentを実行する
Webサービスをデプロイ準備が整いました。しかし新しくモジュールを追加したので一度全体を実行しておく必要があります。
[1]実行する
画面下部の「RUN」をクリックして実行します。
[2]確認する
画面上部右側に「Finished running」と表示されれば正常終了しています。
Webサービスをデプロイする
ではいよいよWebサービスをデプロイしましょう。画面下部の「DEPLOY WEB SERVICE」にマウスポインタを合わせると、「Deploy Web Servcie[Classic]」と「Deploy Web Service[New] Preview」2つのメニューが表示されるはずです。
この二つのWebサービスの違いですが、新しいWebサービスはAzure Resource Manager(ARM)ベースとなり、APIが一新しています。また、それに伴い専用のポータル画面が用意されました(https://services.azureml.net/)。その他のClassicWebサービスとの違いは以下になります。
・料金プラン
・プラン管理機能(プランの追加・変更・削除)
・Web サービスを複数のリージョンにデプロイ可能(サブスクリプション不要)
・Web サービスの 使用状況の統計を提供
・サンプル データを使用したリモート要求呼び出しのテスト
・サンプル データとジョブの送信履歴が表示される新しいバッチ実行サービス テスト ページ
註:Azure Resource Manager(ARM)とは、AzureのAPIの名称です。ARMが登場する以前はAzure Service Management(ASM)というAPIでした。2017年12月現在ではどちらも使用可能ですが、新しくリリースされるAzureのサービスはARMのみのサポートとなっており、ASMのみでサポートされているサービスはどんどん減少しています。
新しいWebサービス用のポータル画面では、ClassicWebサービスも扱えるようになっています。今はまだ新しいWebサービスはPreviewのため、本番用はClassic Webサービスを作成するケースもあると思われます。
[1]Webサービス(クラシック)をデプロイする
「Deploy Web Servcie[Classic]」をクリックします。すると画面が切り替わり、今作成したばかりのWebサービスのダッシュボードページが表示されます。
この画面は、MLStudioの一部です。画面一番左の地球儀アイコンをクリックすると、Webサービス(クラシック)の一覧画面となります。
地球儀アイコンの一つ上の三角フラスコのアイコンがExperimentsの一覧画面です。先程までのExperimentを表示したい場合は、Experimentsの一覧画面から選択します。
画面上でTestする
それではWebサービスを呼び出してみましょう。
[1]データ入力画面の起動
REQUEST/RESPONSE行のTestボタンをクリックすると、入力データを1つ受け付けるダイアログがポップアップします。データを入力すれば予測結果を得ることができます。 ここでは次のように入力しました。
入力したデータ
列名 | 入力値 |
---|---|
AGE | 45 |
WORKCLASS | Private |
EDUCATION | Bachelors |
EDUCATION-NUM | 13 |
MARITAL-STATUS | Never-married |
RELATIONSHIP | Not-in-family |
RACE | White |
SEX | |
CAPITAL-GAIN | 2174 |
CAPITAL-LOSS | 0 |
HOURS-PER-WEEK | 40 |
NATIVE-COUNTRY | United-States |
[2]結果を確認する
右下のレ点をクリックするとテストが実行されます。少し待つと結果が表示されます。この例では年収が5万ドル以下となるScored Probabilitiesが0.0242975149303675である、という結果でした。Scored Probabilitiesがゼロに近ければ近いほど年収が5万ドル以下である確率が高い(5万ドル以上の場合は1に近づきます)ので、これはなかなか精度が高い値ということになります。
ExcelでTestする
入力値を1つ1つ入力するのでは大変面倒です。テスト結果を残すことも容易ではありません。WebサービスではExcelを使ってテストができるBookをダウンロードすることができます。
[1]Excelをダウンロードする
ダッシュボードのREQUEST/RESPONSE行の右の方にExcelアイコンと共にリンクがあると思います。お持ちのExcelにバージョンに合わせてリンクをクリックしてください。ここでは「Excel 2013 or later」をクリックします。
「Excel 2013 or later」をクリックすると、次のような確認ダイアログがポップアップします。
これはExcelでサンプルデータをダウンロードすることが可能となる機能です。これをOnにすることで、素早くテストを開始することができます。レ点をクリックしてください。
註:レ点をクリックしないで右上の×をクリックしてダイアログを閉じた場合、サンプルデータ機能がOffのままとなります。####[2]Excelを開いてサンプルデータを取得 ダウンロードしたExcelを開きます。セキュリティの警告が表示されますので、「編集を有効にする」ボタンをクリックします。 ダウンロードしたExcelはAzure Machine LearningのWebサービスと接続するためのアドインを使用します。「アドインを信頼」ボタンをクリックします。 WebServciesの中に、先ほど作成したWebサービスが表示されます。これをクリックすると展開します。 すると、入力値を設定する範囲と、受け取った結果を表示する範囲を指定するコントロール、Predict(予想)ボタンが現れます。 入力値をヘッダー付きでゼロから記載するのは大変面倒なので、サンプルデータをダウンロードしてExcelに表示させます。セルA1をクリックしてから「Use sample data」をクリックします。
註:「Use sample data」は選択されたセルからダウンロードした値を表示します。意図しない場所に表示してしまった場合は、その範囲を削除し、改めてセルを選択しなおしてから「Use sample data」をクリックします。
[3]インプットとアウトプットを指定する
ダウンロードした値をインプットとして指定します。ヘッダーを含めて選択状態にし、右側の「Input:input1」の下にあるセル選択アイコンをクリックします。
データ選択ダイアログがポップアップします。既に選択しておいた範囲が間違いなく表示されていることを確認し、OKをクリックします。
予測結果を表示させるセルの先頭を指定します。右側の「Output:output」の下にあるテキストボックスにセル位置を入力します。ここではA9と入力しました。
[4]実行する
右側にある「Predict」をクリックしてしばらく待つと、結果が表示されます。
最後に
モデルをトレーニングするExperimentからWebサービス公開用のExperimentを作成しました。そしてWebサービス公開し、テストしました。考え方を理解しないで手順だけを追うと意味がわからず混乱してしまいます。Webサービス公開用のExperimentを作成し、修正する箇所が特にややこしいのでゆっくりと確実に理解しましょう。
次回は新しいARM(Azure Resource Manager)対応版のWebサービスを作成し、外部から呼び出します。Webサービスの呼び出しは画面からだけでなく、プログラムからの呼び出すための実装をご紹介します。
WINGSプロジェクト 上坂 貴志(株式会社ネクストスケープ)著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中