2021/12/27
前回、AzureのAnomaly Detectorのサンプルプログラムを触ったお話をしましたが、その後も詳細を調査中で試行錯誤しています。
AzureのAnomaly DetectorのWeb APIサービスは現時点(2021/12/27時点)で大きく分けて「単変数」と「多変数」の2パターンがあります。単変数については以下の3つの検出が、個々のURLで実行可能です。多変数はプレビュー版で今後修正が入るのかもしれません。
① 最新のデータポイントが異常であるかを検出 {endpoint}/anomalydetector/v1.0/timeseries/
last/detect
② データ全体に存在する可能性がある異常を検出 {endpoint}/anomalydetector/v1.0/timeseries/
entire/detect
③ データに存在する傾向の変化点を検出 {endpoint}/anomalydetector/v1.0/timeseries/
changepoint/detect
前回は①のお話でした。今回はよく見かける心電図(ECG:Electrocardiogram)の
データセットを使い、①〜③を実行して結果を確認しました。時間軸は便宜上、Dayデータとしました。
分析したプログラムは
GitHubにあるものを利用させてもらいました。
① 最新のデータポイントが異常であるかを検出 (データ:5,000点)
Latest point detection with the Anomaly Detector API.ipynb
② データ全体に存在する可能性がある異常を検出 (データ:5,000点)
Batch anomaly detection with the Anomaly Detector API.ipynb
③ データに存在する傾向の変化点を検出 (データ:1,000点)
以下のプログラムを実行しました。原因はよく分かりませんが、データ5,000点で実行すると、結果が1、000点しか出力されませんでした。仕様でしょうか??結局、5,000点の中の最後の1,000点を入力データして実行しました。
# Change point with the Anomaly Detector API.ipynb
apikey = "subscription-key"
endpoint = '{endpoint}/anomalydetector/v1.0/timeseries/changepoint/detect'
import requests
import json
import numpy as np
import warnings
warnings.filterwarnings('ignore')
def detect(endpoint, apikey, request_data):
headers = {'Content-Type': 'application/json', 'Ocp-Apim-Subscription-Key': apikey}
response = requests.post(endpoint, data=json.dumps(request_data), headers=headers)
if response.status_code == 200:
return json.loads(response.content.decode("utf-8"))
else:
print(response.status_code)
raise Exception(response.text)
sample_data = json.load(open('cardiogram.json')) #daily sample
print(sample_data)
result = detect(endpoint, apikey, sample_data)
print(result)
結果は以下の通りです。
① 最新のデータポイントが異常であるかを検出 感度95、90、80のグラフは以下の通りです。検出したいピークはグラフの右端から4つ目のピーク部分です。感度95のグラフは複数の異常点が確認されてよく分かりません。

感度90、80で異常検出点は減少しますが、目的の箇所はうまく検出できませんでした。

② データ全体に存在する可能性がある異常を検出 感度95、90、80のグラフは以下の通りです。感度95のグラフは①と同様に複数の異常点が確認されてよく分かりません。

感度90、80で検出異常点は減りますが、これも①と同様に目的の箇所はうまく検出できませんでした。

③ データに存在する傾向の変化点を検出 上のプログラムを実行すると、23行目のresult変数に以下の結果が入ってきます。

confidenceScoresは下表によると「各ポイントの信頼度の変更点」でisChangePointは「異常検出の真偽フラグ」です。

この異常が検知された箇所(isChangePoint=True)を生データと一緒に赤点で表示すると以下の通りです。検出したいのは右から4つ目のピークですが、よく分からない結果に終わりました。

Web上の
サンプルデータではうまく動作したので、データ自身がこの「変化点検知」に向いていないのでしょうか?①と②も同様ですね。
何か見落としている所もあるかも知れません。今後、継続してもう少し調べてみようと思います。