Python'da açık kaynaklı Anomali Tespiti


61

Sorun Arka Planı: BT izleme alanında bulunanlara benzer günlük dosyaları içeren bir proje üzerinde çalışıyorum (BT alanını en iyi anladığım kadarıyla). Bu günlük dosyaları, yüzlerce / binlerce sıradaki çeşitli parametreler halinde düzenlenmiş zaman serisi verileridir. Her parametre sayısaldır (kayan nokta) ve her zaman noktası için önemsiz / hata olmayan bir değer vardır. Görevim, söz konusu log dosyalarını anomali tespiti için izlemektir (ani, düşme, bazı parametrelerin senkronize olmadığı, garip 1/2 / vb. Türev davranışları, vb.).

Benzer bir görevde, Prelert ile Splunk'u denedim, ama şu anda açık kaynak seçenekleri araştırıyorum.

Kısıtlamalar: Kendimi Python ile sınırlandırıyorum, çünkü bunu iyi biliyorum ve R'ye ve ilişkili öğrenme eğrisine geçişi geciktirmek istiyorum. R (ya da diğer diller / yazılımlar) için çok büyük bir destek olmadığı sürece, bu görev için Python'a bağlı kalmak istiyorum.

Ayrıca, şu an bir Windows ortamında çalışıyorum. Windows'ta küçük boyutlu günlük dosyalarında gezinmeye devam etmek istiyorum ancak gerektiğinde Linux ortamına geçebilirim.

Kaynaklar: Aşağıdakileri çıkmazlarla sonuç olarak kontrol ettim:

  1. Python veya sahtekarlık tespiti için makine öğrenme algoritmaları uygulamak için Ar . Buradaki bazı bilgiler yardımcı olabilir, ancak ne yazık ki doğru paketi bulmakta zorlanıyorum çünkü:

  2. Twitter'ın "AnomalyDetection" si R'de ve Python'a bağlı kalmak istiyorum. Ayrıca, Python portu gizliliği benim için Windows ortamında uygulamada sorunlara neden gibi görünüyor.

  3. Bir sonraki girişimim olan Skyline ( github konularından ) oldukça fazla durmuş görünüyor . Ne kadar az destek online göründüğü göz önüne alındığında, bu konuda derin dalmadım.

  4. scikit-learn Hala araştırıyorum, ancak bu çok daha manuel görünüyor. Yabancı otları aşma yaklaşımı benim için sorun değil, ancak öğrenme araçlarındaki geçmişim zayıf, bu yüzden algoritmalar gibi teknik yönler için Splunk + Prelert'e benzer bir kara kutu gibi bir şey istiyorum.

Problem Tanımı ve Sorular: Python'daki zaman serisi kayıt dosyalarından anormallik tespiti sürecini paketler veya kütüphaneler aracılığıyla otomatik hale getirme konusunda bana yardımcı olabilecek açık kaynaklı bir yazılım arıyorum.

  1. Acil görevime yardımcı olmak için böyle şeyler var mı, yoksa aklımda hayali mi var?
  2. Herhangi biri, geçmişe dayanan temeller veya kavramlar dahil olmak üzere hedefime yardım etmek için somut adımlarda yardımcı olabilir mi?
  3. Bu sorulacak en iyi StackExchange topluluğu mu, yoksa İstatistikler, Matematik, hatta Güvenlik veya Stackoverflow daha iyi seçenekler mi?

EDIT [2015-07-23] Pyculiarity'deki son güncellemenin Windows ortamı için sabit göründüğünü unutmayın ! Onaylamamıştım ama topluluk için başka bir faydalı araç olmalı.

EDIT [2016-01-19] Küçük bir güncelleme. Bu konuda çalışmak ve araştırma yapmak için zamanım olmadı, ancak belirli ayrıntılarda araştırmaya devam etmeden önce bu sorunun temellerini anlamak için bir adım geri atıyorum. Örneğin, attığım iki somut adım:

  1. Anomali tespiti için Wikipedia makaleleriyle başlayarak [ https://en.wikipedia.org/wiki/Anomaly_detection ], tamamen anlayın ve sonra [ https: // gibi diğer bağlantılı Wikipedia makalelerinin konsept hiyerarşisinde yukarı veya aşağı hareket edin. en.wikipedia.org/wiki/K-nearest_neighbors_algorithm ] ve sonra [ https://en.wikipedia.org/wiki/Machine_learning ].

  2. Chandola ve arkadaşları tarafından 2009 yılında yapılan "Anomaly Detection: A Survey" [ http://www-users.cs.umn.edu/~banerjee/papers/09/anomaly.pdf ] ve Hodge ve diğerleri 2004 tarafından yapılan harika araştırmalardaki teknikleri keşfetme "Outlier Tespit Metodolojileri Anketi" [ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ].

Kavramlar daha iyi anlaşıldıktan sonra (pratik tarafı da geliştirmeye devam ederken oyuncak örnekleri ile oynamayı umuyorum), hangi açık kaynaklı Python araçlarının problemlerime daha uygun olduğunu anlamayı umuyorum.


Scikit: daha yeni başlıyorsanız bu videoları öneririm: github.com/justmarkham/scikit-learn-videos
Harvey

h2o kütüphanesi bu modülde içe aktarılmıyor.

1
Senin sorunun kötü tanımlanmış. Bir anomaliyi oluşturan şeyin birçok farklı anlamı olabilir. Ortalamanın sapması mı? Belirli davranış biçimleri mi? Her durumda farklı yöntemler uygulanır. Eğer anormallik ortalamadan sapma ise, "outlier saptaması" nı aramanız gerekecektir. Özel kalıplar arıyorsanız, sinir ağları gibi denetimli bir öğrenme algoritmasıyla daha iyi hizmet görürdünüz.
Willem van Doesburg

1
Python'u istediğinizi biliyorum, ancak anomali tespiti için ELKI kullanılacak araç gibi görünüyor.
Anony-Mousse,

Yanıtlar:


35

Anomali Tespiti veya Olay Tespiti farklı şekillerde yapılabilir:

Temel yol

Türev! Sinyalinizin geçmişinden ve geleceğinden sapması yüksekse, büyük olasılıkla bir etkinliğiniz vardır. Bu, sinyalin türevinde büyük sıfır geçişler bularak çıkarılabilir.

İstatistiksel Yol

Her şeyin ortalaması, olağan, temel davranışıdır. eğer bir şey demek istemeden saparsa, bunun bir olay olduğu anlamına gelir. Zaman serilerindeki ortalamaların önemsiz olmadığını ve sabit olmadığını, zaman serilerindeki değişikliklere göre değiştiğini lütfen unutmayın, bu nedenle ortalama yerine "hareketli ortalama" yı görmeniz gerekir . Bu gibi görünüyor:

Olaylar, hareketli ortalamadan 1 standart sapmadan daha büyük zirvelerdir

Hareketli Ortalama kodu burada bulunabilir . Sinyal işleme terminolojisinde , hareketli ortalamayı uygulayarak "Düşük Geçişli" bir filtre uyguluyorsunuz.

Aşağıdaki kodu takip edebilirsiniz:

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])

Olasılık Yolu

Makine Öğrenmesi için yeni insanlar için özel olarak daha sofistike. Kalman Filter, anomalileri bulmak için harika bir fikir . "Maksimum Olabilirlik Tahmini" kullanarak daha basit olasılıklı yaklaşımlar da iyi sonuç verir, ancak önerim hareketli ortalama fikrini sürdürmektir. Uygulamada çok iyi çalışıyor.

Umarım yardım edebilirim :) İyi Şanslar!


Derin tartışma konusundaki çabalarınız için teşekkür ederim. Programlama çok kötü gözükmese de (oldukça ilginç, diyebilirim ki algoritmalara derinlemesine dalmak için), zaten mevcut olan paketleri merak ediyorum. Kurulumu kolay olan herhangi bir şey biliyor musunuz? Bunun, uygulanmasının basit olmadığını ve garanti edemeyeceğimi anladığımı unutmayın. Ortamımı işlevsel hale getirebilirsem, görevim için örneklere dayanarak inceltebileceğime inanıyorum.
ximiki

15

h2o bir anormallik algılama modülüne sahiptir ve geleneksel olarak kod R'de mevcuttur. Ancak sürüm 3'ün ötesinde python'da da benzer bir modüle sahiptir ve h2o açık kaynak olduğundan faturanıza uyabilir.

Burada çalışan bir örnek görebilirsiniz

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)

Teşekkürler! Bu paketi henüz değerlendirmedim - onu aday listesine ekleyeceğim. Netleştirmek için, "sürüm 3'ün ötesinde python'da da benzer bir modüle sahip" derken, h2o'nun anormallik tespit modülünün (ver 3'ün ötesinde) Python'da veya başka bir modülde mevcut olup olmadığını biliyor musunuz?
ximiki

1
@ximik En son 3.0.0.26 sürümünün python belgelerine tekrar baktım ( h2o-release.s3.amazonaws.com/h2o/rel-shannon/26/docs-website/… ) ve h2o.anomaly sanki görünmüyor R api'sinden farklı olarak soruyu yanıtladım. Soruyu google gruplarında ( groups.google.com/forum/#!topic/h2ostream/uma3UdpanEI ) yükselttim ve bunu takip edebilirsiniz.
0xf

1
Eh, h2o destek grubu soruyu cevapladı ve python'da anormallik de var. Burada bir örnek var. github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/...
0xF

Mükemmel! araştırdığınız için teşekkür ederim. bu yayını sonuçlarla güncelleyeceğim.
ximiki

1
h2o testine bağlantı artık çalışmıyor, ama bir (muhtemelen) eşdeğer bir fark var: github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/... sürümüne (kalıcı bağlantı yazdığı sırada github.com/h2oai/h2o-3/blob/… )
Andre Holzner

11

: Geçenlerde bir alet çantası geliştirdi Py thon Ç utlier D etection araç ( PyOD ). GitHub'a bakın .

Hem denetimsiz hem de denetimli yaklaşımlarla verilerdeki ana nesneleri tanımlamak için tasarlanmıştır. PyOD şunları içeriyor:

  • Birleştirilmiş API'ler, ayrıntılı belgeler ve çeşitli algoritmalar arasında etkileşimli örnekler.
  • Yapay Sinir Ağları / Derin Öğrenme ve Outlier Toplulukları dahil olmak üzere gelişmiş modeller.
  • Numba ve joblib kullanarak, mümkün olduğunda JIT ve paralelleştirme ile optimize edilmiş performans. Her iki Python 2 ve 3 ile uyumlu (aynı zamanda scikit-learn uyumludur).

İşte bazı önemli bağlantılar:

PyOD'u bilimsel bir yayında kullanırsanız, aşağıdaki makaleye atıfta bulunmaktan memnuniyet duyarız.

@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}
}

Şu anda JMLR'de (makine öğrenen açık kaynaklı yazılım parçası) incelenmektedir. Ön baskıya bakınız .


Hızlı giriş

PyOD araç takımı üç ana işlev grubundan oluşur: (i) dış algılama algoritmaları; (ii) outlier topluluk çerçeveleri ve (iii) outlier algılama yardımcı programı işlevleri.

Bireysel Algılama Algoritmaları :

  • PCA : Temel Bileşen Analizi (özvektör hiper düzlemlerine ağırlıklı olarak öngörülen mesafelerin toplamı)
  • MCD : Minimum Kovaryans Belirleyicisi (mahalanobis mesafelerini ana puanlar olarak kullanın)
  • OCSVM : Bir Sınıf Destek Vektör Makineleri
  • LOF : Yerel Outlier Faktörü
  • CBLOF : Kümeleme Tabanlı Yerel Aykırı Faktör
  • LOCI : LOCI: Yerel korelasyon integralini kullanarak hızlı outlier tespiti
  • HBOS : Histogram Tabanlı Outlier Skoru
  • kNN : k En Yakın Komşular (en yakın komşuya olan mesafeyi - ** outlier puanı olarak kullanın.
  • OrtKNN : Ortalama kNN (en yakın komşulara olan uzak mesafeyi genel puanı olarak kullanın)
  • MedKNN : Ortanca kNN (en yakın komşu k olan ortanca mesafeyi outlier skoru olarak kullanın)
  • ABOD : Açı Tabanlı Ana Tespit Tespiti
  • FastABOD : Yaklaştırma kullanarak Hızlı Açı Tabanlı Outlier Tespiti
  • SOS : Stokastik Aykırı Seçim
  • IForest : İzolasyon Ormanı
  • Özellik Torbalama
  • LSCP : LSCP: Paralel Outlier Topluluğunun Lokal Olarak Seçici Kombinasyonu
  • XGBOD : Aşırı Yükseltme Tabanlı Outlier Detection (Denetimli)
  • AutoEncoder : Tamamen bağlanmış AutoEncoder (genel puan olarak yeniden yapılandırma hatası kullanın)
  • SO_GAAL : Tek Amaçlı Üretken Çekişmeli Aktif Öğrenme
  • MO_GAAL : Çok Amaçlı Üretken Olumlu Etkin Öğrenme

Outlier Dedektör / Puan Kombinasyon Çerçeveleri :

  • Özellik Torbalama
  • LSCP : LSCP: Paralel Outlier Topluluğunun Lokal Olarak Seçici Kombinasyonu
  • Ortalama : Puanların ortalaması alınarak basit kombinasyon
  • Ağırlıklı Ortalama : Detektör ağırlıkları ile puanların ortalaması alınarak basit kombinasyon
  • Maksimizasyon : Maksimum skorları alarak basit kombinasyon
  • AOM : Maksimum Ortalama
  • MOA : Ortalamanın Maksimize Edilmesi

Outlier Detection için Yardımcı Program İşlevleri :

  1. score_to_lable (): ham outlier puanlarını ikili etiketlere dönüştür
  2. precision_n_scores (): Dış madencilik için popüler değerlendirme ölçütlerinden biri (precision @ rank n)
  3. construc_data (): outlier algılama deneyi için sahte veri üret
  4. wpearsonr (): ağırlıklı pearson, sahte gerçek gerçeği oluşturmada faydalıdır.

Uygulanan tüm modellerin karşılaştırması aşağıda verilmektedir: ( Şekil , Kod , Jüpyter Not Defterleri ):görüntü tanımını buraya girin

Eğer ilgileniyorsanız, daha fazla bilgi için lütfen Github'a ( https://github.com/yzhao062/Pyod ) bakın.


8

Şu anda senin gibi aynı sahnedeyim. Bazı araştırmalar yaparak anomali saptama için en iyi seçeneği buluyorum.

Bulduğum şey, ihtiyacınıza en uygun olduğunu ve gördüklerinize göre daha iyi olduğunu düşünüyorum. yani, TwitterAnomalyDetection, SkyLine.

Numenta NAB olduğunu (Numenta Anomaly Benchmark) daha iyi buldum. Aynı zamanda çok iyi bir topluluk desteğine sahip ve sizin için artı nokta açık kaynak kodlu ve python ile geliştirilmiş. Algoritmanızı buna ekleyebilirsiniz.

Algoritma durumunda, LOF veya CBLOF'un iyi bir seçenek olduğunu buldum.

öyleyse bir kez kontrol et. Size yardımcı olabilir. https://github.com/numenta/nab

Daha iyi bir seçenek bulursanız. lütfen söyle bana. Ben de aynı yoldayım.

İyi şanslar!!


Değerli bilgiler için teşekkürler! Bunu kesinlikle kontrol edeceğim.
ximiki

3
Sadece NAB'ın benim sorunumda ne gibi göründüğü konusunda geri dönmek ve yorum yapmak istedim. Görebildiğim tek dezavantaj, bunun sadece tek değişkenli (bir sütun) zaman serisi anomalisi tespiti için olmasıdır, peki ya çok değişkenli (çok sayıda sütun)? Bu öneri için teşekkür ederim, çözüm adayları için kısa listeye iteceğim.
ximiki

@ ximiki, MultiVariate Time-Series için herhangi bir şey buldun mu? Ben de aynı soruna bakıyorum.
shubham003

7

1
Zaman ayırdığınız için teşekkür ederiz, ancak lütfen "Kaynaklar" başlıklı ilk bültenime bakın; Bu seçeneği inceledim ve "Kısıtlamalarımı" karşılayan bir şey aradım.
ximiki

1
Tekrarlamak ve belki de daha açık olmak gerekirse, Twitter'ın AnomalyDetection paketini kullanmak burada bir seçenek DEĞİLDİR: Lütfen "Kısıtlamalar" bölümünü daha dikkatli okuyun. Bu konuda yardımcı olacak herhangi bir samimi girişimi kınamak istemem, ancak soru kesinlikle Python tabanlı paketler içindir. Bu nedenle, gelecekteki seçmenler, LÜTFEN kullanılamaz seçenek olmadığı için bu cevabı abartmayın. Bunun için mevcut 2 oyu aşağı oy kullanarak temizlemenizi öneririm, ancak belki de bu Stackexchange topluluğu içinde etik değil ve herhangi bir sığınak yakalamak istemiyorum.
ximiki

1
Yine, bunun için üzüldüğüm için özür dilerim, ancak benzer bir sorunla karşılaşan başkaları için bu soruyu çok net ve kullanışlı hale getirmeye çalışıyorum ve onların vahşi bir kaz kovalamacasına gitmelerini istemiyorum.
ximiki,

6

Anormalliği tespit etmek için kullandığınız özelliğin bir günlük dosyasındaki bir veri satırı olduğunu varsayıyorum. Öyleyse, Sklearn senin iyi arkadaşın ve kara kutu olarak kullanabilirsiniz. Bir sınıf SVM ve Yenilik algılama öğreticisini kontrol edin .

Ancak, özelliğinizin tüm bir günlük dosyası olması durumunda, önce onu aynı boyuttaki bazı özelliklere göre özetlemeniz ve ardından Novealty tespitini uygulamanız gerekir.


3

Birinin buraya inip ilgilenmesi durumunda, Skyline'ın hala aktif ve gelişmiş bir sürümü var.

https://github.com/earthgecko/skyline

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

Projenin şu anki sorumlusuyum ve artık performans, UI, mevsimsellik açısından daha iyi idare etme açısından orijinal Etsy versiyonundan çok daha gelişmiş ve bir anormallik veri tabanının ek işlevlerine sahip, korelasyonları ve parmak izi yeteneğini hesaplıyor ve anormal olmayan kalıpları öğrenir.


1

Çok değişkenli zaman serileriniz olduğundan, genellikle yarı denetimli (yalnızca normal sınıf dahil) eğitim verilerine dayanarak sisteminizin dinamiklerini modelleyen bir LSTM-RNN uygulamasına gideceğim. Bu, modelinizi "normal" olanı öğrenmek için eğittiğiniz anlamına gelir. Test sırasında, modelin ne kadar iyi ayrıldığını görmek için hem normal hem de anormal koşulları test edersiniz.

Sinir ağlarının bir avantajı, giriş sinyalleri arasındaki çapraz bağıntıları kendi başlarına "öğrenmeleri"; Bunları manuel olarak keşfetmenize gerek yok. Özellikle LSTM-RNN'ler, kontrol teorisindeki bir durum uzay modeline benzer şekilde (analojiyi görüyorsanız) önceki girdilerin hafızasını tutabildikleri için zaman serisi modellemesi söz konusu olduğunda ideal bir seçimdir.

Python'da, bir LSTM-RYSA kullanarak uygulamak neredeyse önemsiz Keras (Tensorflow arka uç üstünde) API. Bu ağ, daha sonra gerçek ölçülen değerle karşılaştıracağınız, istediğiniz sayıda giriş verilen ilgi sinyallerini tahmin etmeyi öğrenir. Eğer "büyük" bir sapma varsa, bir anomaliye sahip olursunuz (modelin yeterince doğru olması koşuluyla)!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.