ADTK (異常検知ツールキット) 0.6 : ユーザガイド (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/21/2021 (0.6.2)
* 本ページは、ADTK の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
スケジュールは弊社 公式 Web サイト でご確認頂けます。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
人工知能研究開発支援 | 人工知能研修サービス | テレワーク & オンライン授業を支援 |
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。) |
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ ; Facebook |
ADTK (異常検知ツールキット) 0.6 : ユーザガイド
これは ADTK で時系列のための異常検知モデルをどのように構築するかの簡潔なガイドです。ADTK を利用し始める前にこのガイドを読み通すことを総てのユーザに勧めます。
教師なし vs. 教師あり
モデルを構築する前にユーザが決める必要がある最初のことは問題を教師あり学習問題か教師なし問題として定式化することです。教師あり学習メソッドは訓練セットの時系列と normal/anomalous ラベルに基づいてモデルを訓練します、その一方で教師なしメソッドは時系列とドメイン知識のみに基づきモデルを構築し、ラベル付されたデータは必要としません。
現実世界の異常検知問題は通常はラベル付けされた履歴異常の欠落に悩まされます、これはユーザが堅牢な教師ありモデルを構築することを妨げます。この場合、教師なし/ルールベースのメソッドがより良い選択です。ADTK は時系列異常検知の教師なし/ルールベースのモデルのためのパッケージです。ユーザがタスクを教師あり学習問題として定式化する場合には、代わりのツールが必要とされます。
Anomaly Types
異常 (= anomaly) は広い概念で、時系列の多くの異なるタイプのイベントを参照するかもしれません。値のスパイク (急な山型)、変動性 (= volatility) のシフト、周期パターンの違反, etc. は総て特定のコンテキストに依拠して、異常か正常になり得ます。ADTK は異なるシナリオのための様々のタイプの異常検知モデルに組合せられる一般的なコンポーネントのセットを提供します。けれども、ADTK はユーザのためのモデルを自動的には選択したり構築しません。ユーザはどのようなタイプの異常を検知するのか知るべきで、それに従ってモデルを構築することができます。
1. 外れ値 (= Outlier)
外れ値はその値が他とは本質的に異なるようなデータポイントです。時系列の外れ値ポイントはこの系列の正常範囲を越えます、データポイント間の一時的な関係を考慮することなしに。換言すれば、総てのデータポイントを時間独立と見做してさえも、外れ値ポイントは依然として際立ちます (= outstand)。
外れ値を検知するには、時系列値の正常範囲が detector が学習する必要があるものです。それは user-given absolute thresholds (adtk.detector.ThresholdAD) で定義できます。代わりに、ユーザは履歴データか正常範囲を学習するために detector を作成するかもしれません (adtk.detector.QuantileAD, adtk.detector.InterQuartileRangeAD と adtk.detector.GeneralizedESDTestAD)。
外れ値は異常の最も基本的なタイプす。他のタイプを対象とする異常検知メソッドはしばしば時系列を新しい一つに変換して外れ値検知がそれに対して適用されます。ADTK の殆どの進んだ detector はこのストラテジーに従っています。
2. スパイクとレベルシフト
幾つかの状況では、時間ポイントが正常であるか否かはその値がその近接過去 (= near past) でアラインされるかどうかに依拠します。値の唐突な増加や減少は変化が一時的であればスパイク、あるいは変化が永続的であればレベルシフトと呼ばれます。スパイクは外れ値に類似しているように見えますが、外れ値が時間独立である一方で、それ (スパイク) は時間依存であることに注意してください。スパイクの値は時間的順序を考慮することなく総てのデータポイントで検査する場合正常である可能性があります (see figure below)。
2 つの時間ウィンドウを並べてスライドしてそれらの mean や median 値の間の差異を追跡し続けても良いです。時間に渡るこの差異、これは新しい時系列です、は外れ値 detector で検査されます。左と右のウィンドウの統計が本質的に異なるときはいつでも、それはこの時間ポイントまわりの突然の変化を示します。時間ウィンドウの長さが検知する変化の時間スケールを制御します : スパイクについては、近接過去の表現激な情報を捉える左のウィンドウは右のものより長いです ; その一方で、レベルシフトについては、両者のウィンドウは stable ステータスを捉えるために十分に長くあるべきです。
adtk.detector.PersistAD と adtk.detector.LevelShiftAD はそれぞれスパイクとレベルシフトの detector です。両者は transformer adtk.transformer.DoubleRollingAggregate で実装されます、これは時系列を上で述べた 2 つの時間ウィンドウを持つ新しい系列に transform します。
Transform a time series with level shift using DoubleRollingAggregate with mean as time window statistic.
3. パターン変化
上で述べたストラテジーは値以外のパターンのシフトを検知するために一般化できるかもしれません。例えば、変動性 (= volatility) のシフトに関心がある場合、時間ウィンドウで追跡する統計値は mean/median の代わりに標準偏差であり得るかもしれません。adtk.transformer.DoubleRollingAggregate は関心あるパターンを定量化するために利用できるかもしれません。
Transform a time series with volatility level shift using DoubleRollingAggregate with standard deviation as metric.
パターンの時間的変更を検知するためには、adtk.transformer.RollingAggregate も良い選択であるかもしれません。それは時間ウィンドウをスライドして時間的パターンを定量化するウィンドウ内で測定された統計値を返します。For example, if a user wants to detect temporary anomalously high number of visit to a system, tracking the number of visits in sliding window is an effective approach.
Transform a time series with temporary high frequency of requests using RollingAggregate with number of non-zeros values as metric.
4. 季節性 (= Seasonality、周期性)
時系列が季節的因子 (日の時間、週の日、年の月) により影響されるとき季節的パターンが存在します。detector adtk.detector.SeasonalAD は元の時系列から季節的パターンを除去するために transformer adtk.transformer.ClassicSeasonalDecomposition を使用し、そして時系列が (残差系列を検査することにより) 季節的パターンに正常に従わないとき時間周期 (= time period) をハイライトします。
Remove the seasonal pattern from time series of NYC traffic using ClassicSeasonalDecomposition with the period as a week (data from Numenta Anomaly Benchmark)
ユーザは seasonal 系列と cyclic 系列を識別することについて注意深くある必要があります。seasonal 系列は常に固定された、通常は解釈可能で既知の、期間 (= period) を持ちます、その seasonal 性質故にです。cyclic 時系列は固定された periodic パターンには従いません、その物理的性質故に、それが同様の部分系列を繰り返しているように見えてさえもです。For example, the trajectory (軌道) of a moving part in rotating equipment is a 3-D cyclic time series, whose cycle length depends on rotation speed and is not necessarily fixed. Applying seasonality decomposition to it would be problematic, because every cycle may last a slightly different length, and decomposition residuals will be misleading for anomaly detection purpose.
Applying ClassicSeasonalDecomposition to a cyclic series fails to detect anomalous behavior.
現在、ADTK は cyclic (but not seasonal) 時系列から cyclic パターンを除去する transformer を提供していません。However, adtk.detector.AutoregressionAD can capture changes of autoregressive relationship (the relationship between a data point and points in its near past) and could be used for cyclic (but not seasonal) series in some situations.
単変量 vs 多変量 (Univariate vs. Multivariate)
そこから異常を検知する時系列が単変量である場合、異常検知モデルは adtk.transformer の単変量 transformers と adtk.detector の単変量 detector を利用するべきです。
時系列が多変量である場合には、ユーザは系列に渡り異常検知タスクが分離可能であるか否かを理解するべきです。多くの場合、各系列に沿って並列に異常を検知することは要求を満たします。例えば、ユーザが 2 次元時系列、気温と湿度、を持ち、そして異常な気温か湿度を検知しようとする場合、気温と湿度の両者にそれぞれ単変量 detector を適用してから結果を集計することは要求を満たします。ユーザの便利のために、単変量 detector か 単変量 transformer が多変量系列 (i.e. pandas DataFrame) に適用されるとき、それは総ての系列に自動的に適用されます。
時に、ユーザは本質的な (= intrinsic) 多変量アルゴリズムを利用する必要があります、検知する異常のタイプが別々の単一の次元で表されない場合です。前の例については、ユーザが異常な heat index (気温と湿度のハイブリッド metric) を検知しようとする場合、多変量 transformers と detectors が考慮されるべきです、何故ならば異常は気温と湿度に同時に基づいて検知されなければならないからです。
Detector, Transformer, Aggregator, そして Pipe
ADTK はモデルに結合されるべき 3 つのタイプのコンポーネントを提供します。detector は時系列をスキャンして異常な時間ポイントを返すコンポーネントです。それらは総てモジュール adtk.detector に含まれます。transformer は有用な情報が抽出されるように時系列を変換します。それはまた特徴エンジニアリング・コンポーネントとしても解釈できます。それらは総てモジュール adtk.transformer に含まれます。Aggregator は様々な検知結果 (異常リスト) を結合するコンポーネントです。それはアンサンブル・コンポーネントです。それらは総てモジュール adtk.aggregator に含まれます。
モデルは単一の detector か複数のコンポーネントの組合せです。組合せが sequential である場合、i.e. シーケンシャルに detector に接続された一つか幾つかの transformers、それは adtk.pipe.Pipeline オブジェクトにより接続できます。組合せがより複雑でシーケンシャルでない場合、それは adtk.pipe.Pipenet オブジェクトにより接続できます。adtk.detector の多くの detector は内部的には Pipeline or Pipenet オブジェクトとして実装されていますが、ユーザの便利のためにモジュール adtk.detector でリストされます。
まだ実装されていない任意のコンポーネントについて、ユーザはそれを関数として実装して関数を ADTK コンポーネントに変換するためにコンポーネント adtk.detector.CustomizedDetector1D, adtk.detector.CustomizedDetectorHD, adtk.transformer.CustomizedTransformer1D, adtk.transformer.CustomizedTransformerHD, or adtk.aggregator.CustomizedAggregator を利用しても良いです。それからそれは統一 API を持ちそして通常の ADTK コンポーネントとして利用できます (for example, to be connected with other components using Pipeline or Pipenet)。Users are always welcomed to contribute their algorithm into the package permanently. More information for contributors can be found in Contributing.
ユーザは ADTK コンポーネントのサンプルのために Examples を確認しても良いです。
以上