Python中的开源异常检测


61

问题背景: 我正在从事一个项目,该项目涉及类似于IT监视空间中的日志文件(以我对IT空间的最佳理解)。这些日志文件是时间序列数据,组织成成百上千的各种参数的行。每个参数都是数字(浮点),并且每个时间点都有一个非平凡/非错误的值。我的任务是监视所述日志文件以进行异常检测(峰值,跌落,某些参数不同步的异常模式,奇怪的1st / 2nd / etc。派生行为等)。

在类似的任务中,我曾在Prelert尝试过Splunk,但此刻我正在探索开源选项。

限制: 我限制自己使用Python,因为我很了解Python,并希望延迟切换到R和相关的学习过程。除非似乎对R(或其他语言/软件)提供了压倒性的支持,否则我将坚持使用Python来完成此任务。

另外,我目前正在Windows环境中工作。我想继续在Windows上的小型日志文件上进行沙箱测试,但是如果需要的话可以移至Linux环境。

资源: 我已经检查了以下带有死角的结果:

  1. 的Python或R用于实现机器学习算法用于欺诈检测。这里的一些信息是有帮助的,但是不幸的是,我正在努力寻找合适的包装,因为:

  2. Twitter的“ AnomalyDetection”在R中,我想坚持使用Python。此外,Python端口特性对我来说似乎在Windows环境中实现时会引起问题。

  3. 我下一次尝试的天际线似乎已经停产了(来自github issue)。鉴于似乎很少有在线支持,所以我没有深入研究这一点。

  4. scikit-learn我仍在探索中,但这似乎更加手动。杂草丛生的方法对我来说是可以的,但是我在学习工具方面的背景很薄弱,因此对于像Splunk + Prelert这样的技术方面来说,就像黑盒子一样。

问题定义和问题: 我正在寻找开源软件,该软件可以帮助我自动通过包或库从Python中的时间序列日志文件进行异常检测过程。

  1. 是否存在这样的事情来辅助我的紧迫任务,或者它们在我心中是虚构的?
  2. 任何人都可以协助具体步骤来帮助我实现我的目标,包括背景基础知识或概念吗?
  3. 这是最好的StackExchange社区,还是Stats,Math甚至Security或Stackoverflow是更好的选择?

编辑[2015-07-23] 请注意,对于pyculiarity的最新更新似乎已在Windows环境中修复!我尚未确认,但是应该成为社区的另一个有用工具。

编辑[2016-01-19] 较小更新。我没有时间进行此工作和研究,但是在继续进行具体细节研究之前,我已退后一步来了解此问题的基本原理。例如,我正在采取的两个具体步骤是:

  1. 从用于异常检测的Wikipedia文章开始[ https://en.wikipedia.org/wiki/Anomaly_detection ],全面理解,然后在其他链接的Wikipedia文章的概念层次结构中上移或下移,例如[ https:// en.wikipedia.org/wiki/K-nearest_neighbors_algorithm ],然后转到[ https://en.wikipedia.org/wiki/Machine_learning ]。

  2. 在Chandola等人2009年“异常检测:调查” [ http://www-users.cs.umn.edu/~banerjee/papers/09/anomaly.pdf ]和Hodge等人2004年所做的大型调查中探索技术。“异常值检测方法概述” [ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ]。

一旦更好地理解了这些概念(我希望在开发实际方面时也能玩一些玩具示例),我希望了解哪种开源Python工具更适合我的问题。


如果您刚刚开始使用Scikit,则我建议这些视频:github.com/justmarkham/scikit-learn-videos
Harvey

h2o库未导入此模块。

1
您的问题定义不正确。构成异常的原因可能有很多不同的含义。是均值的偏差吗?这是某些行为模式吗?在每种情况下都适用不同的方法。如果异常是偏离均值,则需要查看“异常检测”。如果您正在寻找特定的模式,最好使用诸如神经网络之类的监督学习算法。
威廉·范·杜斯堡

1
我知道您想要Python,但是对于异常检测,ELKI似乎是使用的工具。
Anony-Mousse's

Answers:


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中也具有类似的模块,并且由于h2o是开源的,因此可能很适合您。

您可以在这里看到一个有效的示例

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的异常检测模块(版本3之后)是否在Python或其他模块中可用?
ximiki 2015年

1
@ximik好吧,我重新审视了其最新版本3.0.0.26(h2o-release.s3.amazonaws.com/h2o/rel-shannon/26/docs-website/…)的python文档,似乎h2o.anomaly不是尚无不像它的R api.I've提出的问题,在他们的谷歌组(groups.google.com/forum/#!topic/h2ostream/uma3UdpanEI),你可以遵循。
2015年

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/...
安德烈Holzner的

11

我最近开发了一个工具箱:PY马拉松Ø 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 (机器学习开源软件专区)目前正在对其进行审查。请参阅预印本


快速介绍

PyOD工具包包含三大功能组:(i)离群值检测算法;(ii)离群集成框架和(iii)离群检测实用程序功能。

个体检测算法

  • PCA:主成分分析(到本征向量超平面的加权投影距离的总和)
  • MCD:最小协方差行列式(使用马哈拉诺比斯距离作为离群值)
  • OCSVM:一类支持向量机
  • LOF:局部离群因子
  • CBLOF:基于聚类的局部离群因子
  • LOCI:LOCI:使用局部相关积分快速检测异常值
  • HBOS:基于直方图的离群值
  • kNN:k最近邻居(将与第k个最近邻居的距离用作-**离群值
  • AvgKNN:平均kNN(使用与k个最近邻居的平均距离作为离群值)
  • MedKNN:中位数kNN(使用与k个最近邻居的中位距离作为离群值)
  • ABOD:基于角度的离群值检测
  • FastABOD:使用近似值进行基于角度的快速离群值检测
  • SOS:随机离群值选择
  • iForest:隔离森林
  • 功能袋
  • LSCP:LSCP:并行离群集成的局部选择组合
  • XGBOD:基于极端增强的离群值检测(监督)
  • 自动编码器:完全连接的自动编码器(使用重建误差作为离群值)
  • SO_GAAL:单目标生成对抗主动学习
  • MO_GAAL:多目标生成对抗主动学习

离群值检测器/得分组合框架

  • 功能袋
  • LSCP:LSCP:并行离群集成的局部选择组合
  • 平均:通过平均分数进行简单组合
  • 加权平均值:将得分与检测器权重求平均值的简单组合
  • 最大化:通过取得最高分数来简单组合
  • AOM:最大值的平均值
  • MOA:最大化平均值

异常值检测的实用程序功能

  1. score_to_lable():将原始离群值转换为二进制标签
  2. precision_n_scores():离群挖掘的流行评估指标之一(精度@等级n)
  3. generate_data():为异常值检测实验生成伪数据
  4. wpearsonr():加权的皮尔森在伪地面真相生成中很有用

下面提供了所有已实现模型的比较:(代码Jupyter Notebooks):在此处输入图片说明

如果您有兴趣,请检查Github(https://github.com/yzhao062/Pyod)了解更多信息。


8

我目前和您一样处于同一阶段。我正在寻找一些进行异常检测的最佳选择。

我发现的是,我认为最能满足您的需求,并且比您所看到的更好。即TwitterAnomalyDetection,SkyLine。

我发现更好的是Numenta的NAB(Numenta异常基准)。它也有很好的社区支持,对您来说,加点是它的开放源代码并使用python开发。您可以在其中添加算法。

对于算法,我发现LOF或CBLOF是不错的选择。

因此,请检查一次。它可以帮助您。 https://github.com/numenta/nab

如果您找到更好的选择。请告诉我。我也在同一条路上。

好运!!


感谢您提供宝贵的信息!我一定会检查出来的。
ximiki

3
我只想返回并评论NAB对我的问题的适用性。我能看到的唯一缺点是,这仅用于单变量(一列)时间序列异常检测,但是对于多变量(许多列)呢?感谢您的建议,我将其推入候选解决方案的候选名单。
ximiki '16

@ximiki您是否发现MultiVariate时间序列有任何问题。我也在寻找类似的问题。
shubham003

7

1
感谢您的宝贵时间,但请参阅我的第一篇“资源”。我已经审查了此选项,并在寻找符合我的“约束”的内容。
ximiki 2015年

1
要重申甚至更直截了当,在这里不可以使用Twitter的AnomalyDetection软件包:请更仔细地阅读“约束”部分。我并不是要谴责对此提供任何真诚的尝试,但是这个问题严格地针对基于Python的软件包。因此,未来的选民请不要赞成这个答案,因为它不是可用的选择。我建议通过投票减少目前的2票,但这可能在Stackexchange社区内是不道德的,并且不希望遇到任何麻烦。
ximiki

1
再次,我对此表示歉意,但我只是想让这个问题非常清楚,并且对遇到类似问题的其他人有用,并且不希望他们继续大肆追赶。
ximiki

6

我假设您用于检测异常的功能是日志文件中的一行数据。如果是这样,Sklearn是您的好朋友,您可以将其用作黑盒。查看一类SVM新颖性检测的教程。

但是,如果功能是一个完整的日志文件,则需要首先将其汇总为相同维的某个功能,然后再应用Novealty检测。



1

由于您具有多元时间序列,因此我将选择一种LSTM-RNN实现,该实现基于训练数据对系统动力学进行建模,训练数据通常是半监督的(仅包括普通类)。这意味着您要训练模型以了解什么是“正常”的。在测试期间,您可以同时测试正常条件和异常条件,以查看模型对它们的区分程度。

神经网络的一个优点是它们自己“学习”输入信号之间的互相关。您无需手动探索它们。LSTM-RNN特别是在时间序列建模方面的理想选择,这是因为LSTM-RNN能够保留先前输入的能力,类似于“控制理论”中的状态空间模型(如果您看到类似的话)。

在Python中,使用Keras API(在Tensorflow后端之上)实现LSTM-RNN几乎是微不足道的。该网络学习在给定任意数量输入的情况下估计感兴趣的信号,然后将其与实际测量值进行比较。如果存在“大”偏差,则说明存在异常(假设模型足够准确)!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.