時系列の異常を検出するには、どのアルゴリズムを使用する必要がありますか?


70

バックグラウンド

私はネットワークオペレーションセンターで働いており、コンピューターシステムとそのパフォーマンスを監視しています。監視する重要な指標の1つは、現在サーバーに接続している訪問者数と顧客数です。それを可視化するために、Opsチームは時系列データなどのメトリックを収集し、グラフを描画します。Graphiteはそれを可能にします。突然のドロップ(大部分)やその他の変更が発生した場合にチームに通知するアラートシステムを構築するために使用する非常に豊富なAPIを備えています。ここでは、平均値に基づいて静的なしきい値を設定しましたが、日中と週中の負荷が異なるため(季節性要因)、あまりうまく機能しません(多くの誤検知があります)。

次のようになります。 システムごとのユーザー数

実際のデータ(1つのメトリックの例、15分の時間範囲。最初の数字はユーザー数、2番目はタイムスタンプ):

[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]

私が達成しようとしていること

最近のデータポイントを受信し、それらを過去の平均値と比較し、突然の変更またはドロップがあった場合にアラートを送信するPythonスクリプトを作成しました。季節性のため、「静的」しきい値はうまく機能せず、スクリプトは誤検知アラートを生成します。アラートアルゴリズムをより正確に改善し、アラートのしきい値を絶えず調整することなく機能するようにしたいと考えています。

必要なアドバイスと発見したこと

グーグルで私は、異常検出のための機械学習アルゴリズム(監視なしアルゴリズム)を探していると考えました。さらに調査を行った結果、それらは非常に多く、どれが私の場合に当てはまるかを理解することは非常に困難です。数学の知識が限られているため、洗練された学術論文を読むことができず、この分野の初心者にとって簡単なものを探しています。

私はPythonが好きで、Rに少し精通しているので、これらの言語の例を見て喜んでいます。問題を解決するのに役立つ良い本や記事をお勧めします。あなたの時間をありがとう、そのような長い説明のために私を許します

便利なリンク

同様の質問:

外部リソース:


1
CUSUMのような最も単純なアルゴリズムの1つを見ましたか?
ヴラディスラフドブガレス

@xeon、まだです。私はこのテーマに慣れていないため、すべてを消化するのに時間が必要です。これを
提示して

1
@ ma-geという素晴らしい質問です。同様のシナリオがあります。私のアプローチはauto.arima、Rの優れたforecastパッケージの機能を使用して、継続的な定期的な予測を構築することでアラートを設定することでしたjstatsoft.org/v27/i03/paperを参照)。levelパラメータを調整することにより、信頼レベルを調整できますdata.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
アレックスウールフォード

3
TwitterのGuysは、このトピックに関して非常に興味深い記事を書いています。それをチェックアウト:blog.twitter.com/2015/...を
ognjenz

@ilyaKhadykinこんにちは、元気です!この問題の解決策はありましたか。私は毎分特定のユーザーがいるというまったく同じことをしており、多くの誤検知も受けています。現在、5分ごとの間隔データのスコアを計算し、履歴パターンと照合しています。特定のアルゴリズムを使用している場合は、どのようにそれをやったかを共有してください。前もって感謝します!
ak3191

回答:


24

キーはグラフの「予期しない」修飾子であると思います。予期しないことを検出するには、何が期待されているかを把握する必要があります。

yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t 「大きすぎる」アラートをスローします。

σεεt|et|<3σεet>3σε

訪問者の数はおそらく非常に永続的ですが、非常に季節的です。乗法の季節性の代わりに季節のダミーを試してみるのが良いかもしれません。そして、Xが外生変数を表すARMAXを試してみるでしょう。


5
このアプローチは、暗黙的に存在しないと想定された異常に基づいてバイアスされたパラメーターを持つ特定のARIMAモデルを想定しています。より一般的なアプローチは、最初に異常を特定し、次に重要なインラインテストにつながる最適なARIMAモデルを特定することです。追加の異常は、レベルシフト、季節的なパルス、およびここで提案されているよりも一般的なソリューションを必要とする現地時間の傾向である可能性があります。 包括的な手順については、unc.edu /〜jbhill / tsay.pdfを参照してください 。詳細については、「自動介入検出」をGoogleで検索することもできます。
IrishStat

@IrishStatイベントのダミーを使ってARIMAXを提案しました。OPは、ダミーによるWebサイトのクラッシュなどの既知のイベントを説明できます。これにより、エラーの差異が減少し、アラートが増えます。複雑なモデルを作成する理由はありません。Webサイトのトラフィックに関して、すべてを考慮することはまったく不可能だからです。シンプルなモデルが最適です。
アクサカル

2
@ ma-ge、もう1つ:重複する間隔を使用することもできます。毎分データを収集するとしますが、モデリングの場合は10分でステップを選択できます。推定のためにいくつかの問題が発生します(自己相関による)が、結果のモデルはおそらくより堅牢になります。
アクサカル

@Aksakalモデルは必要に応じてシンプルにする必要がありますが、シンプルすぎないようにします。
IrishStat

17

Netflixの技術ブログには、Robust Anomaly Detectionツール(RAD)に関する記事があります。 http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html

季節性と非常に大量のデータセットを扱うため、要件に合う可能性があります。コードはオープンソースのJavaおよびApache Pigですhttps://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig

基礎となるアルゴリズムは堅牢なPCAに基づいています-オリジナルの論文はこちらをご覧くださいhttp : //statweb.stanford.edu/~candes/papers/RobustPCA.pdf


12

オープンソースパッケージのほとんどの異常値検出アルゴリズムは、低頻度、毎日/毎週/毎月の頻度データを持つビジネス時系列データ用です。このデータは、数分でキャプチャされる特殊な領域のものであるように見えるため、オープンソースの外れ値検出が役立つかどうかはわかりません。このアプローチをデータに適合させることを試みることができます。

以下に、オープンソースで利用可能なパッケージアプローチの概要を示しますR

  1. tsoutliersarimaフレームワーク内でChenとLiuの外れ値検出アルゴリズムを実装します。このサイトに関する以前の質問を参照してください。素晴らしいアプローチですが、あなたのような高周波数データを処理できるかどうかは非常に遅いです。以前の質問/投稿で述べたように、すべてのタイプの外れ値を検出できるという利点があります。
  2. Twitterの異常検出Rosnerのアルゴリズムを使用して、時系列に基づいて異常を検出します。アルゴリズムは時系列を分解し、異常を検出します。私の個人的な意見では、これは時系列の外れ値を検出するのに効率的でも正確でもありません。
  3. 予測パッケージのtsoutlier:時系列を分解してから外れ値を検出するという点で、twitterのアルゴリズムに似ています。加算的な外れ値またはパルスのみを検出します。

異常を検出しようとする専用のアプローチを備えた商用パッケージがあります。別の古典的なアプローチは、Tsayの時系列外れ値検出アルゴリズムで、ChenとLiuの異なるタイプの外れ値を検出するアプローチに似ています。最近、私はあなたのデータにより適しているかもしれないmetaforと呼ばれるこの商用ソフトウェアソリューションにつまずきました。

これがお役に立てば幸いです


おかげで、同様の問題やアプローチについての見通しが得られました。リンクに特別な感謝を!
イリヤハディキン

Metaforを探している人がいれば、Splunkに買収されました。当社のTSADアルゴリズムは、Splunk IT Service Intelligence( "ITSI")の最新バージョンに含まれています。
アレックスクルーズ

4

統計的プロセス管理ルール(Western Electric http://en.wikipedia.org/wiki/Western_Electric_rulesなど)を使用してみましたか?

私は時系列データのためにそれらを使用します-多くの場合、データに関する直感のタッチで-データが行きたくないどこかに行くかどうかを評価するために。あなたの例のように、これらのルールは、デルタ/変更が複数のデータポイントで一貫している場合、問題がある可能性があることを示します。

また、統計的プロセス制御(SPC)は、以前より良くなった、または悪くなった場合のワークアウトに適しています。

SPCの1つの問題は、その多くが正規分布に依存していることであり、これはおそらく0未満にならないデータには適さないでしょう。私がSPCを使用しているよりも優れている人は、ここでオプションを提案できます。私はそれを使って問題にフラグを立てるのが好きですが、すべてのモデルと同様に、データ自体(およびソース)についてある程度の知識を持って使用するのが最適です。


4

m

Lmτ1mθ1m+1==1m+1pyτ1+1τθ

y1yn1<τ1<<τm<npθmchangepoint Rのパッケージ。詳細を知りたい場合は、次の出版物とそれらが提供する参考資料を確認してください。

レベッカ・キリックとイドリス・A・エクレー。(2013)チェンジポイント:チェンジポイント分析のためのRパッケージ。(オンラインペーパー)

Eckley、IA、Fearnhead、P。およびKillick、R。(2011)変化点モデルの分析。[in:] Bayesian Time Series Models、eds。D.バーバー、AT CemgilおよびS.チアッパ、ケンブリッジ大学出版局。


4

時系列の周期性を十分に理解する必要がある場合、差分に基づく単純だが効果的なアルゴリズムを考案できます。

簡単なワンステップ差分により、以前の値からの突然の低下が検出されます

yt=ytyt1

しかし、系列に強力な周期成分がある場合、その低下は定期的にかなり大きくなると予想されます。この場合、前のサイクルの同じ時点、つまり1周期前に、任意の値を対応する値と比較することをお勧めします。

yt=ytytnどこ n=期間の長さ

投稿された質問の場合、2つの重要な周期的要素を予想するのは自然でしょう。1つは1日の長さで、もう1つは1週間の長さです。しかし、長い期間の長さを短い期間の長さできれいに分割できるため、これはそれほど複雑なことではありません。

n247=168

滴がより比例した特性である場合、単純な違いは、アクティビティが少ないときに突然の滴を検出するのに簡単に失敗します。そのような状況では、代わりに比率を計算するようにアルゴリズムを変更できます。

yt=ytytn

シミュレートされたデータセットを使用して、Rでいくつかのテストを行いました。そのデータは1日に6回サンプリングされており、他のノイズや変動に加えて、強い日次および週次の期間があります。ドロップはランダムな場所に1から3の期間で追加されました。
ドロップを分離するには、距離42で最初の比率を計算し、次に特定のサイズの負の変化のみに関心があるため、しきい値を0.6に設定しました。次に、1ステップの差を計算し、しきい値を-0.5に設定しました。最後に、1つの誤検出が抜け落ちたように見えます(16週の終わりに1つ)。左右のグラフは、同じデータを異なる方法で示しています。

ここに画像の説明を入力してください


3

時系列の変化を異常ではなく、新しいトレンドの始まりと考える方が便利でしょうか?隣接するポイント間の差を取ることは、傾斜(微分)がいつ変化するかを知るのに役立ち、日付の新しいトレンドの始まりを示す可能性があります。また、差分値の差(2次導関数)を取得することも有用です。「トレンドの時系列シリーズ」でGoogle検索を行うと、方法の良い提案が得られる場合があります。

ウェーブレットの良い紹介は、著者であると私が信じるハバードによる「ウェーブレットによる世界」です。


2

私は、2つの異なるアルゴリズムを使用して、複数の季節性の時系列(毎日、毎週)で素晴らしい結果を得ることができました。

  • レス(またはSTL)を使用して中間点シリーズを確立する季節トレンド分解
  • 分散とレベルの関係に基づいて、その中間点の周囲にしきい値を確立するための非線形回帰

STLは、時系列を時系列からトレンドコンポーネント、単一の季節コンポーネント、および残りに分解します。季節性の要素は高頻度の季節性(例:毎日)ですが、傾向には低頻度の季節性(例:毎週)と適切な傾向の両方が含まれます。トレンドでSTLを再度実行するだけで、2つを分離できます。とにかく、残りのシリーズを他のコンポーネントから分離すると、そのシリーズに対して異常検出を実行できます。

ここでより詳細な説明を行いました。

https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/


1

Davidに触発されて、FFTを使用しようとしましたか?それらがあなたの異常を示しているので、それは突然の低下を見つけることができるかもしれません。異常は狭いスペクトルで表示される場合があります。そのため、簡単にキャプチャできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.