【AutoML】AzureAutoMLをpythonから操作してみる【python】

今回は前回やったAutoMLをpythonのコード上から操作して学習、デプロイまでやってみたいと思います。
バージョンだったりで踏んだり蹴ったりだったので割と細かく書き残しておきます。
スクリプトだけ知りたい方は最後にまとめて書いてあるのでそちらをご確認ください。

バージョン
windows 10
python Python 3.6.7
pip 21.3.1
azure-cli 2.39.0

※必要モジュールを再度洗いなおしたので修正しました。
これで完璧です。

インストールしたモジュールとバージョンの一覧

モジュールのインストール

azureのモジュールをインストールしていきますが、その前に準備が必要です。
まずRustのコンパイラが必要です。こちらからインストールしましょう。

pipは最新版にしましょう。私はこれのせいでエラーはいてました。
これでこけてるときはopensslがどうのこうのというエラーが出てきました。

準備ができたらazureのモジュールと必要モジュールをインストールします。
これにはめちゃくちゃ時間がかかっていたので、時間に余裕があるときにやっておくことをお勧めします。
20分以上はかかったと思います。

ワークスペースへの接続

それではAutoMLを操作していきましょう。

まずは利用するワークスペースに接続します。
ディレクトリ配下にconfig.jsonがある場合は

ない場合は、

とすることで接続ができます。

クラスタの登録

続いて学習時に利用するクラスタを用意します。
今回はすでに作成されているクラスタを持ってきます。

データの準備

次に学習に用いるデータをデータストアに登録します。
学習データはTabularという型に変換することで利用ができるようです。
今回のデータはlocalに用意したタイタニックの生存予測データを用いたいと思います。

これで学習に用いるデータの準備ができました。

AutoMLの設定

続いてAutoMLの設定をしていきます。
まずは実際のコードを確認しましょう。

パラメータについては今回利用しているものについてのみ説明していきます。
task: 学習の種類を決めます。今回は分類になるのでclassificationを選択しています。ほかにはregression(回帰)、forecasting(時系列)があります。
iterations: 実行するパラメータとアルゴリズムの組の数を設定します。指定しない場合は1000回実行されるようです。今回は5個だけやってみます。
primary_metric: 何を基準にしてモデルを選択していくかの設定です。設定できる項目についてはこちらに記載されています。今回はAUCを使いましょう。
compute_target: 学習を実行するクラスターの指定です。先ほど取得したクラスターを設定しています。
experiment_timeout_minutes:実験終了までにかかる最大時間を設定します。リファレンスではexperiment_timeout_hoursになっていますが、自分が利用したバージョンではこのようになっていました。分単位で設定します。今回は60分にしました。
blocked_models: 実行しないアルゴリズムを設定できます。ここに設定することで学習から省くことができるので相性の悪いものは除くことができます。
training_data: 学習データを選択します。先ほど登録したデータを設定します。
test_size: 学習データのうちテストに使うデータの割合を設定できます。設定しない場合はモデルの作成終了後にテストを行わず、テスト結果を確認できません。今回は30%をテストに利用します。
label_column_name: 予測対象を指定します。今回はSurvivedです。
n_cross_validations: 検証データを指定しなかった場合に実行する交差検証の回数です。今回は2回にしました。

AutoMLの実行

これでAutoMLの実行設定ができたので実行してみましょう。

こちらでAutoMLを実行することができます。

このように実行結果が返ってきます。
ポータルを見に行くと実行が始まってることが分かります。
image.png

コード上から実行状況を確認してみましょう。

実行IDは先ほど出力されたIDの値になります。
返ってくる値の種類は結構あるのでこちらのリファレンスから確認するといいと思います。

ちなみにIDだけが欲しい場合は実行時に返ってきたrunに対してrun.idのようにすることで取得できます。

モデルのメトリックの取得

実行の終了が確認できたら結果を見ていきたいと思います。
まずは複数作成されたモデルから最も良かった結果を取得していきます。

これで最も良いモデルを取得できました。
早速メトリックを確認してみたいと思います。

こちらを実行するとメトリックのデータが辞書形式で取得できます。

このように帰ってきました。この中から必要な情報を取得して評価に利用することができますね。

テスト結果の取得

今回はテストデータを分割して設定しているので実行後にテストが行われています。
そのテスト結果を確認してみたいと思います。

まず最適なモデルから子実行を取り出します。
子実行のうちテストの実行のみ取得したいのでタグを利用してフィルターします。
取得したデータからパスを指定してファイルをダウンロードし、実行結果を確認することができます。
image.png
こちらが実行結果の一部です。
Survived_predictedが予測結果、0_predicted_proba1_predicted_probaがそれぞ0と1の確率になります。

これで実行結果を確認することができました。

モデルの登録

さて、いいモデルが作れたのでデプロイしてAPIとして利用していきたいですね。
デプロイする前にまずはこのモデルを登録する必要があります。

ワークスペースから特定の実験を取得し、実行内容を取得します。
そこから最も良かった子実行を取得し、それをモデルとして登録します。
こちらを実行したらポータルのモデルの項目を確認してみましょう。
image.png
このように登録できていれば成功です。

モデルのデプロイ

登録したモデルをデプロイしていきます。
今回行うのはポータル上ではwebサービスに配置となっているデプロイ方法になります。

まず、ワークスペースから登録したモデルを取得します。
その後、デプロイ時、リクエスト取得時に実行する内容を書いたスクリプトファイルを登録します。
デプロイするスペックを指定し、デプロイを開始します。

スクリプトファイルについても確認しておきましょう。

initにはデプロイ時にモデルを登録するスクリプトが書かれています。
runにはリクエスト時に実行されるスクリプトが書かれています。
runの中を少し見てみましょう。
まずリクエスト時に送られてくるbodyが引数に入ります。
データをjson.loadsで辞書型に戻し、その中からkeyがdataのデータを取得します。
今回はこれがcsv形式のテキストであると想定しています。
なのでそのcsvテキストデータをpandasを使ってDataFrame形式に変更します。
その後predictに対してDataFrameを投げることで予測結果を取得することができます。
predictの返り値は予測結果のみのlistになっているので、わかりやすい様に予測時に投げたデータに追記し、そのデータを返すようにしました。

それではこちらを実行してみましょう。
ディレクトリの構造やファイル名によってはsrc/score.pyの部分を変更する必要がある点に注意してください。
またdeployにはそこそこ時間がかかります。
今回は約10分かかりました。
デプロイができたかポータルで確認してみましょう。
image.png
デプロイ状態がちゃんとHealthyになっていますね。
この状態であればテストすることが可能です。

デプロイしたモデルを使ってみる

それでは実際に利用してみましょう。
ポータル上からテストすることも可能ですが、今回はpythonから実際にAPIをたたいてみたいと思います。

コードのほとんどはポータルの使用タブに記載されてるものとおんなじです。
今回テストに利用するデータにはSurvivedの項目がないものを利用します。

image.png
このようなデータですね。

スクリプト内の変えている部分についてのみ見てみましょう。
まずcsvデータをpandasを用いて読み取ります。
その後辞書の形でdataの中にcsvのテキストデータを入れ込んでます。
それをjson.dumbsを用いて文字列にし、エンコードします。
そのデータをリクエストに投げるという形ですね。
実際に実行してみましょう。

このように帰ってきました。
返ってきた内容をそのままprintしているので見ずらいですが、Survivedという項目が追加されており、その項目に予測結果の値が入っていることが分かりますね。

まとめ

今回はpythonからAutoMLでの学習、評価、デプロイ、利用を行ってみました。
pythonからも一通りの実行ができたので、サービスに組み込んだり自動でモデルの更新がしていけそうですね。

最後に今回利用したスクリプトをファイルごとに載せて終わりにします。

利用スクリプト

この記事を書いた人

azure-recipe-user