ADTK(Anomaly Detection ToolKit)とは?
Anomaly Detection Toolkit (ADTK) は、教師なし/ルールベースの時系列異常検出のための Python パッケージです。
Anomaly Detection Toolkit (ADTK) は、教師なし/ルールベースの時系列異常検出のための Python パッケージです。
異常の性質はケースごとに異なるため、モデルはすべての異常検出の問題に対して普遍的に機能するとは限りません。検出アルゴリズム (検出器)、特徴量エンジニアリング手法 (トランスフォーマー)、およびアンサンブル手法 (アグリゲーター) を適切に選択して組み合わせることが、効果的な異常検出モデルを構築するための鍵となります。
このパッケージは、統一された API を備えた一般的な検出器、トランスフォーマー、およびアグリゲーターのセットと、それらをモデルに接続するパイプ クラスを提供します。また、時系列および異常イベントを処理および視覚化するための関数もいくつか提供します。
https://adtk.readthedocs.io/en/stable/index.html
ライセンスは「 Mozilla Public License 2.0 (MPL 2.0)」でオープンソースとして提供されています。
なぜ、ADTK?
異常検知(Anomaly Detection)の手法、モデルはいろいろありますが、時系列データの異常検知をしたい場合、なかなか手軽に使えるものが見つかりませんでした。
時系列データ分析ができるFacebookのProphetを、異常検知で活用する方法もありますが、標準で時系列データの異常検知に特化したもので手軽に使えるものが無いか探していたところ、ADTKにたどり着きました。
公式ドキュメントの「Quick Start」のページを見ると、以下のようになかなかいい感じに異常検知してくれそうです。
ADTKを使うと何がうれしい?
異常検知に関わるいろんなことができます。
以下の「Detector」の項目を見るとわかるように、さまざまな種類の異常検知ができます。
- Detector
- ThresholdAD
- QuantileAD
- InterQuartileRangeAD
- GeneralizedESDTestAD
- PersistAD
- LevelShiftAD
- VolatilityShiftAD
- SeasonalAD
- AutoregressionAD
- MinClusterDetector
- OutlierDetector
- RegressionAD
- PcaAD
- CustomizedDetector
- Transformer
- RollingAggregate
- DoubleRollingAggregate
- ClassicSeasonalDecomposition
- Retrospect
- RegressionResidual
- PcaProjection
- PcaReconstruction
- PcaReconstructionError
- CustomizedTransformer
- Aggregator
- OrAggregator
- AndAggregator
- Pipe
- Pipeline
- Pipenet
- Metrics
- Data Processing
- Validate time series
- Validate event list
- Convert a binary series into an event list
- Convert an event list into a binary series
- Expand during of events
- Split a time series into training and testing segments
ADTKの始め方
ドキュメントを見た感じ、なかなか良さそうなのでさっそく試してみました。
インストール
pip install adtk
モジュールのimportとデータのロード
from adtk.data import validate_series
s_train = pd.read_csv("./adtk/docs/notebooks/data/temperature.csv", index_col="Time", parse_dates=True, squeeze=True)
s_train = validate_series(s_train)
display(s_train)
「s_train」は以下のようなデータが入っています。
Time 2017-05-02 00:00:00 18.91 2017-05-02 01:00:00 19.91 2017-05-02 02:00:00 20.19 2017-05-02 03:00:00 18.69 2017-05-02 04:00:00 18.11 ... 2017-05-10 03:00:00 21.70 2017-05-10 04:00:00 21.43 2017-05-10 05:00:00 21.32 2017-05-10 06:00:00 20.98 2017-05-10 07:00:00 20.76 Freq: H, Name: Temperature (C), Length: 200, dtype: float64
データを可視化
データを可視化してみましょう。
ADTKパッケージで可視化もできます。
from adtk.visualization import plot
plot(s_train)
実行環境は、グラフやイメージがすぐに表示できるJupyterlabを利用しています。
Jupyterlabの起動方法は以下の記事を参考にしてください。
ThresholdADによる異常検知
まずは簡単な閾値による異常検知を試してみました。
high、lowの閾値を指定してそこから外れると異常として検知します。
from adtk.detector import ThresholdAD
threshold_ad = ThresholdAD(high=30, low=15)
anomalies = threshold_ad.detect(s_train)
「threshold_ad.detect(s_train)」で、s_trainデータの異常検知を実施して、結果を「anomalies」に代入しています。
異常検知の結果を可視化してみましょう。
plot(s_train, anomaly=anomalies, ts_linewidth=1, ts_markersize=3, anomaly_markersize=5, anomaly_color='red', anomaly_tag="marker")
赤く●が付いたところが、異常として検知した箇所です。
閾値として指定した「high=30」より上の値と「low=15」より下の値が異常として検知されていますね。
閾値だと、機械学習というよりただのルールベースになりますが、使い勝手の良さはわかりました。
異常検知したデータ
試しに異常検知した結果の「anomalies」についてデータを見てみましょう。
anomalies[30:70]
Time 2017-05-03 06:00:00 False 2017-05-03 07:00:00 False 2017-05-03 08:00:00 False 2017-05-03 09:00:00 False 2017-05-03 10:00:00 False 2017-05-03 11:00:00 False 2017-05-03 12:00:00 False 2017-05-03 13:00:00 False 2017-05-03 14:00:00 True 2017-05-03 15:00:00 True 2017-05-03 16:00:00 True 2017-05-03 17:00:00 True 2017-05-03 18:00:00 True 2017-05-03 19:00:00 True 2017-05-03 20:00:00 True 2017-05-03 21:00:00 True 2017-05-03 22:00:00 True 2017-05-03 23:00:00 True 2017-05-04 00:00:00 False 2017-05-04 01:00:00 False 2017-05-04 02:00:00 False 2017-05-04 03:00:00 False 2017-05-04 04:00:00 False 2017-05-04 05:00:00 False 2017-05-04 06:00:00 False
異常として検知した赤い●の箇所の5/3 14:00ごろから「True」になっていました。
データも正しいことがわかります。
まとめ
まずは、公式ガイドの「Example」の最初にあった、「ThresholdAD」を試してみましたが、他の「QuantileAD」、「InterQuartileRangeAD」、「GeneralizedESDTestAD」・・・など、同じようなイメージで活用できそうです。
使い勝手は悪くなさそうなので、これからもう少し使ってみようと思います。
コメント