【Azure AutoML】時系列予測をPythonで行う

はじめに

今回はAzure AutoMLの時系列予測をPythonから行ってみます。こちらの公式ドキュメントを参考に、トレーニングから推論まで実行します。

環境

  • OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
  • Visual Studio Code 1.73.1
  • Python 3.8

時系列予測をPythonから行う際の流れ

使用するデータセット

KaggleのコンペBike Sharing Demandのデータセットをダウンロードして使います。

内容は過去データと天候データを学習して、自転車のレンタル需要数を予測するというものです。

データの中身はこのようになっており、時間がdatetime、レンタル数がcountとなっています。
image.png

それではこのデータを使ってトレーニングから実行します!

トレーニング

ワークスペース・コンピューティングリソースの作成・データセットの指定をし、forecasting()を用いてトレーニングの設定を行います。

コードの中身を解説します。
まずワークスペース接続にはDefaultAzureCredential()を使用しています。これは以前Azure Functionsを使う際にロール割り当ての追加など作業をしていたら、ローカルから実行する際に

というエラー文と共にAzure CLIの認証ができなくなったのでexclude_shared_token_cache_credential=Trueを追加しています。

次にデータセットについて
MLTableデータセットはAzure BLOBストレージにアップロードをしておきます。そして「MLTable」という名前のファイルとトレーニングファイルを一緒にしたフォルダを指定します。

これでデータの準備はOKです!続いてトレーニングの条件などを設定します。

トレーニング設定

forecasting()ではトレーニングの設定を行えます。
experiment_nameに実験名を入力し、target_column_nameにはターゲットとなる列名を入力します。今回は総レンタル数であるcntをターゲット列として設定しました。

実験の終了条件・パラメータ管理
set_limits()では実験の終了条件を設定します。

set_forecast_setting()では予測タスクで用いるパラメータの管理します。time_column_nameで時間列を指定し、forecasting_horizonで予測しようとしている期間を設定します(単位はトレーニングデータの期間に基づく)。

また、今回は特に指定しませんでしたがset_training()ではアルゴリズムの指定や削除を行うことができます。サポートされているアルゴリズムの一覧はこちらから確認できます。

実行結果

最後はMLClientクラスのcreate_or_update()でジョブを送信したらトレーニングが実行されます。
実行したらこのようにジョブ名が返ってきました。

続いて、この送信したジョブが完了したかどうか確認したいので、返ってきたジョブ名を使ってstatusをチェックできるコードを作ります。

トレーニングジョブの状況

ジョブ送信時に用いたMLClientのjobs()を使って、指定したジョブの状況を確認します。

ml_client.jobs.get()nameには、statusを確認したいジョブ名を入力します。
ここは先ほど保存したジョブ名を貼り付けるだけです。

あとはstatusのほかに、モデル登録を行う際に1番精度の良いモデル名が必要になるのでそれも一緒に返すようにします。

実行後、statusとベストモデル名が返ってきます。

返ってきたベストモデル名を保存して、今度はモデル登録を行います。

モデル登録

MLClientクラスのmodels()を使ってモデル登録をします。

モデル名には先ほどコピペしたベストモデルを入力します。

モデル登録は実行したらすぐ登録できるので、モデル登録状況を確認するコードは特に作成しませんが、モデル一覧から確認することができます。
一応スタジオから登録できたか確認してみるときちんとモデルが登録されていました。
image.png

それでは登録したモデルをデプロイしていきますが、その前にエンドポイントの作成と必要なファイルのダウンロードが必要です。まずはエンドポイント作成から行います。

エンドポイント作成

エンドポイント作成にはManagedOnlineEndpoint()を使用します。

endpoint_nameに任意の名前を入れて作成します。このとき、「_(アンダーバー)」を名前に含めるとエラーが出るため、「-(ハイフン)」などを使用します。

実行したら、作成完了まで5分ほど時間がかかるため、こちらもエンドポイントが作成できたかどうか確認できるコードを作っておきます。

エンドポイントの状況確認

状況確認にはMLClientクラスのget()を使えばOKです。

MLClient.online_endpoints.get()nameには先ほど設定したエンドポイントの名前を入力します。
また、今回エンドポイント状況確認と共に、後ほど推論で使うときに必要なAPIキーもget_keys()で一緒に取っておきます。

実行後、エンドポイントの状況とAPIキーが返ってきました。

続いて、デプロイ時に必要なcondaファイルとscoringファイルをSAS生成してローカルにダウンロードします。

ファイルのダウンロード

トレーニングでモデルが生成されるときに、いくつかファイルがBlobに自動的に生成されます。
その生成されるファイルの中の「conda_env_v_1_0_0.yml」と「scoring_file_v_2_0_0.py」がデプロイ時に必要になってくるので、これをダウンロードします。

ストレージアカウント名、ベストモデルの名前、そしてアカウントキーを入力して実行すればローカルフォルダの「outputs」にファイルをダウンロードできるようしています。
image.png

BLOBのSAS生成・ダウンロードについてはこちらの記事に詳細を書いているのでご参照ください。

condaファイルとscoringファイルの中身は最後の付録に載せます。

さて、必要なものはすべてそろったので、いよいよ登録したモデルをデプロイします。

モデルのデプロイ

ManagedOnlineDeployment()を使用してデプロイをします。

local_endpoint_nameには作成したエンドポイント名を入力し、Modelには登録したモデルのパス名を入力します。

また、ManegedOnlineDeployment()nameには任意のデプロイの名前を入れます。

デプロイ実行完了には時間が10分以上かかることが多いので、こちらもstatus確認をできるようにします。

デプロイ状況

MLClientクラスのget()を使ってデプロイ状況を確認します。

nameにはデプロイ名、endpoint_nameにはエンドポイント名を入力して実行したらこちらの結果が返ってきます。

最後に時間を指定して推論をします。

推論

こちらのコードは、スタジオの「使用」タブからコードをコピーし、それをPythonで実行してみます。
無題.png
コピーしたコードに、いくつか修正を加えて実行をします。

まずは、日付を表すdatetimeを「2000-01-01T00:00:00.000Z」から「2012-12-20T00:00:00.000Z」に変更します。(トレーニングデータに載っていた日付2011/1/1~2012/12/19より前の日付だとエラーが出ます。)

続いてapi_keyには、エンドポイント状況を確認する際に保存したAPIキーを入力します。
2点修正をし、実行したらこちらの推論結果が返ってきます。

コンピューティングリソース・エンドポイントの削除

最後に使わなくなったコンピューティングリソースとエンドポイントの削除を行います。

付録

この記事を書いた人

azure-recipe-user