【異常検知】ADTK(Anomaly Detection ToolKit)の始め方

AI、機械学習

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)」でオープンソースとして提供されています。

Mozilla Public License version 2.0 日本語参考訳 | コミュニティ関連文書情報 | Mozilla Japan コミュニティポータル
Mozilla Japan コミュニティによる「Mozilla Public License version 2.0」の日本語参考訳です。
Mozilla Public License - Wikipedia

なぜ、ADTK?

異常検知(Anomaly Detection)の手法、モデルはいろいろありますが、時系列データの異常検知をしたい場合、なかなか手軽に使えるものが見つかりませんでした。

時系列データ分析ができるFacebookのProphetを、異常検知で活用する方法もありますが、標準で時系列データの異常検知に特化したもので手軽に使えるものが無いか探していたところ、ADTKにたどり着きました。

公式ドキュメントの「Quick Start」のページを見ると、以下のようになかなかいい感じに異常検知してくれそうです。


ADTKのドキュメント

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」・・・など、同じようなイメージで活用できそうです。

    使い勝手は悪くなさそうなので、これからもう少し使ってみようと思います。

    参考

    Anomaly Detection Toolkit (ADTK) — ADTK 0.6.2 documentation

    コメント

    タイトルとURLをコピーしました