Azure Anomaly Detectorを使ってみる

# はじめに

Build 2019で[Anomaly Detector](https://docs.microsoft.com/en-us/azure/cognitive-services/anomaly-detector/)が出たので使ってみる

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

# つかってみる

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

![スクリーンショット 2019-05-26 20.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/899aaa7b-1849-d9bd-b202-0afa62327800.png)

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

![スクリーンショット 2019-05-26 20.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/e9bbd921-a170-87d2-1193-12ac92c5fe13.png)

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

![スクリーンショット 2019-05-26 20.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/dd019684-ff77-b693-f224-c8358da0b5e6.png)

Azure Portal側はこれで終わり

# サンプルコードを動かす

[Anomaly Detector API Samples](https://github.com/Azure-Samples/AnomalyDetector)をクローンする

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

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

```shell
cd AnomalyDetector/ipython-notebook
```

Jupyter notebookを起動する。pythonライブラリの[pandas](https://pandas.pydata.org/)、[numpy](https://www.numpy.org/)、[matplotlib](https://matplotlib.org/)、[bokeh](https://bokeh.pydata.org/en/latest/)、[ipywidgets](https://ipywidgets.readthedocs.io/en/stable/)なんかがイントールされている必要があるのでなかったら入れておく

```shell
jupyter notegook
```

`Batch anomaly detection with the Anomaly Detector API.ipynb`を開く。このサンプルはリクエストされた時系列データ全体を分析して異常値を見つける処理のようだ。APIの説明は[こちら](https://westus2.dev.cognitive.microsoft.com/docs/services/AnomalyDetector/operations/post-timeseries-entire-detect)にある

![スクリーンショット 2019-05-26 20.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/077e8b7a-178a-33b6-9f0c-60ec74e0b14b.png)

![スクリーンショット 2019-05-26 20.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/7f74dbad-f0f5-c596-3b9c-dd85ca595f69.png)

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

```python
# 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**のところで

```python
# 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](https://github.com/Azure-Samples/AnomalyDetector/blob/master/ipython-notebook/sample_hourly.json)を24時間区切りで分析した結果のようだ

![スクリーンショット 2019-05-26 20.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/19a21a77-8b03-c37d-76c3-a2714bbae502.png)

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

```python
# 90 sensitivity
build_figure(sample_data,90)
```

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

![スクリーンショット 2019-05-26 20.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/2ffe631e-95c1-a7e5-b34b-4df8648b7087.png)

85でだいぶ緩くなった

```
#85 sensitivity
build_figure(sample_data,85)
```

![スクリーンショット 2019-05-26 20.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/7abbb699-50f9-023e-2075-7c75e77561a6.png)

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

![スクリーンショット 2019-05-26 20.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/34611e19-f2da-4253-8829-7b66cb1f1ebe.png)

`Latest point detection with the Anomaly Detector API.ipynb`のほうも開いて同じようにやってみる。こちらは[APIの説明](https://westus2.dev.cognitive.microsoft.com/docs/services/AnomalyDetector/operations/post-timeseries-last-detect)によると過去のデータ(グラフでBoudaryが表示されていないデータ)のみを分析して最新の異常値を検出するAPIのよう。

![スクリーンショット 2019-05-26 20.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/c8abca8d-8893-6810-b096-38b2dfe26982.png)

# 感想

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

あと[Install and run Anomaly Detector container](https://docs.microsoft.com/en-us/azure/cognitive-services/anomaly-detector/anomaly-detector-container-howto)なるドキュメントがあってAnomaly Detectorをエッジで動作させられるっぽい記載がある。こっちのほうが面白そうなので後日調べてみたい