Phát hiện bất thường mã nguồn mở trong Python


61

Bối cảnh vấn đề: Tôi đang làm việc trên một dự án liên quan đến các tệp nhật ký tương tự như các tệp được tìm thấy trong không gian giám sát CNTT (theo hiểu biết tốt nhất của tôi về không gian CNTT). Các tệp nhật ký này là dữ liệu chuỗi thời gian, được tổ chức thành hàng trăm / nghìn hàng các tham số khác nhau. Mỗi tham số là số (float) và có một giá trị không tầm thường / không lỗi cho mỗi điểm thời gian. Nhiệm vụ của tôi là theo dõi các tệp nhật ký cho biết để phát hiện sự bất thường (gai, ngã, các mẫu bất thường với một số tham số không đồng bộ, hành vi phái sinh lạ 1/2 / v.v., v.v.).

Trong một nhiệm vụ tương tự, tôi đã thử Splunk với Prelert, nhưng hiện tại tôi đang khám phá các tùy chọn nguồn mở.

Các ràng buộc: Tôi tự giới hạn mình với Python vì tôi biết rõ về nó và muốn trì hoãn việc chuyển sang R và đường cong học tập liên quan. Trừ khi có sự hỗ trợ quá lớn cho R (hoặc các ngôn ngữ / phần mềm khác), tôi muốn bám sát Python cho nhiệm vụ này.

Ngoài ra, hiện tại tôi đang làm việc trong môi trường Windows. Tôi muốn tiếp tục hộp cát trong Windows trên các tệp nhật ký có kích thước nhỏ nhưng có thể chuyển sang môi trường Linux nếu cần.

Tài nguyên: Tôi đã kiểm tra các mục sau với kết quả cuối cùng:

  1. Python hoặc R để thực hiện các thuật toán học máy để phát hiện gian lận . Một số thông tin ở đây rất hữu ích, nhưng thật không may, tôi đang vật lộn để tìm gói phù hợp vì:

  2. "AnomalyDetection" của Twitter nằm trong R và tôi muốn bám lấy Python. Hơn nữa, tính đặc thù của cổng Python dường như gây ra sự cố khi triển khai trong môi trường Windows đối với tôi.

  3. Skyline, nỗ lực tiếp theo của tôi, dường như đã bị ngừng lại khá nhiều (từ các vấn đề về github ). Tôi đã không đi sâu vào vấn đề này, vì có rất ít sự hỗ trợ dường như trực tuyến.

  4. scikit-learn Tôi vẫn đang khám phá, nhưng điều này có vẻ thủ công hơn nhiều. Cách tiếp cận thực tế là ổn đối với tôi, nhưng nền tảng về công cụ học tập của tôi còn yếu, vì vậy tôi muốn một cái gì đó giống như hộp đen cho các khía cạnh kỹ thuật như thuật toán, tương tự như Splunk + Prelert.

Định nghĩa vấn đề và câu hỏi: Tôi đang tìm kiếm phần mềm nguồn mở có thể giúp tôi tự động hóa quá trình phát hiện bất thường từ các tệp nhật ký chuỗi thời gian trong Python thông qua các gói hoặc thư viện.

  1. Làm những điều như vậy tồn tại để hỗ trợ với nhiệm vụ trước mắt của tôi, hoặc chúng là tưởng tượng trong tâm trí của tôi?
  2. Bất cứ ai cũng có thể hỗ trợ các bước cụ thể để giúp tôi đạt được mục tiêu của mình, bao gồm các nguyên tắc cơ bản hoặc khái niệm cơ bản?
  3. Đây có phải là cộng đồng StackExchange tốt nhất để hỏi, hoặc là Thống kê, Toán học, hoặc thậm chí Bảo mật hoặc Stackoverflow là các tùy chọn tốt hơn?

EDIT [2015-07-23] Lưu ý rằng bản cập nhật mới nhất cho tính đa dạng dường như đã được sửa cho môi trường Windows! Tôi vẫn chưa xác nhận, nhưng sẽ là một công cụ hữu ích khác cho cộng đồng.

EDIT [2016-01-19] Một bản cập nhật nhỏ. Tôi không có thời gian để nghiên cứu về vấn đề này và nghiên cứu, nhưng tôi đang lùi một bước để hiểu các nguyên tắc cơ bản của vấn đề này trước khi tiếp tục nghiên cứu chi tiết cụ thể. Ví dụ: hai bước cụ thể mà tôi đang thực hiện là:

  1. Bắt đầu với các bài viết Wikipedia để phát hiện sự bất thường [ https://en.wikipedia.org/wiki/Anomaly_detection ], hiểu đầy đủ và sau đó di chuyển lên hoặc xuống trong hệ thống phân cấp khái niệm của các bài viết Wikipedia được liên kết khác, chẳng hạn như [ https: // vi.wikipedia.org/wiki/K-gầnest_neighbor_alacticm ], sau đó đến [ https://en.wikipedia.org/wiki/Machine_learning ].

  2. Khám phá các kỹ thuật trong các cuộc khảo sát tuyệt vời được thực hiện bởi Chandola et al 2009 "Phát hiện bất thường: Khảo sát" [ http://www-users.cs.umn.edu/~banerjee/ con / 09 / anomaly.pdf ] và Hodge et al 2004 "Khảo sát các phương pháp phát hiện ngoại lệ" [ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ].

Khi các khái niệm được hiểu rõ hơn (tôi hy vọng sẽ chơi xung quanh với các ví dụ về đồ chơi khi tôi phát triển khía cạnh thực tế), tôi hy vọng hiểu được công cụ Python nguồn mở nào phù hợp hơn cho các vấn đề của tôi.


Tôi khuyên bạn nên những video này nếu bạn mới bắt đầu Scikit: github.com/justmarkham/scikit-learn-ideo
Harvey

thư viện h2o không nhập trong mô-đun này.

1
Vấn đề của bạn là không xác định. Những gì tạo nên sự bất thường có thể có rất nhiều ý nghĩa khác nhau. Là nó sai lệch của trung bình? Đó có phải là mô hình nhất định của hành vi? Phương pháp khác nhau áp dụng trong từng trường hợp. Bạn sẽ cần xem xét "phát hiện ngoại lệ" nếu sự bất thường bị lệch so với giá trị trung bình. Nếu bạn đang tìm kiếm các mẫu cụ thể, bạn sẽ được phục vụ tốt hơn nhiều với thuật toán học có giám sát, chẳng hạn như mạng lưới thần kinh.
Willem van Doesburg

1
Tôi biết bạn muốn Python, nhưng để phát hiện bất thường ELKI dường như là công cụ để sử dụng.
Anony-Mousse

Câu trả lời:


35

Phát hiện bất thường hoặc Phát hiện sự kiện có thể được thực hiện theo những cách khác nhau:

Cách cơ bản

Đạo hàm! Nếu độ lệch của tín hiệu của bạn so với quá khứ và tương lai của nó cao thì rất có thể bạn có một sự kiện. Điều này có thể được trích xuất bằng cách tìm các giao điểm lớn bằng 0 trong đạo hàm của tín hiệu.

Cách thống kê

Ý nghĩa của bất cứ điều gì là thông thường, hành vi cơ bản của nó. nếu một cái gì đó lệch khỏi có nghĩa là nó là một sự kiện. Xin lưu ý rằng có nghĩa là trong chuỗi thời gian không phải là nhỏ và không phải là hằng số mà thay đổi theo các thay đổi trong chuỗi thời gian, do đó bạn cần xem "trung bình di động" thay vì trung bình. Nó trông như thế này:

Sự kiện là các đỉnh lớn hơn 1 độ lệch chuẩn so với trung bình di chuyển

Mã trung bình di chuyển có thể được tìm thấy ở đây . Trong thuật ngữ xử lý tín hiệu, bạn đang áp dụng bộ lọc "Low-Pass" bằng cách áp dụng đường trung bình.

Bạn có thể làm theo mã dưới đây:

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

Cách xác suất

Chúng tinh vi hơn đặc biệt dành cho những người mới sử dụng Machine Learning. Bộ lọc Kalman là một ý tưởng tuyệt vời để tìm ra sự bất thường . Các cách tiếp cận xác suất đơn giản hơn bằng cách sử dụng "Ước tính khả năng tối đa" cũng hoạt động tốt nhưng đề xuất của tôi là tiếp tục với ý tưởng trung bình. Nó hoạt động trong thực tế rất tốt.

Tôi hy vọng tôi có thể giúp :) Chúc may mắn!


Cảm ơn bạn đã nỗ lực vào cuộc thảo luận sâu sắc. Mặc dù lập trình này có vẻ không tệ lắm (khá thú vị, tôi có thể nói, để đi sâu vào các thuật toán), tôi tò mò về các gói đã có sẵn. Bạn có biết bất cứ thứ gì tồn tại đơn giản để cài đặt không? Lưu ý điều này không giống như đơn giản để thực hiện, mà tôi hiểu không thể được đảm bảo. Nếu tôi có thể làm cho môi trường của mình hoạt động, tôi tin rằng tôi có thể hoàn thiện nó dựa trên các ví dụ cho nhiệm vụ của mình.
ximiki

15

h2o có một mô-đun phát hiện bất thường và theo truyền thống, mã này có sẵn trong R. Tuy nhiên, ngoài phiên bản 3, nó cũng có mô-đun tương tự có sẵn trong python và vì h2o là nguồn mở nên nó có thể phù hợp với hóa đơn của bạn.

Bạn có thể thấy một ví dụ làm việc ở đây

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)

Cảm ơn! Tôi chưa xem xét gói này - tôi sẽ thêm nó vào danh sách các ứng cử viên. Để làm rõ, khi bạn nói "ngoài phiên bản 3, nó cũng có mô-đun tương tự có sẵn trong python", bạn có biết mô-đun phát hiện dị thường của h2o (ngoài ver 3) có sẵn trong Python hay một số mô-đun khác không?
ximiki

1
@imumik Vâng, tôi đã xem lại tài liệu python của phiên bản mới nhất 3.0.0.26 ( h2o-release.s3.amazonaws.com/h2o/rel-shannon/26/docs-website/ của ) và có vẻ như h2o.anomaly không chưa có sẵn không giống như R api của nó. Tôi đã đưa ra câu hỏi trong nhóm google của họ ( Groups.google.com/forum/#!topic/h2ostream/uma3UdpanEI ) và bạn có thể làm theo.
0xF

1
Vâng, nhóm hỗ trợ h2o đã trả lời câu hỏi và sự bất thường cũng có sẵn trong python. Một ví dụ có sẵn ở đây. github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/ trộm
0xF

Hoàn hảo! cảm ơn bạn đã điều tra Tôi sẽ cập nhật bài viết này với kết quả.
ximiki

1
liên kết đến bài kiểm tra h2o không còn hoạt động nữa, nhưng có một (có lẽ) tương đương: github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_asmos/ tựa (permalink cho phiên bản tại thời điểm viết bài là github.com/h2oai/h2o-3/blob/ Khăn )
Andre Holzner

11

Gần đây tôi đã phát triển một hộp công cụ: Py thon O ut trước D hộp công cụ etection ( PyOD ). Xem GitHub .

Nó được thiết kế để xác định các đối tượng xa xôi trong dữ liệu với cả hai cách tiếp cận không giám sát và giám sát. PyOD được đặc trưng cho:

  • API hợp nhất, tài liệu chi tiết và ví dụ tương tác trên các thuật toán khác nhau.
  • Các mô hình nâng cao, bao gồm Mạng nơ-ron / Học sâu và Tập hợp ngoại lệ.
  • Tối ưu hóa hiệu suất với JIT và song song hóa khi có thể, sử dụng numba và joblib. Tương thích với cả Python 2 & 3 (cũng tương thích với scikit-learn).

Dưới đây là một số liên kết quan trọng:

Nếu bạn sử dụng PyOD trong một ấn phẩm khoa học, chúng tôi sẽ đánh giá cao trích dẫn của bài báo sau

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

Nó hiện đang được xem xét tại JMLR (theo dõi phần mềm nguồn mở máy học). Xem bản in sẵn .


Giới thiệu nhanh

Bộ công cụ PyOD bao gồm ba nhóm chức năng chính: (i) các thuật toán phát hiện ngoại lệ; (ii) các khung đồng bộ ngoại lệ và (iii) các chức năng tiện ích phát hiện ngoại lệ.

Các thuật toán phát hiện riêng lẻ :

  • PCA : Phân tích thành phần chính (tổng khoảng cách dự kiến ​​có trọng số đối với siêu phẳng eigenvector)
  • MCD : Xác định hiệp phương sai tối thiểu (sử dụng khoảng cách mahalanobis làm điểm số ngoại lệ)
  • OCSVM : Máy vectơ hỗ trợ một lớp
  • LOF : Yếu tố ngoại lệ địa phương
  • CBLOF : Yếu tố ngoại lệ cục bộ dựa trên cụm
  • Loci : LOCI: Phát hiện ngoại lệ nhanh bằng cách sử dụng tích phân tương quan cục bộ
  • HBOS : Điểm ngoại lệ dựa trên biểu đồ
  • kNN : k Hàng xóm gần nhất (sử dụng khoảng cách đến hàng xóm gần nhất thứ k làm điểm số - ** ngoại lệ
  • AverageKNN : kNN trung bình (sử dụng khoảng cách trung bình để k hàng xóm gần nhất làm điểm số ngoại lệ)
  • MedKNN : Median kNN (sử dụng khoảng cách trung bình đến k hàng xóm gần nhất làm điểm số ngoại lệ)
  • ABOD : Phát hiện ngoại lệ dựa trên góc
  • FastABOD : Phát hiện ngoại lệ dựa trên góc nhanh bằng cách sử dụng xấp xỉ
  • SOS : Lựa chọn ngoại lệ ngẫu nhiên
  • IForest : Rừng cô lập
  • Tính năng đóng bao
  • LSCP : LSCP: Sự kết hợp có chọn lọc cục bộ của các sự kiện song song
  • XGBOD : Phát hiện ngoại lệ dựa trên tăng cường cực độ (được giám sát)
  • AutoEncoder : AutoEncoder được kết nối đầy đủ (sử dụng lỗi tái cấu trúc làm điểm số ngoại lệ)
  • SO_GAAL : Học tập tích cực đối thủ tạo mục tiêu
  • MO_GAAL : Học tập tích cực đối thủ tạo ra nhiều mục tiêu

Khung kết hợp máy dò / điểm ngoại lệ :

  • Tính năng đóng bao
  • LSCP : LSCP: Sự kết hợp có chọn lọc cục bộ của các sự kiện song song
  • Trung bình : Kết hợp đơn giản bằng cách lấy trung bình điểm
  • Trung bình có trọng số : Kết hợp đơn giản bằng cách lấy trung bình điểm số với trọng số máy dò
  • Tối đa hóa : Kết hợp đơn giản bằng cách lấy điểm tối đa
  • AOM : Trung bình tối đa
  • MOA : Tối đa hóa trung bình

Các chức năng tiện ích để phát hiện ngoại lệ :

  1. points_to_lable (): chuyển đổi điểm số ngoại lệ thô thành nhãn nhị phân
  2. độ chính xác (): một trong những số liệu đánh giá phổ biến cho khai thác ngoại lệ (precision @ rank n)
  3. Gener_data (): tạo dữ liệu giả cho thử nghiệm phát hiện ngoại lệ
  4. wpearsonr (): pearson có trọng số rất hữu ích trong việc tạo ra sự thật giả

So sánh tất cả các mô hình đã triển khai được cung cấp dưới đây: ( Hình , , Sổ tay Jupyter ):nhập mô tả hình ảnh ở đây

Nếu bạn quan tâm, vui lòng kiểm tra Github ( https://github.com/yzhao062/Pyod ) để biết thêm thông tin.


8

Tôi hiện đang ở trên cùng một sân khấu như bạn. Tôi đang tìm lựa chọn tốt nhất để phát hiện sự bất thường, thực hiện một số nghiên cứu.

Những gì tôi đã tìm thấy là tôi nghĩ phù hợp nhất với nhu cầu của bạn và tốt hơn so với những gì bạn đã thấy. tức là TwitterAnomalyDetection, SkyLine.

Tôi đã tìm thấy tốt hơn là Numenta's NAB (Numenta Anomaly Benchmark). Nó cũng có một hỗ trợ cộng đồng rất tốt và điểm cộng cho bạn là nguồn mở & được phát triển bằng python. Bạn có thể thêm thuật toán của bạn trong đó.

Trong trường hợp thuật toán, tôi thấy LOF hoặc CBLOF là lựa chọn tốt.

Vì vậy, hãy kiểm tra nó một lần. Nó có thể giúp bạn ra ngoài. https://github.com/numenta/nab

Nếu bạn tìm thấy lựa chọn tốt hơn. xin vui lòng cho tôi biết. Tôi cũng đang trên con đường tương tự.

May mắn nhất!!


Cảm ơn thông tin có giá trị! Tôi chắc chắn sẽ kiểm tra này.
ximiki

3
Tôi chỉ muốn quay lại và nhận xét về cách áp dụng NAB đối với vấn đề của tôi. Hạn chế duy nhất tôi có thể thấy là điều này chỉ dành cho phát hiện dị thường chuỗi thời gian đơn (một cột), nhưng còn đa biến (nhiều cột) thì sao? Cảm ơn bạn đã gợi ý này, tôi sẽ đẩy nó vào danh sách rút gọn cho các ứng cử viên giải pháp.
ximiki

@Senseiki bạn đã tìm thấy bất cứ điều gì cho Dòng thời gian MultiVariate. Tôi cũng đang xem xét vấn đề tương tự.
shubham003

7

1
Cảm ơn thời gian của bạn, nhưng xin vui lòng xem viên đạn "Tài nguyên" đầu tiên của tôi; Tôi đã xem xét tùy chọn này và tìm kiếm một cái gì đó đáp ứng "Ràng buộc" của tôi.
ximiki

1
Để nhắc lại, và có lẽ thẳng thắn hơn, sử dụng gói AnomalyDetection của Twitter KHÔNG phải là một lựa chọn ở đây: Vui lòng đọc kỹ phần "Ràng buộc" hơn. Tôi không có ý phủ nhận bất kỳ nỗ lực chân thành nào để giúp đỡ về vấn đề này, nhưng câu hỏi hoàn toàn dành cho các gói dựa trên Python. Do đó, các cử tri trong tương lai, xin vui lòng không nêu lên câu trả lời này vì đó không phải là lựa chọn có thể sử dụng được. Tôi sẽ khuyên bạn nên xóa 2 phiếu hiện tại cho việc này thông qua việc bỏ phiếu nhưng có lẽ điều này là phi đạo đức trong cộng đồng Stackexchange và không muốn bắt gặp bất kỳ thông điệp nào.
ximiki 29/07/2015

1
Một lần nữa, tôi xin lỗi vì đã làm phiền về vấn đề này, nhưng tôi chỉ đơn giản là cố gắng làm cho câu hỏi này trở nên rất rõ ràng và có thể sử dụng được cho những người khác gặp phải một vấn đề tương tự, và không muốn họ tiếp tục đuổi theo một con ngỗng hoang dã.
ximiki

6

Tôi giả sử tính năng bạn sử dụng để phát hiện sự bất thường là một hàng dữ liệu trong tệp logfile. Nếu vậy, Sklearn là người bạn tốt của bạn và bạn có thể sử dụng nó như một hộp đen. Kiểm tra hướng dẫn phát hiện SVM một lớp và Mới lạ .

Tuy nhiên, trong trường hợp tính năng của bạn là toàn bộ logfile, trước tiên bạn cần tóm tắt nó với một số tính năng có cùng kích thước, sau đó áp dụng phát hiện Novealty.


3

Vẫn còn một phiên bản hoạt động và phát triển của Skyline, chỉ trong trường hợp ai đó hạ cánh ở đây và quan tâm.

https://github.com/earthgecko/skyline

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

Tôi là người duy trì hiện tại của dự án và hiện tại nó tiến bộ hơn nhiều so với phiên bản Etsy ban đầu, về hiệu suất, giao diện người dùng, xử lý tốt hơn tính thời vụ và có thêm các chức năng của cơ sở dữ liệu dị thường, tính toán tương quan và khả năng lấy dấu vân tay và tìm hiểu các mẫu không dị thường.


1

Vì bạn có chuỗi thời gian đa biến, tôi sẽ triển khai LSTM-RNN, mô hình hóa động lực học của hệ thống của bạn dựa trên dữ liệu đào tạo, thường được giám sát bán (chỉ bao gồm lớp bình thường). Điều này có nghĩa là bạn huấn luyện mô hình của mình để học những gì là "bình thường". Trong quá trình thử nghiệm, bạn kiểm tra cả hai điều kiện bình thường và bất thường để xem mô hình phân biệt chúng tốt như thế nào.

Một lợi thế của mạng lưới thần kinh là chúng "học" mối tương quan chéo giữa các tín hiệu đầu vào; bạn không cần phải khám phá chúng bằng tay. Cụ thể, các LSTM-RNN là một lựa chọn lý tưởng khi mô hình hóa chuỗi thời gian đơn giản chỉ vì khả năng giữ bộ nhớ của các đầu vào trước đó, tương tự như mô hình không gian trạng thái trong Lý thuyết điều khiển (nếu bạn thấy sự tương tự).

Trong Python, việc triển khai LSTM-RNN gần như không đáng kể bằng cách sử dụng API Keras (trên đầu trang của chương trình phụ trợ hàng chục). Mạng này học cách ước tính (các) tín hiệu quan tâm với số lượng đầu vào tùy ý, sau đó bạn so sánh với giá trị đo thực tế. Nếu có độ lệch "lớn", bạn có sự bất thường (cho rằng mô hình đủ chính xác)!

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.