Zaman serisindeki anomalileri tespit etmek için hangi algoritmayı kullanmalıyım?


70

Arka fon

Network Operations Center'da çalışıyorum, bilgisayar sistemlerini ve performanslarını izliyoruz. İzlenecek kilit ölçütlerden biri, şu anda sunucularımıza bağlı bir dizi ziyaretçi \ müşterisidir. Bunu görünür kılmak için (Ops ekibi) zaman serisi verileri gibi metrikleri topluyoruz ve grafikler çiziyoruz. Grafit bunu yapmamızı sağlıyor, ani düşüşler (çoğunlukla) ve diğer değişiklikler meydana gelirse ekibimize bildirmek için uyarı sistemi oluşturmak için kullandığım oldukça zengin bir API'ye sahip. Şimdilik avg değerini temel alan statik bir eşik belirledim, ancak gün ve hafta boyunca farklı yükler nedeniyle (mevsimsellik faktörü) çok iyi çalışmıyor (birçok yanlış pozitif var).

Bu gibi bir şey görünüyor: sistem başına birkaç kullanıcı

Gerçek veriler (bir metrik için bir örnek, 15 dakikalık bir zaman aralığı; ilk sayı bir kullanıcı sayısı, ikinci zaman damgası):

[{"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]]}]

Ne yapmaya çalışıyorum

Son veri noktalarını alan, bunları geçmiş ortalama ile karşılaştıran ve ani bir değişiklik veya düşüş olursa uyarıları içeren bir Python betiği oluşturdum. Mevsimsellikten dolayı "statik" eşik değeri iyi çalışmaz ve script yanlış pozitif uyarılar oluşturur. Daha hassas olması için bir uyarı algoritmasını geliştirmek ve uyarı eşiğini sürekli ayarlamadan çalışmasını sağlamak istiyorum.

Neye ihtiyacım var ve keşfettiğim şeyler

Google tarafından, anormallik tespiti için (denetimsiz olanlar) makine öğrenme algoritmaları aradığımı düşündüm. Daha ileri araştırmalar bunlardan ton olduğunu gösterdi ve benim durumumda hangisinin uygulanabilir olduğunu anlamak çok zor. Sınırlı matematik bilgimden dolayı, sofistike bilim yazıları okuyamıyorum ve bu alanda yeni başlayanlar için basit bir şey arıyorum.

Python'u seviyorum ve biraz R ile tanıştım, bu yüzden bu dillere ait örnekleri görmekten mutlu olacağım. Lütfen sorunumu çözmeme yardımcı olacak iyi bir kitap veya makale önerin. Zaman ayırdığınız için teşekkür ederim ve bu kadar uzun bir açıklama için özür dilerim.

Kullanışlı bağlantılar

Benzer sorular:

Dış kaynaklar:


1
CUSUM gibi en basit algoritmalardan birine baktınız mı?
Vladislavs Dovgalecs

@ xeon, henüz değil. Konuda yeniyim ve her şeyi sindirmek için biraz zamana ihtiyacım var. Bunu getirdiğin için teşekkürler, iyi bir başlangıç ​​noktası, hemen uygulayabilirim
Ilya Khadykin

1
Bu harika bir soru, @ ma-ge. Benim de benzer bir senaryom var. Benim yaklaşımım, auto.arimaR'nin mükemmel forecastpaketindeki işlevi kullanarak sürekli periyodik tahminler oluşturarak uyarıları ayarlamaktı (bkz. Jstatsoft.org/v27/i03/paper ). levelParametreyi ayarlayarak güven seviyelerini ayarlayabilirsiniz , örn data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99).
Alex Woolford

3
Twitter'dan çocuklar bu konuda çok ilginç bir yazı yazdılar. Göz
ognjenz

Hey @IlyaKhadykin Umarım iyisindir! Bu problem için hiç bir çözümünüz oldu mu? Her dakika belli kullanıcılara sahip olduğumuz ve aynı zamanda pek çok yanlış pozitif elde ettiğimiz tamamen aynı bir şey yapıyorum. Şu an itibariyle her 5 dakikalık aralıklı veri için puan hesaplıyoruz ve onu geçmişe göre gösteriyoruz. ÇALIŞMALARINIZA KATILAN BİR ALGORİTMAMIZ VARSA, NASIL YAPABİLİRSİNİZ? Şimdiden teşekkürler!
ak3191

Yanıtlar:


24

Anahtarın grafiğinizdeki "beklenmeyen" niteleyici olduğunu düşünüyorum. Beklenmeyenleri tespit etmek için ne beklendiği hakkında bir fikre sahip olmanız gerekir .

yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t "çok büyük" bir alarm atıyorsun.

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

Ziyaretçilerin sayısı muhtemelen oldukça kalıcı, ancak süper mevsimlik. Çarpımcı mevsimsellik yerine mevsimsel mankenleri denemek daha iyi işe yarayabilir, daha sonra X'in dışkı değişkenleri temsil ettiği ARMAX'ı deneyebilirsiniz; bu durum tatil mankenleri, saat mankenleri, haftasonları mankenleri vb. Gibi bir şey olabilir.


5
Bu yaklaşım, var olmadığı kabul edilen anomalilere dayanan önyargılı parametrelere sahip olacak belirli bir ARIMA modelini varsaymaktadır. Daha genel bir yaklaşım ALSO'nun önce anomalileri, sonra da anlamlılık satır içi testlerine götüren optimal bir ARIMA modelini tanımlaması olacaktır. Ek olarak anomaliler, burada önerilenden daha genel bir çözüm gerektiren seviye değişimleri, mevsimsel darbeler ve yerel zaman eğilimleri olabilir. Bkz unc.edu/~jbhill/tsay.pdf kapsamlı prosedür için. Daha fazla bilgi için ayrıca Google "Otomatik Müdahale Algılama" özelliğini de kullanabilirsiniz.
IrishStat

@IrishStat Ben ARIMAX'a etkinlikler için mankenleri önerdim. OP, web sitesi çöküşleri gibi bilinen olayları aptallarla hesaplayabilir. Bu, hata farkını azaltacaktır ve daha fazla uyarı olacaktır. Karmaşık model oluşturmak için hiçbir neden yok, çünkü web sitesi trafiği söz konusu olduğunda her şeyi hesaba katmak imkansız. Basit modeller en iyi şekilde çalışacaktır.
Aksakal

2
@ ma-ge, bir şey daha: örtüşen aralıklarla kullanmak isteyebilirsiniz. Her dakika veri topladığınızı varsayalım, ancak modelleme için 10 dakika içinde bir adım seçebilirsiniz. Tahmin için bazı sorunlar yaratır (otokorelasyon nedeniyle), ancak sonuçta ortaya çıkan model daha güçlü olacaktır.
Aksakal

@Aksakal Modeller gerektiği kadar basit olmalıdır, ancak çok basit olmamalıdır.
IrishStat

17

Netflix teknoloji blogunda Robust Anomaly Detection aracında (RAD) bir makale var. http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html

Gereksinimlerinize uyacak şekilde mevsimsellik ve çok yüksek hacimli veri setleri ile ilgilenir. Kod açık kaynaklı Java ve Apache Pig'dir https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig

Temel algoritma sağlam PCA'ya dayanmaktadır - buradaki orijinal makaleye bakın: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf


12

Açık kaynak kodlu paketlerdeki çoğu saptama algoritması düşük frekanslı günlük / haftalık / aylık sıklıkta veri içeren zaman çizelgesi verileri içindir. Bu veriler dakikalar içinde yakalanan özel bir alan için gözüküyor, bu nedenle açık kaynaklı dışlayıcı tespitinin yardımcı olup olmayacağından emin değilim. Bu yaklaşımları verilerinize uyarlamaya çalışabilirsiniz.

Aşağıda, açık kaynak kodlu bazı paket yaklaşımları özetliyor R:

  1. tsoutliers : Chen ve Liu'nun dış algılama algoritmasını arima çerçevesi içinde uygular. Bu sitede önceki soruma bakın . Harika bir yaklaşım, ancak çok yavaş, sizinki gibi yüksek frekanslı verileri işleyebilecek olup olmadığından emin değil. Daha önceki sorum / yazımda belirtildiği gibi her türlü aykırı değeri tespit etme avantajına sahiptir.
  2. Twitter'ın Anomali tespiti : Zaman serisindeki anomalileri tespit etmek için Rosner'ın algoritmasını kullanır . Algoritma zaman dilimleri ayrıştırır ve sonra anomalileri tespit eder. Benim düşünceme göre, zaman serilerinde hayranlıkları tespit etmede etkili ve doğru değildir.
  3. Tahmin paketinde yayınlayanlar : Twitter'ın zaman serilerini ayrıştırması ve sonra aykırı değerlerini saptaması açısından twitter algoritmasına benzer. Sadece ilave aykırı değerleri veya darbeleri algılar.

Anomolleri denemek ve tespit etmek için özel yaklaşımlara sahip ticari paketler vardır. Diğer bir klasik yaklaşım, Tsay'ın zaman serisi dışlayıcı algılama algoritmasıdır, Chen ve Liu'nun farklı aykırı türleri algıladığı yaklaşımına benzer. Son zamanlarda , verileriniz için daha uygun olabilecek metafor adındaki bu ticari yazılım çözümüne de rastladım .

Umarım bu yardımcı olur


Teşekkürler, bana benzer sorunlara ve yaklaşımlara bakış açısı veriyor; bağlantılar için özel teşekkürler!
Ilya Khadykin 17:15

Eğer biri Metafor arıyorsa, Splunk tarafından satın alındık. TSAD algoritmalarımız, Splunk IT Service Intelligence'ın ("ITSI") son sürümlerine dahil edilmiştir.
Alex Cruise

4

İstatistiksel Süreç Kontrolü kurallarını kullanmayı denediniz mi (örn. Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?

Bunları zaman serileri verileri için kullanıyorum - genellikle verilerle ilgili bir sezgiyle dokunmak suretiyle - verilerin gitmesini istemediğim bir yere gidip gitmediğini değerlendirmek için. Örnekte olduğu gibi, bu kurallar eğer delta / değişimin birkaç veri noktası üzerinde tutarlı olması durumunda, bir sorun olabileceğini işaret ediyor.

Ayrıca İstatistiksel Süreç Kontrolü (SPC), öncekinden daha iyi veya daha kötüye gidiyorsanız, çalışmak için iyi olabilir.

SPC ile ilgili bir sorun, çoğunun muhtemelen sıfırın altına düşmeyen verilerinize uymayan normal bir dağılıma dayanmasıdır. SPC ile benden daha iyi diğerleri burada seçenekler önerebilir. Bir sorunu işaretlemek için kullanmayı seviyorum, ancak tüm modeller gibi, en iyi şekilde verilerin kendisi (ve kaynak) hakkındaki bir bilgi birikimi ile kullanılır.


4

m

L(m,τ1:m,θ1:(m+1))=i=1m+1p(y(τi1+1):τiθi)

y1,,yn1<τ1<<τm<npθiimchangepoint R paketi. Daha fazla bilgi edinmek istiyorsanız, aşağıdaki yayınları ve sağladıkları referansları kontrol edebilirsiniz:

Rebecca Killick ve Idris A. Eckley. (2013) changepoint: Changepoint Analizi için bir R Paketi. (çevrimiçi kağıt)

Eckley, IA, Fearnhead, P. ve Killick, R. (2011) Değişken nokta modellerinin analizi. [in:] Bayesian Zaman Serisi Modelleri , ed. D. Barber, AT Cemgil ve S. Chiappa, Cambridge Üniversitesi Yayınları.


4

Zaman serilerinin periyodikliğinin iyi anlaşılması gerektiği göz önüne alındığında, basit fakat etkili bir farklığa dayalı bir algoritma geliştirilebilir.

Basit bir adımlı fark, önceki değerden ani bir düşüş algılayacak

yt=ytyt1

Ancak, serinin güçlü bir periyodik bileşeni varsa, bu düşüşün düzenli olarak dikkate değer olmasını beklersiniz. Bu durumda, herhangi bir değeri önceki dönüşteki aynı noktadaki karşılığı ile karşılaştırmak daha iyi olacaktır, yani bir süre önce.

yt=ytytnwhere n=length of period

Gönderilen soru söz konusu olduğunda, biri gün boyu diğeri haftada olmak üzere iki önemli periyodik bileşen beklemek doğal olacaktır. Ancak, uzun sürenin uzunluğu, kısa sürenin uzunluğu ile düzgün bir şekilde bölündüğü için, bu çok fazla bir komplikasyon değildir.

n247=168

Damlalar orantılı bir karakterde ise, basit bir fark etkinlik düşük olduğunda ani bir düşüşü tespit etmek için kolayca başarısız olacaktır. Bu gibi durumlarda, algoritma bunun yerine oranları hesaplamak için değiştirilebilir.

yt=ytytn

Ben simüle bir veri kümesi kullanarak R bazı testler yaptım. İçinde veri günde 6 kez örneklenir ve diğer gürültü ve dalgalanmaların yanı sıra günlük ve haftalık periyotlar kuvvetlidir. Rastgele yerlere ve 1 ila 3 arasındaki sürelere damlalar ilave edildi. Damlaları
izole etmek için ilk oranlar 42 mesafesinde hesaplandı, daha sonra sadece belirli bir büyüklükteki negatif değişiklik ilgilendiği için 0.6 olarak ayarlanan bir eşik değeri hesaplandı. Sonra bir adımlık fark hesaplandı ve bir eşik -0,5 olarak ayarlandı. Sonunda, bir yanlış pozitif (16 hafta sonundaki) kaymış gibi görünüyor. Sol ve sağdaki grafikler aynı verileri farklı şekillerde gösterir.

görüntü tanımını buraya girin


3

Zaman serilerindeki değişiklikleri bir anomali yerine yeni bir trendin başlangıcı olarak düşünmek daha yararlı olur mu? Bitişik noktalar arasındaki farkı almak, eğimin (türev) ne zaman değiştiğini ve tarihte yeni bir eğilimin başladığını gösterebilir. Ayrıca, fark değerlerinin (ikinci türev) farklarının alınması faydalı olabilir. "Zaman serisinin başlangıcı" üzerinde bir Google araması yapmak, yöntemler için iyi önerilerde bulunabilir.

Dalgacık için iyi bir giriş Hubbard'ın "Dalgalılara göre dünya" olduğunu düşünüyorum.


2

İki farklı algoritma kullanarak çok mevsimsellikli zaman serileri (günlük, haftalık) için güzel sonuçlar elde ettim:

  • Orta nokta serisini oluşturmak için loess (veya STL) kullanarak mevsimsel eğilim ayrıştırma .
  • Varyans ve seviye arasındaki ilişkiye dayanarak, bu orta nokta etrafında eşikler oluşturmak için doğrusal olmayan regresyon .

STL, zaman serilerinizin bir zaman dilimi trend bileşenine, tek bir mevsimlik bileşenine ve geri kalanına ayrışmasını sağlar. Mevsimsel bileşen sizin yüksek frekanslı mevsimselliğinizdir (örneğin günlük), trend hem düşük frekanslı mevsimsellik (örneğin haftalık) hem de uygun olan trendi içerir. İkisini, trend üzerinde tekrar STL çalıştırarak ayırabilirsiniz. Her neyse, kalan diziyi diğer bileşenlerden izole ettiğinizde, anomali tespitinizi bu diziye karşı gerçekleştirebilirsiniz.

Burada daha ayrıntılı bir yazı yazdım:

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


1

David'den ilham alan FFT'yi kullanmaya çalıştınız mı? Ani düşüşleri görebiliyor olabilir, çünkü bunlar anomalilerinizi gösteriyor. Anomaliler dar bir spektrumda görünebilir. Böylece onları kolayca yakalayabilirsiniz.

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.