Azure
MachineLearning
AzureCognitiveServices
AnomalyDetector


はじめに

Build 2019でAnomaly Detectorが出たので使ってみる

Anomaly Detectorは時系列データの異常値検知のためのREST APIで多分前からAzure AI Galleryにあったものが洗練されたやつにちがいないと思ってる。IoTなシステムなんかでは時系列データの異常値検知はニーズが高いので便利そうならぜひ使いたい


つかってみる

Azure PortalからAnomaly Detectorを検索してサービスをデプロイする。名前サブスクリプション場所価格レベルリソースグループを適当に設定して作成ボタンをクリックする

スクリーンショット 2019-05-26 20.11.34.png

概要エンドポイント をメモっておく

スクリーンショット 2019-05-26 20.21.01.png

キーキー1をメモっておく

スクリーンショット 2019-05-26 20.22.33.png

Azure Portal側はこれで終わり


サンプルコードを動かす

Anomaly Detector API Samplesをクローンする

git clone https://github.com/Azure-Samples/AnomalyDetector.git

Jupyter Notebookが提供されてたのでそこまで移動する

cd AnomalyDetector/ipython-notebook

Jupyter notebookを起動する。pythonライブラリのpandasnumpymatplotlibbokehipywidgetsなんかがイントールされている必要があるのでなかったら入れておく

jupyter notegook

Batch anomaly detection with the Anomaly Detector API.ipynbを開く。このサンプルはリクエストされた時系列データ全体を分析して異常値を見つける処理のようだ。APIの説明はこちらにある

スクリーンショット 2019-05-26 20.29.11.png

スクリーンショット 2019-05-26 20.30.06.png

以下の[Placeholder: Your Anomaly Detector resource access key]をメモしておいたキー1[Placeholder: Your Anomaly Detector resource endpoint]エンドポイントに書き換える

# To start sending requests to the Anomaly Detector API, paste your Anomaly Detector resource access key below,

# and replace the endpoint variable with the endpoint for your region or your on-premise container endpoint.
# Endpoint examples:
# https://westus2.api.cognitive.microsoft.com/anomalydetector/v1.0/timeseries/entire/detect
# http://127.0.0.1:5000/anomalydetector/v1.0/timeseries/entire/detect
apikey = '[Placeholder: Your Anomaly Detector resource access key]'
endpoint = '[Placeholder: Your Anomaly Detector resource endpoint]/anomalydetector/v1.0/timeseries/entire/detect'

あとはRunボタンをポチポチ押して進めていく。Example 1: time series with an hourly sampling frequencyのところで

# Hourly Sample

sample_data = json.load(open('sample_hourly.json'))
sample_data['granularity'] = 'hourly'
sample_data['period'] = 24
# 95 sensitivity
build_figure(sample_data,95)

を実行した結果、以下のようなグラフが表示された。Boundaryから外れた値が異常値として検出されているのがわかる。sample_hourly.jsonを24時間区切りで分析した結果のようだ

スクリーンショット 2019-05-26 20.39.09.png

次にSensitivityを90に落として実行したのが以下

# 90 sensitivity

build_figure(sample_data,90)

Boundaryの幅が広くなって若干緩めになった

スクリーンショット 2019-05-26 20.40.59.png

85でだいぶ緩くなった

#85 sensitivity

build_figure(sample_data,85)

スクリーンショット 2019-05-26 20.53.40.png

Example 2: time series with an daily sampling frequencyのほうも同じように異常検知の様子が確認できる

スクリーンショット 2019-05-26 20.56.09.png

Latest point detection with the Anomaly Detector API.ipynbのほうも開いて同じようにやってみる。こちらはAPIの説明によると過去のデータ(グラフでBoudaryが表示されていないデータ)のみを分析して最新の異常値を検出するAPIのよう。

スクリーンショット 2019-05-26 20.59.01.png


感想

Anomaly Detectorは季節性の高いデータから異常値を見つけるのに役立つ。batchは事後分析、latestは比較的リアルタイムな分析に使えそうだ。電流値とかモーターの回転数とかミリ秒で周期するやつはクラウドAPIでやると間に合わないのでそういうシーンでは使えないとして、ある程度エッジで貯めてフィルタリングした時系列データを一気に投げて間欠で異常値を見つける。といった処理には使えそう。なんせモデルを作らずにそこそこ精度が出そうなのは楽ちんである。

あとInstall and run Anomaly Detector containerなるドキュメントがあってAnomaly Detectorをエッジで動作させられるっぽい記載がある。こっちのほうが面白そうなので後日調べてみたい