Advertisement

《Practical Machine Learning A New Look at Anomaly Detection》摘抄+笔记

阅读量:

《Practical Machine Learning A New Look at Anomaly Detection 》——实用机器学习, 异常检测的新看法

本文照抄论文主要内容加上个人理解,很多地方是翻译是机翻,水平有限,应该有不少语句不通的地方。

《实用机器学习,异常检测的新看法》——泰德·邓宁和艾伦·弗里德曼

章节:

1. 展望未来

2.异常检测的形态

3.用“t-摘要”实现阈值自动化.

4. 更复杂的自适应模型

5.突发事件的异常

6.杜绝网络钓鱼许可!

7.异常检测的未来

1. 展望未来

In fact, one way to think about when to turn to anomaly detection is this: Anomaly detection is about finding what you don’t know to look for.

事实上,考虑何时转向使用异常检测的一种方法是:异常检测是查找您不知道要查找的是什么的内容。

异常检测程序必须发现数据本身中有趣的模式或连接,探测器首先识别异常检测的最重要方面:查找正常值。 模型完成此项后,机器学习程序就可以发现异常值,换句话说,这些数据不属于正常值。

当您不知道要查找什么时,请使用异常检测。有时,此发现过程为分类器定义感兴趣的类别提供了有用的初步阶段。

在本文中,我们将向您展示为什么异常检测有效,以及它的作用。我们探索寻找正常的东西的想法,决定如何测量异常的东西,以及如何成为异常值(第2 章和第3章)。我们提供了一种新的方法来做到这一点(t-摘要),并研究如何在非常简单的系统(第3章)和更复杂的系统中应用它(第4章和第5章)。在本文中,我们强烈建议使用自适应概率模型来预测什么是正常,以及如何将其与观察到的模型进行对比。第4 章中的一个主题与时间序列示例一起涉足深度学习,或者至少将其脚趾浸入池的浅端。尽管这是一个高级概念,但我们示例中的执行非常简单,无需高级数学运算。第 5 章提供了一些非常实用的方法,用于对包含偶发事件的系统进行建模,例如网站 traffic 或电子商务购买。在第6章中,我们以检测安全网站上的网络钓鱼攻击的形式,提供了许多基本概念的实用说明。让我们看看这一切是如何工作的。

2.异常检测的形态

异常检测的令人兴奋的事情是发现感。你需要一个程序来发现异常情况,所以异常检测模型正在寻找异常值。要了解其工作原理,请尝试一个简单的人尺度示例,如图

尽管所示的水平线数据存在明显的噪声,但当您看到这样的数据时,很容易看到大峰值似乎是一个异常值。是吗?

当您拥有较大的数据样本时,会发生什么情况?现在你的感知改变了。看似异常的,原来是常规甚至熟悉模式的一部分:在这种情况下,使用EKG记录的正常跳动的心脏的常规频率,如图

这里有一个重要的教训,即使在这个简单的小规模示例中也是如此:

在发现异常之前,首先必须找出什么是"normal"。

发现"正常"比听起来要复杂一些,尤其是在复杂的系统中。通常,要执行此操作,您需要一个机器学习模型。要准确做到这一点,您还需要足够大的数据采样来获得准确的表示。然后,您必须找到一种方法来分析数据,并在训练数据中以数学方式定义形成常规模式的方法。

查找"正常"

让我们思考一下作为异常检测基础的基本思想,包括发现 什么是正常的行为模式。一个基本但强大的方法是建立一个概率模型,我们在这里和第3章到第6章中逐步发展这个想法。

假设你正在研究特定位置的鸟类,你观察、识别和计算了在几天内有多少鸟类和哪些物种经过特定的鸟群点。下表显示了这些观测结果的一个完全构成的例子。

鸟的观测提供了一个简单的思维实验,以显示概率模型是如何工作的。一旦观察到一个新的物种,我们在随后的几天观察它。此简化示例的合成数据可帮助您思考如何根据所做的观察结果构建一个模型来预测有关您希望在第 x 天观测到的内容的几件事。

  • 你希望看到多少只鸟
  • 你希望看到多少物种
  • 每个物种有多少鸟飞过
  • 将看到多少新的,以前未被观察到的物种

此预测以概率模型的形式很好地实现。它假定所有事物(物种)至少有一定发生的可能性,有些比另一些更可能,有些是极其罕见的(或尚未观察到),因此,对他们的可能性估计将非常小。你甚至可以预测在某一天你期望有多少新物种,即使你无法预测它们将会是哪个物种。您可以为每个事件或事件类型分配概率,从而用概率学术语描述您估计的"正常"内容。

如果你喜欢数学,请阅读关于****概率模型中的"正常"的描述,否则可跳过

对于第i个事件而言,设 πi为预测概率,pi为实际概率。并对其大小作如下预设:

若要使πi趋近于真实pi, 最大化pi * log(πi)的总和即可,直观上比较好理解。

根据数据的详细信息及其表示的内容,有多种方法准备数据以用于此类模型以及各种适当的算法供您选择。我们将在后续章节中介绍几个选项。

人类洞察力的帮助

发现正常模式需要的不仅仅是一个好的机器学习模型。发现正常过程的一部分涉及人类的洞察力:您必须与建模过程交互,以决定什么在您自己的情况下有意义。前面图中所示的单个检测信号示例说明了这一点。从抽象意义上讲,与数据 相比,峰值是异常的。在我们的示例中,只需收集更多数据(如完整 EKG 中显示的数据)就足以识别尖峰是心脏功能的正常部分。但在查看更多数据之前,了解EKG 的专家也会告诉您峰值不是异常。

因此,异常检测的第一步——使用模型来发现什么是正常——还需要人类的洞察力来数学地构建模型,并解释模式的哪一个方面是值得关注的。在构建异常检测的机器学习模型时,您必须确定最佳数据选择,找出如何将其转换为算法可接受的形式,然后获取足够的数据来训练 模型。换句话说,您最初将使用数据让模型发现随后需要解释的模式,以便确定正常情况。这可能需要对您使用的算法进行多次调整,然后再使用有意义的内容。您对所调查情况了解得越多,通过查找正常情况,您就越容易、更准确地确定模型何时实现了异常检测的第一个目标。

查找异常

一旦你确定了正常的东西并开始寻找异常的东西,人类的洞察力就需要一个新水平。对于我们的EKG示例,异常行为不是有尖峰的事实,而是观察其频率在异常心脏行为的第n次期间波动,如图2-3所示的数据。

图 2-3。心跳频率的异常显示为间距不均匀的尖峰,例如此 EKG 中大约 1206 到 1210 秒之间的峰值。

图2-2和2-3正好说明了异常检测的基础是确定正常情况,然后将新事件与该模式或模型进行比较。此两步过程可以通过多种方式完成,从非常简单的相当直或向的系统模型,使用分配的阈值发送警报的潜在异常(如第 3 章)或更复杂的具有适应性的模型,可以处理复杂或不断变化的情况(如第4章到第 6章所述)。在所有 of 这些情况下,您都比较了观察到的行为与定义为正常的行为。

回到我们的鸟类观测的例子:当观测显示普通鸟类总数大幅增长或出现大量非常稀有的鸟类时,您的模型应将此变化标记为异常。

再次,如果你喜欢数学,这个对异常描述 是给你的

从概率模型的角度来思考,非常罕见的异常事件将被分配一个低得多的概率值。因此,当我们观察这些罕见事件时出现异常时,异常分数会很大,因为我们对它们概率的估计非常低。由于异常事件的概率值较低,因此通常观察到的异常值,即概率值-logπi将大于,可能比平常大得多。换句话说,异常分数将远离理想的最大值零。这种增加表明,我们模型对正常的估计与实际异常事件不太匹配,从而突出了异常值的发生。

带回家的课程:异常检测的关键步骤

此处的信息广泛适用于不同类型的异常检测,无论系统的复杂性和所使用的算法选择如何。当您尝试构建 自己的异常检测器时,这些步骤构成了目标的一般准则。问自己以下问题:

  • 什么是正常?
  • 您将衡量什么来识别"远离"正常的东西?
  • 如果某事被认为是反常的,它有多远?

简单方法:阈值模型

您必须进行试验以确定您希望模型将数据标记为异常的灵敏度。如果它设置过于敏感,随机噪声和大量的数据将被标记,这将是基本上不可能找到任何有用的数据。即使我已经调整了对更粗分辨率的灵敏度,以便您的模型自动标记实际异常值,您仍然可以选择对您有用的检测级别。在查找异常和以您可以处理做出响应的速度获取警报之间,总是有权衡的。这些注意事项,以及设置良好阈值的有用新方法,是第3 章的主题。

3.使用“ t- 摘要”(t-digest)实现阈值自动化

目前最常用的异常检测器形式是手动设置阈值报警,以发送可能的异常警报。这种报警的输入是某种数值测量。在这种情况下,基本的想法是,每当这个测量,你设置了一个阈值,可能在一定的时间内,警报响起。如果观测的系统具有易于理解的测量模式,并且不同类型测量的数量并不多,则这种简单的方法可以很好地工作。但是,如果您有大量您不太了解的行为,则此方法可能很难有效地执行。事实证明,这种情况——系统中大量不可预知的或没有很好地定义的度量值——在实际感兴趣的环境中很常见。这也是我们需要一些新方法来进行异常检测的原因之一。

改进这些系统的一个良好的第一步是改变设定阈值的方式。让我们考虑一下阈值的目标以及如何对其进行优化。阈值的任何特定值将检测您尝试查找的异常的一部分,如果您选择了阈值,则希望该异常的分数会很大。同时,在错误地检测到数据中的正常噪声是真正的异常的情况下,此阈值有时会触发误报。再次,如果系统构建良好,并且选择了适当的阈值,则误报的数量将很少。在捕获异常和尝试避免过多误报之间进行这种权衡是您在设置阈值时尝试优化的内容。

如果您正在尝试检测测量的异常正离差,则增加阈值将减少误报(误报率),但也会降低我们发现的异常(真正的正率)。相反,降低阈值会产生相反的效果,找到我们针对的更多异常,但以假阳性增加的代价。此决定是类型错误之间的权衡:误报和假阴性。这些权衡的想法如图3-1所示。

图 3-1。设置报警阈值时权衡的想法。灰色线是嘈杂的,但数据是非异常数据。黑色水平线显示数据的平均值 - 粗模型。这三个圆圈是真正的异常。您将在哪里设置一个阈值来检测异常,而不会出现过多的误报?

您可以设置一个阈值来获取捕获异常情况的完美记录,但随后您创造了一个巨大而不良的副作用,同时也得到了许多您不需要的内容(误报)。这是风险管理中的一个标准挑战,它不仅适用于监控系统,还适用于许多社会决策。

设定门槛背后的理念

你面临的问题是,"有多少误报被接受?可能遗漏一些实际异常的代价是什么?粗略地说,人们在优化阈值的目标中分为两大类。这些策略如图3-2所示。一边是那些主要对象是检测一个非常大的异常部分,因为错过其中任何一个的惩罚是巨大的。例如,医疗生命支持设备非常重要,对异常进行非常敏感的检测。

图 3-2。异常检测的目标各不相同,这反过来又会影响您选择阈值的方式。异常驱动 的情况是指您具有所需检测速率的情况,并且必须估计误报的数量,以便为此进行预算。预算驱动 的异常检测发生在响应预算有限时,并且必须确定该预算内可以处理的异常和误报数量,并设置要匹配的阈值。

您可以将异常检测阈值设置为非常低,以便捕获大多数异常,但这可能会导致高误报率。然而,处理误报也有代价。您必须有足够的资源来响应警报并确定它们是否为误报。太多的误报会分散注意力,浪费时间,并可能淹没需要响应的人。此人可能会习惯报警,从而带来危险,即他们无法对真实的异常情况做出适当反应。即便如此,对于错过的异常,在具有高惩罚的系统中,您仍必须选择阈值,将漏掉异常的发生率降至所需的水平。给定该阈值,然后计算处理异常和许多误报(误报)时必须按时间和费用预算。

相反,预算驱动的理念是,您必须使用固定预算来处理所有警报。在这种情况下,您的预算会驱动您选择阈值,即使这意味着缺少一些真正的异常。对于一个异想天开的例子,考虑在巧克力糖果工厂的测量。测量结果可能是巧克力的输入和输出量,或者每个袋子里掉落多少巧克力块,或者每块糖果的巧克力和花生的比例。您希望检测到的异常可能包括融化的巧克力的温度波动、粘度问题或伸出巧克力流的机械臂摆动错误。虽然当你的忠实顾客看来,因为有一天巧克力系统过热,结果尝到了烧焦的味道,这也许令人心碎,但它并没有危及生命。在这种情况下,您要权衡处理警报的成本,以提醒您注意波动,而不是生产一批会令客户失望的糖果的潜在威胁。

理想情况下,一般来说,您希望尽可能高地获得一个真实的正阳性,但您也有最多数量的误报,您可以承受。因此,您必须选择阈值来控制给定时间段内的总警报。从理论上讲,您应该能够设置此阈值,通过 exas 在正常条件下测量的分布并选取阈值以给出所需的警报速率。这一假设特别适合预算驱动的情况。

例如,假设我们有每秒一次的测量,并且我们愿意每月调查三个误报。 我们每月将有大约 300 万次测量,因此我们每百万次测量可以接受大约一个误报。在这种情况下,threshold 应设置为大约 99.9999 百分位数。该操作听起来可能很容易,但以有限的内存精确计算极端分位数可能很困难,尤其是在需要针对大量相关情况执行此操作时。在下一节中,我们将介绍如何使用新的算法 t- 摘要以在线方式估计大型数据集上的极端分位数。

另一个考虑因素是,在实践中,连续测量通常高度相关。(还记得我们在第二章的类比中提到过的"鹈鹕飞行队"吗?当测量激发这种相关性时,我们可能需要在设置阈值时考虑短批输入,而不是单个点。在上面的示例中,每秒一次测量,实际上我们可能只有相当于每 5 分钟一次独立测量,因此会考虑 5 分钟批次而不是单个点。在这种情况下,要每月获得所需的 3 个警报,我们希望允许一个 5 分钟批次或大约 300 个测量值高于每百万次测量的阈值,并且阈值应设置为 99.97 百分位。由于相关性,超过阈值的测量将成串发生,我们必须响应的警报总数将远低于阈值以上的测量值数。在这两种情况下,百分位数都是谈论阈值设置的非常自然的比例。但是,将百分位数转换为阈值可能比较棘手,因为内存和时间有限。这就是t-摘要可以提供帮助的地方。

使用 t -摘要进行精确计算极端分位数

t-digest数据结构由作者之一 Ted Dunning 开发,作为一种准确估计内存使用有限的超大型数据集的极端分位数的方法。此功能使 t- 摘要对于选择异常 检测好用的阈值特别有用。 t- 摘要算法在 Apache Mahout 中可用,作为 Mahout 数学库的一部分。它还可在https://github.com/tdunning/t-digest作为开源版本。

(github上的介绍:

一种新的数据结构,用于准确在线累积基于排名的统计数据,例如分位数和修剪均值。 t-digest算法对并行程序也非常友好,因此在使用Apache Spark实现的map-reduce和并行流应用程序中非常有用。

t-digest构造算法使用一维k均值聚类的变体来产生非常紧凑的数据结构,其允许准确地估计分位数。该t-摘要数据结构可用于估计分位数,计算其他秩统计量或甚至估计相关度量,如修剪均值。为此目的,t-digest优于先前摘要的优点是t-digest处理具有完全浮点分辨率的数据。通过较小的更改,t-digest可以处理来自任何有序集的值,我们可以计算类似于均值的值。尽管t-digest存储在磁盘上时t-digest更紧凑,但t-digest产生的分位数估计的准确度可以比先前的摘要算法产生的精度高几个数量级。

总之,t-digest特别有趣的特征就是它

  • 序列化时的摘要较小
  • 适用于双精度浮点和整数。
  • 为极端分位数提供百万分之一的精度,对于中等分位数,精度通常<1000 ppm
  • 速度非常快(每次添加约140 ns)
  • 非常简单(总共约5000行代码,单独最高级实现<1000行)
  • 有一个参考实现具有> 90%的测试覆盖率
  • 可以很容易地与map-reduce一起使用,因为可以合并摘要
  • 初始创建后不需要动态分配(仅限MergingDigest)
  • 没有运行时依赖项)

并已发布到 Maven Central。 t- 摘要算法已被其他几个项目使用,包括 Elasticsearch 和 stream-lib。t-digest的优点之一是准确性,尤其是对于极端分位数;另一个好处是,通过要求有限的内存来使问题不那么麻烦**。** 无需对大量样本进行排序以估计感兴趣的分位数,可以使用 t-digest 在线方式分析传入信号,以查找对应于任何分位数的阈值。这个过程如图3-3所示。选择阈值的,是需要传入信号分布的百分位数。在这种情况下,已选择 99.97% 的阈值。为了提醒我们负偏差,比较的符号将反转,并且将选择低百分位数而不是高百分位数。

图 3-3。使用 t 摘要设置阈值。传入signal (x) 传递到 t 摘要以threshold(h) 生成分位数。将新的传入数据与此阈值进行比较。

任何异常检测器背后的基本思想是,我们正在为探测器构建一个模型(基于我们对"正常"的估计)来寻找与该模型的偏差。基于阈值的异常检测器的模型基于一个假设,即传入信号具有几乎静止且简单的分布,因此特定的百分位数将始终位于特定点。如果这个假设不成立,而且通常不成立,那么 由t- 摘要计算的阈值将导致真阳性和假阳性率随着信号分布的变化而变化。图 3-4显示了显示此问题的信号示例。

使用任何类型的简单阈值检测器,图 3-4中的 A 处的异常将很容易检测到,但 B 处的异常不会,即使它们都远远大于噪声水平。

显然,我们需要一个更细致、适应性强的模型来处理这类问题。我们将在下一个章节中探讨如何做到这一点。

4.更复杂的自适应模型

正如我们在上一章中所看到的,构建最简单的异常检测器相对容易,该检测器查找与理想值的偏差。像 t- 摘要 这样的工具可以通过分析历史数据来准确达到一个良好的阈值。从统计上看,这样的系统正在构建一个输入数据的模型,该模型将数据描述为具有某些附加噪声的常量值。对于一个像我们迄今看到的大多数系统一样,这个模型几乎是微不足道的,但它仍然是一个模型。但是,更复杂的情况呢?例如图 3-3最后一章末尾所示的情况呢?非静止或具有复杂模式的系统,即使它们大致是周期性的,也需要比简单的阈值检测器的东西。当情况发生变化时会发生什么?

我们需要一个自适应的机器学习模型来进行异常检测。在第2 章中,我们讨论了概率模型的概念,该模型使用过去的历史来估计其发生的可能性,以此来描述什么是正常的。这种类型的模型是自适应的:由于大多数事件出现小波动,我们的模型可以相应地调整其"正常"视图。换句话说,它适应合理的变化。回到我们的观鸟类比,如果我们的鸟类探测器正在寻找不寻常的物种或重大和可能灾难性的变化,在正常物种的数量,我们可能希望我们的模型能够适应当地人口的微小变化,这些变化对天气条件、种子和水的可得性或邻居猫的过度活动有反应。我们希望我们的模型具有适应性。

从概念上讲,通过允许平均值变化,然后设置相对于该平均值的所有阈值,很容易想象扩展第 3 章的常量阈值模型。 从统计上讲,我们所做的是将输入描述为随时间变化的基础 值,结合具有恒定分布和零均值的累加噪声。通过构建一个模型,准确显示我们期望基值如何变化,我们可以构建一个异常检测器,只要输入的行为与预期完全不同,就会产生警报。

让我们来看看我们在本报告第 2 章中讨论的 EKG 信号。 记录被测患者心跳的 EKG 中的脉冲彼此高度相似。事实上,EKG中波形形状的实质性变化通常表明某种生理问题或设备故障。所以EKG 中的异常检测问题可视为如何构建检测信号的模型的问题

,然后如何比较观察到的检测信号到这个理想的模型。如果模型是一个很好的模型-换句话说,正常心脏行为的良好估计-那么,相对于这个理想模型观察的行为的误差的测量将突出显示异常行为。 如果误差幅度突出 ,它可能是突出显示不规则检测信号或监视器故障的标志。此方法可以查找各种情况下的异常,而不仅仅是 EKG。

为了从数学上理解这个,回想第2章,其中我们指出,异常检测涉及建模什么是正常的,寻找远离正常的事件,并不得不决定如何确定这一点。在本章中描述的示例类型中,我们有一个连续的测量,并且在任何时间点,我们都有一个值。在这种情况下,"正常"的概率模型涉及基值加随机噪声的总和。我们可以使用模型估计基础值,从观察输入数据中减去这个值,留下随机噪声,这是我们的重建误差。 根据我们的模型,误差噪声的平均值为零并且平稳地分布。当剩余的噪声很大时,我们发现一个异常,t-摘要可以决定我们应该考虑什么噪声的大值。

窗口和群集

我们仍然面临一个挑战,即找到一种易于理解的、实用的方法,为诸如EKG 等非常复杂的曲线建模正常。为此,我们将转向一种称为深度学习的机器学习,至少以介绍性的方式。以下是如何。

深度学习包括让系统分多个层次学习,以便以平易近人的步骤处理大型而复杂的问题。通过对这种方法的点头,我们找到了一种简单的方法,可以针对曲线(如EKG)执行此操作,这些曲线的 EKG 将分离的组件在时间上而不是叠加起来。我们利用 EKG 曲线的重复和分离特性,准确建模其复杂形状。

图 4-1显示了来自 EKG 信号的两个检测信号的扩展视图。每个心跳由几个与心脏中的电波活动相对应的相或脉冲组成。心跳的第一部分是P波,然后是QRS复合体,或脉冲组,然后是T波。此处显示的录音是使用便携式录音设备的,没有显示 QRS 复杂中的所有细节,U 波在 T 波之后也不可见。需要注意的是,从心跳到心跳,每个波都惊人地相似。那颗心脏在以n个或一个模式跳动。

为了构建一个使用这种相似性的模型,我们使用一种叫做 窗口的 数学技巧。当您需要构建能够准确预测这些模式的模型时,这是处理常规但复杂的模式的一种方式。此方法涉及对原始信号包含额外的短序列,这样可以将短序列重新添加在一起以重新创建原始信号。

图 4-1。EKG 信号由复杂但高度重复的组件组成。

我们分析的第一步是做窗口,将较大的模式分解成小组件。图 4-2显示了这两个检测信号的 EKG 如何分解为九个重叠的短信号序列。正如您所看到的,这些信号中有几个彼此相似。通过对齐和聚类在长记录中观察到的所有短信号,可以利用这种相似性来构建检测信号模型。在此示例中,聚类使用 Apache Mahout 库中的球 k-means 算法完成。我们选择他的算法是因为我们这里的示例数据并不大,所以我们可以作为内存操作来执行此操作。对于较大的数据集,我们可能也使用不同的算法(如从 Mahout 进行流 k-means)执行聚类。聚类操作实质上构建了这些形状的目录,以便只需记录每个时间窗口中目录中使用的形状以及每个形状的缩放因子,即可对原始信号进行编码。

图 4-2。窗口化将原始信号分解为短段,这些段可以加在一起以重建原始信号。

通过查看来自 EKG 的长时间数据系列,可以构造一个 组件形状的字典,这些元素形状 是典型的心脏行为。图 4-3显示从基于几个小时的真实 EKG 记录构建的字典中,从 400 个形状中选择 64 个。这些形状清楚地显示了 EKG 记录中的一些独特图案。

图 4-3。 组件 形状的字典。聚类查找用于重建正常检测信号表示的最常用信号形状。

**与窗口重建匹配:**正常函数

现在,让我们看看当此技术应用于新的 EKG 信号时会发生什么情况。请记住,这里的目标是构建一个观测信号的模型,将其与理想模型进行比较,并注意二者之间的错误级别。我们假设组件的形状(如图 4-3所示的形状字典)是正常信号的准确描述。鉴于此,重建信号与理想信号之间的比较误差较低,表明观测到的信号接近正常值。相反,较大的误差表明不匹配。 这不是对重建方法的测试,而是对观测到的信号的测试.不匹配表示异常信号,因此心脏功能异常。

图 4-4显示了EKG 信号的重建。顶部跟踪是原始信号,中间是重建信号,底部跟踪显示前两个信号之间的差异。最后一个信号显示重建对原始信号的编码程度,称为重建 误差。

图 4-4。使用窗口和聚类重新解释检测信号的正常模式。EKG 信号(顶部跟踪)的重构误差(底部跟踪)是通过从原始信号中减去重建信号(中间跟踪)来计算的。请注意,重建错误(底部跟踪)很小且相对均匀。

只要原始信号看起来非常类似于用于创建形状字典的信号,重建就会非常好,并且重建误差很小。因此,听写电位是 EKG 信号的模型,重建误差表示正在重建的信号看起来像心跳的程度。当输入看起来不太像心跳(换句话说,是异常的),就会发生较大的重建错误。

在图 4-4中请注意重建错误如何具有固定基准线。这一事实表明,我们可以在第三章中描述的阈值异常检测器上应用重建误差,以获得完整的异常检测器。图 4-5显示了异常的框图y 探测器基于这个想法而建。

图 4-5。自动编码器的信号重构误差可用于查找复杂信号中的异常。使用编码器对输入信号 x 进行分析, 使用形状字典形式的模型重建 x 以生成重建信号 x'。x-x'是重建误差δ。将δ与阈值h进行比较,在编码器无法重建x时,会发出报警信号,如大重建误差δ所示。

本质上,这里发生的情况是编码器只能重现非常特定的信号类型。编码器用于将复杂输入信号减少到重构误差,只要输入不是编码器可以处理的信号类型,则该误差很大。此重建误差只是适合在第 3 章中描述的方法中使用的那种固定信号,因此我们可以使用重建误差的 t- 摘要来查找异常。

窗口不匹配重建:异常功能

如图 4-6所示,这种方法可以发现有趣的异常,在 101 秒之后,您可以看到重建误差的峰值。很明显,输入信号(顶部跟踪)不是由重建忠实地呈现的,但在这个比例下,很难确切地理解为什么。

图 4-6。重建显示异常行为的心脏信号。顶部跟踪是原始 EKG 信号。底部跟踪显示通过从原始信号中减去重建信号(中间跟踪)计算的重建错误。请注意错误中刚刚超过 101 秒的峰值。该误差峰值表示中间面板中显示的重建无法重现顶部显示的原始信号的该部分。

但是,如果扩展时间范围,则很容易看到发生了什么。图 4-7显示在大约101.25秒,在心跳中的QRS复合体实际上是一个双脉冲。此双脉冲与正常心跳记录中显示的任何内容非常不同,这意味着字典中没有可用于重建此信号的形状。

图 4-7。异常心跳的扩展视图。通过发现异常较大的重建错误,检测到异常(由箭头指示)。

这种异常检测器不能说出异常是什么。它所能做的就是告诉我们,发生了一些不寻常的事情。解释这种异常的生理意义需要专家的人类判断,但是,如果仅仅通过避免疲劳,才能引起人们注意人类判断应该最好应用的地方。

其他系统可以利用这种基于模型的一般信号重建技术。信号不必是完美的周期性,它可以使用多维输入,而不仅仅是单个信号。关键是有一个模型可以非常简洁地对输入进行编码。您可以在 GitHub 上找到此示例中使用的代码和数据。

强大但简单的技术

请注意,此处用于编码 EKG 信号的模型相当简单。由于复杂性低,用于生成此模型的技术取得了惊人的良好结果。它可用于分析各种信号,包括声音、振动或流量,例如制造或其他工业环境中可能遇到的信号。并非所有信号都能像此处使用的模型一样简单,无法准确分析所有信号,尤其是在基本模式被叠加而不是分离时,例如与 EKG 一样。这种叠加信号可能要求更精细的模型。即使EKG信号需要一个复杂模型,如果我们想要不仅看到个别心跳的形状,但也看到不规则的心跳等特征。构建更精细模型的一种方法是利用深度学习构建一个在短时间尺度和长尺度上理解波形的重建模型。此处所示的模型可以通过递归聚类此处描述的模型派生的聚类权重组来扩展到深度学习。但是,无论模型本身的细节如何,此处所示的体系结构仍将适用于大致类似于此的输入,甚至包含许多相关度量的输入。我们讨论的 EKG 模型是一个系统的示例,其信的连续信号在任意时间点具有单个值。重建模型方法也可用于不同类型的系统,一个在单个时间点进行多次测量的系统。像这样的多维系统的一个例子是社区供水系统。随着传感器在报告许多不同的系统参数的系统中的使用越来越多,您可能会在单个时间点遇到数千次测量。这些测量可能包括系统中多个位置的流量或压榨,或储层深度测量。尽管这种类型的系统在任何时间戳上都有大量数据点,但它并不显示检测信号EKG 示例的复杂动态。要创建这种多维水系统的概率模型,可以使用相当复杂的方法,如神经网络或基于物理的模型,但对于异常检测,您仍可以使用基于重建误差的技术。

寻求建模更多有问题的输入

这种方法真正开始分解的地方是输入,这些输入不基于对电压、压力或流量等值的测量。在网站的日志文件中可以找到此类有问题的输入的一个很好的例子。在这种情况下,他输入的由具有发生时间和某种标签的事件组成。尽管本章描述的方法不能完全应用,但概率模型的基本思想仍然是进行良好异常检测的关键。对电子商务日志文件使用自适应概率模型是下一章的主题。

5.零星事件中的异常

前几章中讨论的示例中的输入信号都是以统一间隔采样的值。这种信号使得很容易谈论由模型计算的重建值以及该值与原始输入与重建误差之间的差异。然而,在实践中,有其他形式的数据对于处理异常处理非常重要。此类数据的一个重要类称为事件流,通常派生自某种或另一种日志文件。这些日志文件的一个关键特征是它们记录以不规则间隔发生的事件。

如果页面浏览量是感兴趣的输入,则这些事件与符号值(如您的 IP 地址和您访问的网页的 URL)相关联也是相当的。另一个输入可能是股票交易,其符号值可以包括股票符号,并与交易、价格和股票数量相结合。此类输入的其他示例包括电子商务购买或互联网数据包。在每种情况下,我们希望能够检测这些事件流中的异常活动,例如Web 流量的速率或地理位置的变化,或者股票市场特定时间段的股票交易数量。有时,感兴趣的异常是在特定时间间隔内没有活动,这对异常检测模型来说可能是一个挑战。

计数工作不良

您可能会认为,对事件流执行异常检测非常简单,只需计算在连续固定长度时间区间中发生的事件数,然后考虑该计数作为要用于方法的度量一样简单。但是,这种基于计数的方法存在一些问题。出现第一个问题是因为计数与统计波动有内在的变化。这种变化使得在没有较长的累积周期的情况下很难检测系统行为的任何小或中度变化。为了可靠地检测中断,我们需要每个期间的平均计数相当大。我们可以通过使计数间隔更长来在每个间隔中累积足够的计数来解决此问题。但是,纠正第一个问题会产生第二个问题。等待足够长的时间累积大量计数,因此除非事件速率确实很大,否则很难快速检测异常。这些想法如图5-1所示。查看图 5-1中的左侧面板,其中显示了时间间隔较短的频繁采样。尽管在200分钟的观测周期中,被计数的事件速率从大约一半增加到四分之三的间隔增加了20%,但这种波动很难在固有的大统计变化中被发现并计数。

图 5-1。对于速率相对较低且计数间隔较短的计数数据而言,速率的实质性变化并不明显。左右面板显示总共 200 分钟采样的相同数据。左侧面板中的每个数据点都显示该一分钟间隔的计数总和。在右边的面板中,采样间隔增加到 10 分钟,因此总间隔较少,并且每个间隔的计数都大 10 倍。请注意,在观察周期的大约一半到四分之三处出现的波动在右侧面板中较容易看到,其计数间隔较长。

相反,在右侧面板中,偏移明显可见,但代价是将收集周期增加 10 倍。虽然这使得更改可见,但它也增加了检测任何更改(甚至是灾难性更改)所需的时间,从而限制了您快速响应的能力。简而言之,这种总体情况带来了一个具有挑战性的信噪问题。这就是为什么在建模具有偶发事件的系统时,每个时间间隔的计数不是一个好的度量。

在某些系统中,事件达到的速率很高,因此您可以同时具有较大的计数和较短的间隔。在这些高速率系统中,使用计数作为建模的度量值是可以接受的,这便于使用前几章中描述的方法进行处理。但是,许多系统不是这样的,将事件到达数据汇总为计数会导致在检测小更改和快速响应大型更改之间做出不可接受的选择。

此问题的解决方案是查看事件流,因为它是具有到达时间的事件,而不是尝试将其转换为定期计数。

。。。。。。

附:一些相关网址

  1. http://www.10tiao.com/html/527/201706/2649967062/1.html
  2. https://blog.bcmeng.com/post/tdigest.html
  3. https://raw.githubusercontent.com/tdunning/t-digest/master/docs/t-digest-paper/histo.pdf

全部评论 (0)

还没有任何评论哟~