Tôi nên sử dụng thuật toán nào để phát hiện dị thường trên chuỗi thời gian?


70

Lý lịch

Tôi đang làm việc trong Trung tâm điều hành mạng, chúng tôi giám sát các hệ thống máy tính và hiệu suất của chúng. Một trong những số liệu quan trọng cần theo dõi là một số khách truy cập \ khách hàng hiện đang kết nối với máy chủ của chúng tôi. Để hiển thị, chúng tôi (nhóm Ops) thu thập các số liệu như dữ liệu chuỗi thời gian và vẽ biểu đồ. Graphite cho phép chúng tôi làm điều đó, nó có một API khá phong phú mà tôi sử dụng để xây dựng hệ thống cảnh báo để thông báo cho nhóm của chúng tôi nếu giảm đột ngột (chủ yếu) và các thay đổi khác xảy ra. Hiện tại tôi đã đặt ngưỡng tĩnh dựa trên giá trị avg nhưng nó không hoạt động tốt (có rất nhiều lỗi sai) do tải khác nhau trong ngày và tuần (yếu tố mùa vụ).

Nó trông giống như thế này: số lượng người dùng trên mỗi hệ thống

Dữ liệu thực tế (ví dụ cho một số liệu, phạm vi thời gian 15 phút; số đầu tiên là số người dùng, tem thời gian thứ hai):

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

Những gì tôi đang cố gắng thực hiện

Tôi đã tạo một tập lệnh Python nhận các biểu dữ liệu gần đây, so sánh chúng với mức trung bình lịch sử và cảnh báo nếu có sự thay đổi hoặc giảm đột ngột. Do ngưỡng "tĩnh" theo mùa không hoạt động tốt và tập lệnh tạo cảnh báo dương tính giả. Tôi muốn cải thiện một thuật toán cảnh báo để chính xác hơn và làm cho nó hoạt động mà không cần điều chỉnh ngưỡng cảnh báo liên tục.

Tôi cần lời khuyên gì và những điều tôi khám phá ra

Bằng cách googling tôi đã tìm ra rằng tôi đang tìm kiếm các thuật toán học máy để phát hiện sự bất thường (những thứ không được giám sát). Điều tra sâu hơn cho thấy có rất nhiều trong số họ và rất khó hiểu cái nào có thể áp dụng trong trường hợp của tôi. Do kiến ​​thức toán học hạn chế của tôi, tôi không thể đọc các bài viết học thuật tinh vi và tôi đang tìm kiếm thứ gì đó đơn giản cho người mới bắt đầu trong lĩnh vực này.

Tôi thích Python và làm quen với R một chút, vì vậy tôi sẽ rất vui khi thấy các ví dụ cho các ngôn ngữ này. Xin giới thiệu một cuốn sách hay bài viết hay sẽ giúp tôi giải quyết vấn đề của mình. Cảm ơn bạn đã dành thời gian và xin lỗi vì đã mô tả dài như vậy

Liên kết hữu ích

Câu hỏi tương tự:

Tài nguyên bên ngoài:


1
Bạn đã xem một trong những thuật toán đơn giản nhất như CUSUM chưa?
Vladislavs Dovgalecs 17/05/2015

@xeon, chưa. Tôi mới tham gia môn học và cần một chút thời gian để tiêu hóa mọi thứ. Cảm ơn vì đã đưa ra điều này, đó là một điểm khởi đầu tốt, tôi có thể thực hiện nó ngay bây giờ
Ilya Khadykin

1
Đó là một câu hỏi hay, @ ma-ge. Tôi có một kịch bản tương tự. Cách tiếp cận của tôi là thiết lập cảnh báo bằng cách xây dựng các dự báo định kỳ liên tục bằng cách sử dụng auto.arimachức năng từ forecastgói tuyệt vời của R (xem jstatsoft.org/v27/i03/apers ). Bạn có thể điều chỉnh các mức độ tin cậy bằng cách điều chỉnh leveltham số, ví dụ data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99).
Alex Woolford

3
Các chàng trai từ Twitter đã viết bài viết rất thú vị về chủ đề này. Hãy xem thử: blog.twitter.com/2015/ trộm
ognjenz

Này @IlyaKhadykin Hy vọng bạn đang làm tốt! bạn đã bao giờ có bất kỳ giải pháp cho vấn đề này. Tôi đang làm một cái gì đó giống hệt nhau trong đó mỗi phút chúng tôi có một số người dùng nhất định và chúng tôi cũng nhận được rất nhiều thông tin sai. Cho đến bây giờ, chúng tôi đang tính điểm cho mỗi 5 phút của dữ liệu khoảng thời gian và khớp nó với mẫu lịch sử. NẾU BẠN GỌI BẤT CỨ VIỆC NÀO THAM GIA LÀM VIỆC, BẠN CÓ THỂ XIN CHIA SẺ CÁCH NÀO BẠN ĐÃ NÓ. Cảm ơn trước!
ak3191

Câu trả lời:


24

Tôi nghĩ rằng chìa khóa là vòng loại "bất ngờ" trong biểu đồ của bạn. Để phát hiện những điều bất ngờ, bạn cần phải có ý tưởng về những gì được mong đợi .

Tôi sẽ bắt đầu với một mô hình chuỗi thời gian đơn giản như AR (p) hoặc ARMA (p, q). Phù hợp với dữ liệu, thêm tính thời vụ cho phù hợp. Chẳng hạn, mô hình SAR (1) (24) của bạn có thể là: , trong đó là thời gian tính bằng giờ. Vì vậy, bạn sẽ dự đoán biểu đồ cho giờ tiếp theo. Bất cứ khi nào lỗi dự đoán là "quá lớn", bạn sẽ đưa ra cảnh báo.yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t

Khi bạn ước tính mô hình, bạn sẽ nhận được phương sai của lỗi . Tùy thuộc vào các giả định phân phối của bạn, chẳng hạn như bình thường, bạn có thể đặt ngưỡng dựa trên xác suất, chẳng hạn như cho 99,7% hoặc .σεεt|et|<3σεet>3σε

Số lượng du khách có lẽ khá dai dẳng, nhưng siêu mùa. Có thể hoạt động tốt hơn để thử các hình nộm theo mùa thay vì tính thời vụ nhân, sau đó bạn sẽ thử ARMAX trong đó X là viết tắt của các biến ngoại sinh, có thể là bất cứ thứ gì như hình nộm kỳ nghỉ, hình nộm giờ, hình nộm cuối tuần, v.v.


5
Cách tiếp cận này giả định một mô hình ARIMA cụ thể sẽ có các tham số sai lệch dựa trên sự bất thường đã được giả định là không tồn tại. Một cách tiếp cận tổng quát hơn sẽ là C ALNG xác định sự bất thường trước tiên và sau đó là một mô hình ARIMA tối ưu dẫn đến các thử nghiệm nội tuyến có ý nghĩa. Bất thường bổ sung có thể là sự thay đổi mức độ, xung theo mùa và xu hướng thời gian địa phương đòi hỏi một giải pháp tổng quát hơn đề xuất ở đây. Xem chú.edu / ~ jbhill / tsay.pdf để biết quy trình toàn diện. Bạn cũng có thể Google "Phát hiện can thiệp tự động" để biết thêm thông tin.
IrishStat

@IrishStat Tôi đã đề xuất ARIMAX với các hình nộm cho các sự kiện. OP có thể giải thích cho các sự kiện đã biết như sự cố trang web với các hình nộm. Điều này sẽ làm giảm phương sai lỗi và sẽ có nhiều cảnh báo hơn. Không có lý do để xây dựng mô hình phức tạp, vì đơn giản là không thể tính đến mọi thứ khi nói đến lưu lượng truy cập trang web. Các mô hình đơn giản sẽ làm việc tốt nhất.
Aksakal

2
@ ma-ge, một điều nữa: bạn có thể muốn sử dụng các khoảng chồng chéo. Giả sử bạn thu thập dữ liệu mỗi phút, nhưng để lập mô hình, bạn có thể chọn một bước trong 10 phút. Nó tạo ra một số vấn đề cho ước tính (do tự tương quan), nhưng mô hình kết quả rất có thể sẽ mạnh mẽ hơn.
Aksakal

Mô hình @Aksakal nên đơn giản như cần thiết NHƯNG không quá đơn giản.
IrishStat

17

Trên blog công nghệ Netflix có một bài viết về công cụ Phát hiện dị thường Robust (RAD) của họ. http://techblog.netflix.com/2015/02/rad-outmore-detection-on-big-data.html

Nó liên quan đến tính thời vụ và bộ dữ liệu khối lượng rất lớn để có thể phù hợp với yêu cầu của bạn. Mã này là mã nguồn mở Java và Apache Pig https://github.com/Netflix/Surus/blob/master/resource/examples/pig/rad.pig

Thuật toán cơ bản dựa trên PCA mạnh mẽ - xem bài viết gốc tại đây: http://statweb.stanford.edu/~candes/ con / RevustPCA.pdf


12

Hầu hết các thuật toán phát hiện ngoại lệ trong gói nguồn mở là dành cho dữ liệu chuỗi thời gian kinh doanh với dữ liệu tần số thấp, hàng ngày / hàng tuần / hàng tháng. Dữ liệu này dường như là dành cho một khu vực chuyên biệt được ghi lại trong vài phút, vì vậy tôi không chắc liệu việc giải mã ngoại lệ nguồn mở có hữu ích hay không. Bạn có thể thử điều chỉnh cách tiếp cận này với dữ liệu của bạn.

Dưới đây tôi phác thảo một số cách tiếp cận gói có sẵn trong nguồn mở R:

  1. tsoutliers : Triển khai thuật toán phát hiện ngoại lệ của Chen và Liu trong khuôn khổ arima. xem câu hỏi trước đó của tôi trên trang web này. Cách tiếp cận tuyệt vời, nhưng rất chậm không chắc chắn liệu nó có thể xử lý dữ liệu tần số cao như của bạn hay không. Nó có khả năng phát hiện tất cả các loại ngoại lệ như được đề cập trong câu hỏi / bài viết trước đây của tôi.
  2. Phát hiện sự bất thường của Twitter : Sử dụng thuật toán của Rosner để phát hiện sự bất thường dựa trên chuỗi thời gian. Thuật toán phân tách thời gian và sau đó phát hiện dị thường. Theo ý kiến ​​cá nhân của tôi, điều này không hiệu quả và chính xác trong việc phát hiện các lỗi thời trong chuỗi thời gian.
  3. tsoutlier trong gói dự báo: Tương tự như thuật toán của twitter về mặt phân tách chuỗi thời gian và sau đó phát hiện các ngoại lệ. Chỉ sẽ phát hiện các ngoại lệ hoặc xung phụ gia.

Có những gói thương mại có cách tiếp cận chuyên dụng để thử và phát hiện sự bất thường. Một cách tiếp cận cổ điển khác là thuật toán phát hiện ngoại lệ theo chuỗi thời gian của Tsay , tương tự như cách tiếp cận của Chen và Liu, nó phát hiện các loại ngoại lệ khác nhau. Gần đây tôi cũng tình cờ tìm thấy giải pháp phần mềm thương mại này có tên là metafor , có thể phù hợp hơn với dữ liệu của bạn.

Hy vọng điều này hữu ích


Cảm ơn, nó cho tôi quan điểm về các vấn đề và cách tiếp cận tương tự; cảm ơn đặc biệt cho các liên kết!
Ilya Khadykin 17/05/2015

Nếu bất cứ ai đang tìm kiếm Metafor, chúng tôi đã có được Splunk. Các thuật toán TSAD của chúng tôi được bao gồm trong các phiên bản gần đây của Splunk IT Service Intelligence ("ITSI").
Alex Cruise

4

Bạn đã thử sử dụng các quy tắc Kiểm soát quá trình thống kê (ví dụ: Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?

Tôi sử dụng chúng cho dữ liệu chuỗi thời gian - thường với một chút trực giác về dữ liệu - để đánh giá liệu dữ liệu có đi đâu đó không, tôi không muốn nó đi. Giống như ví dụ của bạn, các quy tắc này cho biết nếu delta / thay đổi nhất quán trên một số điểm dữ liệu, thì nó đánh dấu rằng có thể có vấn đề.

Ngoài ra Kiểm soát quá trình thống kê (SPC) có thể tốt cho việc tập luyện nếu bạn trở nên tốt hơn hoặc kém hơn trước.

Một vấn đề với SPC là phần lớn phụ thuộc vào phân phối bình thường có thể không phù hợp với dữ liệu của bạn, không thể xuống dưới 0. Những người khác tốt hơn tôi với SPC có thể đề xuất các tùy chọn ở đây. Tôi thích sử dụng nó để gắn cờ một vấn đề, nhưng, giống như tất cả các mô hình, được sử dụng tốt nhất với một hạt kiến ​​thức về chính dữ liệu (và nguồn).


4

Điều mà các câu trả lời khác dường như không đề cập đến là vấn đề của bạn có vẻ như là một phát hiện thay đổi . Ý tưởng phát hiện thay đổi là bạn đang tìm kiếm các phân đoạn trong dữ liệu của mình có sự khác biệt đáng kể về các thuộc tính thuật ngữ (ví dụ: trung bình, phương sai). Điều này có thể đạt được bằng cách sử dụng ước tính khả năng tối đa của tôi, trong đó đối với thay đổi chức năng khả năng làm

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

trong đó là dữ liệu của bạn, là các điểm ranh giới đánh dấu các thay đổi và phân phối xác suất được tham số hóa bởi cho mỗi phân đoạn thứ . Điều này có thể dễ dàng khái quát để vide nhiều tình huống. Một số thuật toán tồn tại để tìm các tham số, bao gồm cả việc tìm chưa biết . Ngoài ra còn có phần mềm có sẵn để ước tính các mô hình như vậy, ví dụ như gói cho R. Nếu bạn muốn tìm hiểu thêm, bạn có thể kiểm tra các ấn phẩm sau đây và các tài liệu tham khảo mà chúng cung cấp: 1 < τ 1 < < τ m < n p θ i i my1,,yn1<τ1<<τm<npθiimchangepoint

Rebecca Killick và Idris A. Eckley. (2013) changepoint: Gói R để phân tích Changepoint. (giấy trực tuyến)

Eckley, IA, Fearnhead, P. và Killick, R. (2011) Phân tích các mô hình thay đổi. [in:] Mô hình chuỗi thời gian Bayes , eds. D. Thợ cắt tóc, AT Cemgil và S. Chiappa, Nhà xuất bản Đại học Cambridge.


4

Cho rằng tính tuần hoàn của chuỗi thời gian nên được hiểu rõ một thuật toán đơn giản nhưng hiệu quả, dựa trên sự khác biệt có thể được đưa ra.

Sự khác biệt một bước đơn giản sẽ phát hiện sự sụt giảm đột ngột từ giá trị trước đó

yt=ytyt1

nhưng nếu loạt phim có một thành phần định kỳ mạnh mẽ, bạn mong đợi rằng mức giảm đó là đáng kể một cách thường xuyên. Trong trường hợp này, tốt hơn là so sánh bất kỳ giá trị nào với đối tác của nó tại cùng một điểm trong chu kỳ trước đó, nghĩa là, một khoảng thời gian trước.

yt=ytytnwhere n=length of period

Trong trường hợp câu hỏi được đăng, sẽ rất tự nhiên khi mong đợi hai thành phần định kỳ quan trọng, một chiều dài của một ngày, chiều dài còn lại của một tuần. Nhưng điều này không có nhiều phức tạp, vì độ dài của khoảng thời gian dài hơn có thể được chia gọn gàng cho chiều dài ngắn hơn.

Nếu việc lấy mẫu được thực hiện mỗi giờ, trong phương trình trên phải được đặt thành24 * 7 = 168n247=168

Nếu các giọt có nhiều đặc tính tỷ lệ, một sự khác biệt đơn giản sẽ dễ dàng không phát hiện ra sự sụt giảm đột ngột khi hoạt động thấp. Trong trường hợp như vậy, thuật toán có thể được sửa đổi để tính tỷ lệ thay thế.

yt=ytytn

Tôi đã thực hiện một số thử nghiệm trong R bằng cách sử dụng bộ dữ liệu mô phỏng. Trong đó dữ liệu được lấy mẫu 6 lần một ngày và có những khoảng thời gian mạnh mẽ hàng ngày và hàng tuần, cùng với những tiếng ồn và biến động khác. Giọt được thêm vào tại các vị trí ngẫu nhiên và thời lượng trong khoảng từ 1 đến 3.
Để cô lập các giọt tỷ lệ đầu tiên được tính ở khoảng cách 42, sau đó ngưỡng được đặt ở mức 0,6, vì chỉ có sự thay đổi tiêu cực của một kích thước nhất định. Sau đó, sự khác biệt một bước đã được tính toán và ngưỡng được đặt là -0,5. Cuối cùng, một dương tính giả dường như đã trượt qua (một cái vào cuối tuần 16). Các biểu đồ ở bên trái và bên phải hiển thị cùng một dữ liệu, chỉ theo những cách khác nhau.

nhập mô tả hình ảnh ở đây


3

Sẽ hữu ích hơn khi nghĩ về những thay đổi trong chuỗi thời gian như là một khởi đầu của một xu hướng mới chứ không phải là sự bất thường? Lấy sự khác biệt giữa các điểm liền kề sẽ giúp biết khi nào độ dốc (đạo hàm) thay đổi và có thể báo hiệu sự bắt đầu của một xu hướng mới trong ngày. Cũng sử dụng sự khác biệt của các giá trị khác biệt (đạo hàm thứ hai) có thể được sử dụng. Thực hiện tìm kiếm Google trên "chuỗi thời gian bắt đầu xu hướng) có thể đưa ra gợi ý tốt cho các phương pháp. Trong dữ liệu tài chính, sự chú ý muộn được trả cho các xu hướng mới (bạn mua hoặc bán?) Vì vậy có giấy tờ về chủ đề này.

Một đoạn giới thiệu hay về wavelet là "Thế giới theo sóng con" của Hubbard tôi tin là tác giả.


2

Tôi đã có thể nhận được một số kết quả tốt đẹp cho chuỗi thời gian nhiều mùa (hàng ngày, hàng tuần) bằng hai thuật toán khác nhau:

  • Phân rã theo xu hướng theo mùa bằng cách sử dụng hoàng thổ (hoặc STL) để thiết lập chuỗi điểm giữa.
  • Hồi quy phi tuyến để thiết lập các ngưỡng xung quanh điểm giữa đó, dựa trên mối quan hệ giữa phương sai và mức.

STL thực hiện phân tách miền thời gian của chuỗi thời gian của bạn thành một thành phần xu hướng, một thành phần theo mùa duy nhất và phần còn lại. Thành phần theo mùa là tính thời vụ tần số cao của bạn (ví dụ: hàng ngày), trong khi xu hướng bao gồm cả tính thời vụ tần số thấp (ví dụ: hàng tuần) và xu hướng phù hợp. Bạn có thể tách hai người bằng cách chạy lại STL theo xu hướng. Dù sao, một khi bạn tách chuỗi phần còn lại khỏi các thành phần khác, bạn có thể thực hiện phát hiện bất thường đối với chuỗi đó.

Tôi đã viết chi tiết hơn ở đây:

https://techblog.expedia.com/2016/07/11/appending-data-science-to-monitoring/


1

Lấy cảm hứng từ David, bạn đã thử sử dụng FFT chưa? Nó có thể có thể phát hiện ra những giọt bất ngờ bởi vì những điều đó cho thấy sự bất thường của bạn. Sự bất thường có thể xuất hiện trong một phổ hẹp. Vì vậy, bạn có thể dễ dàng chụp chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.