Python中的开源异常检测

数据挖掘 机器学习 Python 数据挖掘 异常检测 图书馆
2021-10-04 19:52:22

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

在一项类似的任务中,我尝试了 Splunk 和 Prelert,但我目前正在探索开源选项。

约束: 我将自己限制在 Python 上,因为我很了解它,并且想延迟切换到 R 和相关的学习曲线。除非似乎对 R(或其他语言/软件)有压倒性的支持,否则我想坚持使用 Python 来完成这项任务。

另外,我目前正在Windows环境中工作。我想继续在 Windows 中对小型日志文件进行沙箱处理,但如果需要可以迁移到 Linux 环境。

资源: 我检查了以下内容,结果是死胡同:

  1. 这里的一些信息很有帮助,但不幸的是,我很难找到合适的包,因为:

  2. Twitter 的“AnomalyDetection”在 R 中,我想坚持使用 Python。此外,Python 端口pyculiarity似乎会导致我在 Windows 环境中实现的问题。

  3. Skyline,我的下一次尝试,似乎已经停止了(来自github 问题)。考虑到网上的支持似乎很少,我还没有深入研究。

  4. scikit-learn 我仍在探索,但这似乎更加手动。低调的方法对我来说是可以的,但是我在学习工具方面的背景很薄弱,所以想要像算法这样的技术方面的黑匣子,类似于 Splunk+Prelert。

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

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

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

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

  1. 用于异常检测的 Wikipedia 文章开始,充分理解,然后在其他链接的 Wikipedia 文章的概念层次结构中向上或向下移动,例如this,然后是this

  2. Chandola et al 2009 Anomaly Detection: A Survey和 Hodge et al 2004 A Survey of Outlier Detection Methodologies所做的大型调查中探索技术

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

编辑 [2020-02-04] 自从我研究这个问题以来已经有几年了,并且不再从事这个项目,所以在另行通知之前我不会关注或研究这个领域。非常感谢大家的意见。我希望这个讨论可以帮助其他需要异常检测工作指导的人。

FWIW,如果我现在必须用相同的资源(几千美元的费用)做同样的项目,我会追求深度学习/神经网络方法。该方法通过隐藏层自动学习结构和层次结构的能力非常有吸引力,因为我们有大量数据并且(现在)可以将钱花在云计算上。我仍然会使用 Python ;)。

干杯!

4个回答

异常检测或事件检测可以通过不同的方式完成:

基本方式

衍生物!如果您的信号与其过去和未来的偏差很大,那么您很可能发生了事件。这可以通过在信号的导数中找到大的零交叉来提取。

统计方式

任何事情的意义在于它通常的基本行为。如果某事偏离均值,则表示这是一个事件。请注意,时间序列中的平均值并不是那么微不足道,也不是常数,而是根据时间序列的变化而变化,因此您需要查看“移动平均线”而不是平均值。它看起来像这样:

事件是大于移动平均值 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])

概率方式

它们特别适合机器学习新手。卡尔曼滤波器是发现异常的好主意。使用“最大似然估计”的更简单的概率方法也很有效,但我的建议是坚持移动平均线的想法。它在实践中非常有效。

我希望我能帮助:) 祝你好运!

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)

我最近开发了一个工具箱:Py thon O utlier D etection toolbox ( 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:随机异常值选择
  • 森林:隔离森林
  • 特征套袋
  • LSCP:LSCP:并行异常值集合的局部选择性组合
  • XGBOD:Extreme Boosting Based Outlier Detection (Supervised)
  • AutoEncoder:全连接 AutoEncoder(使用重建误差作为异常值)
  • 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以获取更多信息。

我现在和你一样在同一个阶段。我正在寻找异常检测的最佳选择,并进行一些研究。

我发现我认为最符合您的需求,并且与您所看到的相比更好。即,TwitterAnomalyDetection,SkyLine。

我发现更好的是 Numenta 的 NAB(Numenta Anomaly Benchmark)。它也有一个很好的社区支持,对你来说,加分是它的开源和用 Python 开发的。您可以在其中添加您的算法。

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

所以,检查一次。它可能会帮助你。

如果您找到更好的选择,请分享。