Pythonでのオープンソースの異常検出


61

問題の背景: 私は、IT監視スペースで見つかったログファイルに似たログファイルを含むプロジェクトに取り組んでいます(ITスペースを最もよく理解しています)。これらのログファイルは時系列データであり、さまざまなパラメーターの数百/数千の行に編成されています。各パラメーターは数値(浮動)であり、各時点に重要な値またはエラー値があります。私の仕事は、異常検出(スパイク、フォール、一部のパラメーターが同期していない異常なパターン、奇妙な1次/ 2次などの派生動作など)のためにログファイルを監視することです。

同様の課題で、SplunkとPrelertを試しましたが、現在はオープンソースのオプションを検討しています。

制約: よく知っているのでPythonに限定しています。Rへの切り替えと関連する学習曲線を遅らせたいと思っています。R(または他の言語/ソフトウェア)に対する圧倒的なサポートがないように思われない限り、このタスクのためにPythonに固執したいと思います。

また、私は今のところWindows環境で作業しています。Windowsで小さなログファイルをサンドボックス化し続けたいのですが、必要に応じてLinux環境に移行できます。

リソース: 結果として行き止まりで以下をチェックアウトしました。

  1. Pythonや不正検出のための機械学習アルゴリズムを実装するためのR。ここの情報は役立ちますが、残念ながら、適切なパッケージを見つけるのに苦労しています:

  2. Twitterの「AnomalyDetection」はRにあり、Pythonに固執したいと思います。さらに、Pythonポートの特異性は、Windows環境での実装で問題を引き起こすようです。

  3. 私の次の試みであるSkylineは、(GitHubの問題から)ほぼ廃止されたようです。オンラインがあまりサポートされていないように思えるので、私はこれについて深く掘り下げていません。

  4. scikit-learn私はまだ調査中ですが、これははるかにマニュアルのようです。草むらのアプローチは私には問題ありませんが、学習ツールの私のバックグラウンドは弱いので、Splunk + Prelertに似たアルゴリズムのような技術的側面のブラックボックスのようなものが欲しいです。

問題の定義と質問: パッケージまたはライブラリを介してPythonの時系列ログファイルからの異常検出プロセスを自動化するのに役立つオープンソースソフトウェアを探しています。

  1. そのようなことは、当面のタスクを支援するために存在しますか、それとも私の心の中に想像上のものがありますか?
  2. 背景の基礎や概念など、目標を達成するための具体的な手順を誰でも支援できますか?
  3. これは、尋ねるのに最適なStackExchangeコミュニティですか、それともStats、Math、またはSecurityまたはStackoverflowがより良いオプションですか?

EDIT [2015年7月23日] に最新のアップデートがありますpyculiarityをしているように見える固定 Windows環境のために!私はまだ確認していませんが、コミュニティにとって別の便利なツールになるはずです。

編集[2016-01-19] マイナーアップデート。これに取り組む時間はありませんでしたが、特定の詳細な研究を続ける前に、この問題の基礎を理解するために一歩後退しています。たとえば、私が取っている2つの具体的な手順は次のとおりです。

  1. 異常検出のためのWikipedia記事[ https://en.wikipedia.org/wiki/Anomaly_detection ] から始めて、完全に理解し、[ https://などの他のリンクされたWikipedia記事の概念階層を上下に移動しますen.wikipedia.org/wiki/K-nearest_neighbors_algorithm ]、その後に、[ https://en.wikipedia.org/wiki/Machine_learning ]。

  2. Chandola et al 2009 "Anomaly Detection:A Survey" [ http://www-users.cs.umn.edu/~banerjee/papers/09/anomaly.pdf ]およびHodge et al 2004 によって行われたすばらしい調査でのテクニックの調査「異常値検出方法の調査」[ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ]。

概念がよく理解されたら(実用的な側面を開発するために、おもちゃの例を試してみたい)、どのオープンソースPythonツールが私の問題により適しているかを理解したいと思っています。


Scikitを始めたばかりの場合は、次のビデオをお勧めします:github.com/justmarkham/scikit-learn-videos
Harvey

このモジュールではh2oライブラリがインポートされていません。

1
あなたの問題は不明確です。異常を構成するものには、さまざまな意味があります。それは平均の偏差ですか?特定の行動パターンですか?それぞれの場合に異なる方法が適用されます。異常が平均からの逸脱である場合は、「異常値の検出」を調べる必要があります。特定のパターンを探している場合は、ニューラルネットワークなどの監視付き学習アルゴリズムを使用すると、はるかに効果的です。
ウィレムヴァンドースブルク

1
Pythonが欲しいのは知っていますが、異常検出にはELKIが使用するツールのようです。
アノニムース

回答:


35

異常検出またはイベント検出は、さまざまな方法で実行できます。

基本的な方法

デリバティブ!過去と未来からの信号の偏差が大きい場合は、おそらくイベントが発生しています。これは、信号の微分で大きなゼロ交差を見つけることで抽出できます。

統計的方法

何でも意味するのは、その通常の基本的な動作です。何かが意味から逸脱している場合、それはイベントであることを意味します。時系列の平均はそれほど些細なものではなく、一定ではありませんが、時系列の変化に応じて変化するため、平均ではなく「移動平均」を確認する必要があります。次のようになります。

イベントは、移動平均から1標準偏差を超えるピークです

移動平均コードはこちらにあります。信号処理の用語では、移動平均を適用することによりローパスフィルターを適用しています。

以下のコードに従うことができます。

MOV = movingaverage(TimeSEries,5).tolist()
STD = np.std(MOV)
events= []
ind = []
for ii in range(len(TimeSEries)):
    if TimeSEries[ii] > MOV[ii]+STD:
        events.append(TimeSEries[ii])

確率的方法

これらは、機械学習の初心者向けに特別に洗練されています。カルマンフィルターは、異常見つけるための素晴らしいアイデアです。「最大尤度推定」を使用したより単純な確率的アプローチもうまく機能しますが、私の提案は移動平均のアイデアにとどまることです。実際には非常にうまく機能します。

私が助けてくれることを願っています:)幸運を!


深い議論にご尽力いただきありがとうございます。これをプログラミングすることはそれほど悪くはないようですが(非常に興味深い、私はアルゴリズムに深く飛び込むために言うかもしれません)、私はすでに利用可能なパッケージに興味があります。インストールが簡単なものを知っていますか?これは実装が簡単なことと同じではないことに注意してください。これは保証できないと理解しています。環境を機能させることができれば、タスクの例に基づいてフィネスを調整できると思います。
ximiki

15

h2oには異常検出モジュールがあり、伝統的にコードはRで利用できますが、バージョン3以降では同様のモジュールがPythonでも利用できます。

ここで実際の例を見ることができます

import sys
sys.path.insert(1,"../../../")
import h2o

def anomaly(ip, port):
    h2o.init(ip, port)

    print "Deep Learning Anomaly Detection MNIST"

    train = h2o.import_frame(h2o.locate("bigdata/laptop/mnist/train.csv.gz"))
    test = h2o.import_frame(h2o.locate("bigdata/laptop/mnist/test.csv.gz"))

    predictors = range(0,784)
    resp = 784

    # unsupervised -> drop the response column (digit: 0-9)
    train = train[predictors]
    test = test[predictors]

    # 1) LEARN WHAT'S NORMAL
    # train unsupervised Deep Learning autoencoder model on train_hex
    ae_model = h2o.deeplearning(x=train[predictors], training_frame=train, activation="Tanh", autoencoder=True,
                                hidden=[50], l1=1e-5, ignore_const_cols=False, epochs=1)

    # 2) DETECT OUTLIERS
    # anomaly app computes the per-row reconstruction error for the test data set
    # (passing it through the autoencoder model and computing mean square error (MSE) for each row)
    test_rec_error = ae_model.anomaly(test)

    # 3) VISUALIZE OUTLIERS
    # Let's look at the test set points with low/median/high reconstruction errors.
    # We will now visualize the original test set points and their reconstructions obtained
    # by propagating them through the narrow neural net.

    # Convert the test data into its autoencoded representation (pass through narrow neural net)
    test_recon = ae_model.predict(test)

    # In python, the visualization could be done with tools like numpy/matplotlib or numpy/PIL

if __name__ == '__main__':
    h2o.run_test(sys.argv, anomaly)

ありがとう!このパッケージについてはまだ検討していません-候補リストに追加します。明確にするために、「バージョン3を超えるとpythonでも同様のモジュールが利用可能です」と言うとき、h2oの異常検出モジュール(ver 3を超える)がPythonまたは他のモジュールで利用できるかどうかを知っていますか?
ximiki

1
@ximikまあ、私は彼らの最新バージョン3.0.0.26(h2o-release.s3.amazonaws.com/h2o/rel-shannon/26/docs-website/…)のPythonドキュメントを再訪しましたが、h2o.anomalyはそうではないようですR apiとは異なり、利用可能です。Googleグループ(groups.google.com/forum/#!topic/h2ostream/uma3UdpanEI)で質問を提起しており、それに従うことができます。
0xF

1
さて、h2oサポートグループが質問に答えており、Pythonでも異常が利用可能です。例はここで入手できます。github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/…–
0xF

パーフェクト!調査していただきありがとうございます。この投稿を結果で更新します。
ximiki

1
h2oテストへのリンクはもう機能しませんが、(おそらく)同等のものがあります:github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/…(バージョンへのパーマリンク書いている時点であるgithub.com/h2oai/h2o-3/blob/...
アンドレホルズナー

11

私は最近ツールボックスを開発しました:Py thon O utlier D etectionツールボックス(PyOD)。GitHubを参照しください。

監視なしのアプローチと監視付きのアプローチの両方で、データ内の外れたオブジェクトを識別するために設計されています。PyODは以下の機能を備えています:

  • さまざまなアルゴリズムにわたる統一されたAPI、詳細なドキュメント、およびインタラクティブな例。
  • ニューラルネットワーク/ディープラーニングおよび外れ値アンサンブルを含む高度なモデル。
  • numbaとjoblibを使用して、可能な場合はJITと並列化でパフォーマンスを最適化しました。Python 2と3の両方と互換性があります(scikit-learn互換性もあります)。

重要なリンクを次に示します。

科学出版物でPyODを使用する場合、次の論文の引用を歓迎します。

@article{zhao2019pyod,
  title={PyOD: A Python Toolbox for Scalable Outlier Detection},
  author={Zhao, Yue and Nasrullah, Zain and Li, Zheng},
  journal={arXiv preprint arXiv:1901.01588},
  year={2019},
  url={https://arxiv.org/abs/1901.01588}
}

現在、JMLR (機械学習のオープンソースソフトウェアトラック)でレビュー中です。preprintを参照してください。


簡単な紹介

PyODツールキットは、3つの主要な機能グループで構成されています。(i)外れ値検出アルゴリズム。(ii)外れ値アンサンブルフレームワークおよび(iii)外れ値検出ユーティリティ関数。

個別検出アルゴリズム

  • PCA:主成分分析(固有ベクトル超平面までの重み付き投影距離の合計)
  • MCD:最小共分散決定要因(外れ値スコアとしてマハラノビス距離を使用)
  • OCSVM:ワンクラスサポートベクターマシン
  • LOF:ローカル外れ値因子
  • CBLOF:クラスタリングベースのローカル外れ値要因
  • LOCI:LOCI:局所相関積分を使用した高速外れ値検出
  • HBOS:ヒストグラムベースの外れ値スコア
  • kNN:k最近傍(k番目の最近傍までの距離を-**外れ値スコアとして使用
  • AvgKNN:平均kNN(外れ値スコアとしてk個の最近傍への平均距離を使用)
  • MedKNNkNNの中央値(外れ値スコアとしてk最近傍への距離の中央値を使用)
  • ABOD:角度ベースの外れ値検出
  • FastABOD:近似を使用した高速角度ベースの外れ値検出
  • SOS:確率的外れ値の選択
  • IForest:隔離の森
  • 機能バギング
  • LSCP:LSCP:並列外れ値アンサンブルのローカル選択的組み合わせ
  • XGBOD:極端なブースティングベースの外れ値検出(監視あり)
  • AutoEncoder:完全に接続されたAutoEncoder(外れ値スコアとして再構築エラーを使用)
  • SO_GAAL:単一目的の生成的敵対的能動学習
  • MO_GAAL:多目的生成的敵対的能動学習

外れ値検出器/スコアの組み合わせフレームワーク

  • 機能バギング
  • LSCP:LSCP:並列外れ値アンサンブルのローカル選択的組み合わせ
  • 平均:スコアを平均化する単純な組み合わせ
  • 加重平均:スコアを検出器の重みで平均化する単純な組み合わせ
  • 最大化:最大スコアを取ることによる単純な組み合わせ
  • AOM:最大の平均
  • MOA:平均の最大化

外れ値検出のユーティリティ関数

  1. score_to_lable():生の外れ値スコアをバイナリラベルに変換します
  2. precision_n_scores():外れ値マイニングの一般的な評価指標の1つ(精度@ランクn)
  3. generate_data():外れ値検出実験用の擬似データを生成します
  4. wpearsonr():重み付きピアソンは擬似グラウンドトゥルース生成に役立ちます

実装されたすべてのモデルの比較は、以下で利用可能になります:(コードJupyterノートブック):ここに画像の説明を入力してください

興味がある場合は、Github(https://github.com/yzhao062/Pyod)で詳細を確認してください。


8

私は現在、あなたと同じステージにいます。いくつかの調査を行って、異常検出に最適なオプションを見つけています。

私が見つけたのは、あなたのニーズに最もよくマッチし、あなたが見たものと比べて良いと思うことです。つまり、TwitterAnomalyDetection、SkyLine。

私は、NumentaのNAB(Numenta Anomaly Benchmark)の方が良いと感じました。また、非常に優れたコミュニティのサポートがあり、あなたにとってのポイントはオープンソースであり、Pythonで開発されています。アルゴリズムを追加できます。

アルゴリズムの場合、LOFまたはCBLOFが適切なオプションであることがわかりました。

一度チェックしてみてください。役に立つかもしれません。 https://github.com/numenta/nab

より良いオプションを見つけた場合。教えてください。私も同じ道を歩んでいます。

幸運!!


貴重な情報をありがとう!私は間違いなくこれをチェックします。
-ximiki

3
私は戻って、NABが私の問題にどのように当てはまるかについてコメントしたいと思いました。私が見ることができる唯一の欠点は、これが単変量(1列)時系列異常検出専用であるということですが、多変量(多くの列)はどうですか?この提案をありがとう、私はそれをソリューション候補の候補リストにプッシュします。
ximiki

@ximikiは、MultiVariate Time-Seriesの何かを見つけましたか。私も同様の問題を見ています。
shubham003

7

たぶんこれはあなたが定常状態について言及した原因になります:https : //github.com/twitter/AnomalyDetection

https://blog.twitter.com/2015/introducing-practical-and-robust-anomaly-detection-in-a-time-series


1
お時間をいただきありがとうございますが、「リソース」の最初の箇条書きをご覧ください。このオプションを確認し、「制約」を満たすものを探しました。
ximiki

1
繰り返しになりますが、もっと簡潔にするために、TwitterのAnomalyDetectionパッケージを使用することはここではオプションではありません。「制約」セクションをより注意深く読んでください。これを支援するための誠実な試みを非難するつもりはありませんが、問題はPythonベースのパッケージに限定されます。したがって、将来の有権者は、この回答が有効な選択肢ではないため、この回答に賛成しないでください。私は、これに対する現在の2票をダウン投票でクリアすることをお勧めしますが、おそらくこれはStackexchangeコミュニティ内で非倫理的であり、欠陥を見つけたくないでしょう。
ximiki

1
繰り返しますが、私はこれについてハープすることをおizeびしますが、私は単にこの質問を非常に明確にし、同様の問題に遭遇する他の人が使用できるようにしようとしています。
ximiki

6

異常を検出するために使用する機能は、ログファイルの1行のデータであると思います。もしそうなら、Sklearnはあなたの良き友人であり、あなたはそれをブラックボックスとして使うことができます。1クラスSVMおよびノベルティ検出のチュートリアルを確認してください。

ただし、機能がログファイル全体である場合は、最初に同じ次元の一部の機能にまとめてからNovealty検出を適用する必要があります。


3

誰かがここに着いて興味を持っている場合に備えて、Skylineのアクティブで開発されたバージョンがまだあります。

https://github.com/earthgecko/skyline

https://earthgecko-skyline.readthedocs.io/en/latest

私はプロジェクトの現在のメンテナーであり、パフォーマンス、UI、季節性の処理の面で、元のEtsyバージョンよりもはるかに高度であり、異常データベースの追加機能、相関の計算、フィンガープリント機能を備えています異常なパターンではないことを学びます。


1

多変量時系列があるため、通常は半教師あり(通常のクラスのみが含まれる)トレーニングデータに基づいてシステムのダイナミクスをモデル化するLSTM-RNN実装を探します。これは、「正常」とは何かを学ぶためにモデルを訓練することを意味します。テスト中に、正常な状態と異常な状態の両方をテストして、モデルがそれらを区別する程度を確認します。

ニューラルネットワークの利点は、入力信号間の相互相関を自分で「学習」することです。それらを手動で探索する必要はありません。特に、LSTM-RNNは、制御理論の状態空間モデルと同様に、以前の入力のメモリを保持する能力があるため、時系列モデリングに関して理想的な選択です(例えを見ると)。

Pythonでは、LSTM-RNN使用して実装することはほぼ自明であるKerasの(Tensorflowバックエンドの上)APIを。このネットワークは、任意の数の入力から対象の信号を推定することを学習し、その後、実際の測定値と比較します。「大きな」偏差がある場合は、異常があります(モデルが十分に正確であると仮定した場合)。

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