时序数据的异常检测技术(Anomaly Detection for Time Series Data)

2,344 阅读25分钟

本文翻译自 victoriametrics 异常检测技术文章

什么是异常检测?

通常来讲,异常检测是指识别不符合预期行为的异常模式的任务。您可能也注意到了,这个定义相当宽泛,实际上它很大程度上取决于:

  • 数据的性质。
  • 企业所处的行业。
  • 特定的业务环境。

然而,无论定义如何变化,异常事件都可能对您的业务产生重大影响,特别是在未被发现或被曲解的情况下。

异常检测建模的主要挑战在于将异常视为正常模式或正常模式视为异常。

如果模型将异常误分类为正常,且忽略了这个异常,那么根据业务场景的严重性,这可能会导致不可挽回的损失(如核电站、自动驾驶故障等)。

另一方面,一个产生太多误报的模型也不实用。因为它频繁干扰常规业务流程,会导致模型乃至整个产品的信誉受损,用户也不会再使用这个工具。

时序数据中的异常检测

检测异常本身就很难,而对于时序数据来说则更难,因为时序数据具有时间顺序,即时间轴,这为数据增加了一个额外的维度。这个时间维度通常具有趋势、季节性和其他使异常检测变得更加复杂的模式。

为什么异常检测还不够?

异常检测是任何可观测性系统中重要且关键的组成部分,但仅靠它是不够的。异常代表着偏离常态的情况,但要理解这些偏差的含义,我们需要一个强大的监控和警报系统来支持。

全面的监控系统可以让我们观察数据,为异常检测提供有价值的上下文,而告警系统可以确保我们在发生异常的时候及时收到通知,从而实现快速响应和解决问题。

因此,只有将异常检测与强大的监控和告警机制相结合,才能创建一个端到端的可观察系统。这个系统不仅可以识别异常,还可以为常见的异常提供可操作的解决方案,使其成为管理和理解数据的重要资产。

为什么基于阈值的告警还不够?

虽然在某些情况下,基于简单规则的告警系统(对原始或预聚合指标设置恒定阈值)是非常有效的,但是在处理复杂的时序数据时,它们往往是不够用的。这种基于规则的检测模式依赖于预定义的阈值或条件来触发告警。然而,时序数据通常表现出复杂的行为和模式,简单的规则无法有效捕获,因此需要基于机器学习 (ML) 的告警:

  • 例如,时序数据可能具有强烈的季节性,数据的行为可能因一年中的时间、一天中的一部分等而有所不同。一个简单的基于阈值的规则可能在旺季产生错误的告警,或在淡季未能检测到异常(考虑发布会和电商大促的场景)。
  • 此外,还存在不同类型的异常,其中一些很难追踪。
  • 输入数据可能引入多变量依赖性,因此需要适当的模型进行训练以考虑到这些模式。

因此,需要我们一种更复杂的方法,这就是异常检测发挥作用的地方。

时间序列介绍

时间序列是按时间顺序排列的数值数据点序列,通常在时间上(如每日、每小时)等间隔。在时间序列中,时间通常是自变量,目标通常是对未来进行预测。时间序列数据也可能包含[趋势]和[季节性]组成部分。例如,对于一个时间序列 Y:

  • Y 表示时间序列的名称。
  • Y_ 表示时间序列 Y 在特定时间点 t 的值。
  • t 通常表示时间轴。

时序数据的示例:

  • RAM 利用率
  • 天气数据
  • 每小时温度读数
  • 心率监测(EKG)
  • 脑部监测(EEG)
  • 季度销售额
  • 每日股票价格

趋势

时序数据中的趋势指的是数据随着时间的推移而呈现出的长期增加或减少的现象。趋势可以是线性的,也可以是非线性的。下面是一个线性增长趋势的例子:

季节性

季节性是指时间序列数据中在一天、一周、一个月、一个季度、一年等时间范围内周期性出现的可预测且重复的模式。时间序列分析的关键是了解季节性如何影响序列,从而能够对未来做出更好的预测。

季节性时间序列的示例:

  • 工厂机器(每小时)
  • 道路交通(每日)
  • 用电量(每月)
  • 零售额(年)

间歇性时序

间歇性时间序列是一种非零值以不规则间隔出现,且与一系列零交替出现的时间序列。此外,序列中还可能存在缺失数据(NoData)或不规则值。

异常介绍

异常(Anomaly)

异常是指数据点或模式与其他数据的预期行为存在显著偏差。在时间序列数据中,异常可能是流量突然激增、销售额下降或任何其他异常的重大变化。

从商业角度来看,异常一般有两种类型——[离群点]和[新奇点]。从本文角度来看,最常见的异常类型有三种:

  • 点异常:当数据样本与数据分布存在显著差异时,就会出现点异常,从而导致被标记为点或全局异常。
  • 集体异常:在这种情况下,单个数据点可能并不会出现异常,但一系列的数据点可能会被标记为异常。
  • 上下文异常:某些数据点在某个上下文中可能被认为是正常的,但在另一个上下文中则可能被视为异常。

异常分数(Anomaly Score

异常分数是一个量化指标,用来衡量数据点与基于历史数据和模式识别得出的预期值或模式之间的偏离程度。通常来说,分数越高表示数据点越可能是异常的。

在 VictoriaMetrics 异常检测中,分数通常分布在区间 [0, ∞),其中 [0, 1) 表示非异常,[1, ∞) 表示不同程度的异常。因此,可以设置简单规则(例如:如果异常分数大于 1,则触发告警)作为合理的默认设置。

异常阈值

这个数值定义了边界,左边的点将被视为“正常”,而右边的点将被视为“异常”。

注意:增加阈值将减少[误报(false positives)]的数量,但会增加[漏报(false negatives)]的数量(反之亦然)。

离群点(Outlier

离群点是一种异常,它的数据点明显偏离其他类似的观测值。离群点可能是由数据变化或测量误差引起的。

离群点检测

离群点检测通常是基于无监督学习算法的异常检测技术,其训练数据包含异常值。这些异常值在某种意义上被定义为“远离其他”的观测值。在这种情况下异常(anomaly)被称作离群点(outlier)。

因此,异常值检测算法通过识别数据点最密集的区域来建立对数据集的理解,同时在这个过程中忽略那些显著偏离常规模式的点。这样,算法就能够区分出哪些是数据集中的正常模式,哪些可能是由于错误、变化或其他原因产生的异常值。这种方法有助于在数据分析中识别和处理异常情况,从而提高数据质量和分析结果的准确性。

新奇点(Novelty

新奇点:指数据中首次出现的、未曾被观察到的模式。与离群点(outlier)不同,离群点远离其他观察结果,但并不一定意味着系统本身发生了变化,新奇点表示产生数据的底层系统发生了变化,意味着系统可能经历了某种转变或发展了新的行为模式。

新奇点检测

新奇点检测通常是基于半监督学习算法的异常检测技术。它通过使用未受异常值污染的训练数据,判断新的观测值是否为异常。在这种情况下,异常(anomaly)被称为新奇点(novelty)。

机器学习介绍

单变量数据

单变量数据由对单一属性或变量的观测结果组成。例如,天气预报模型使用过去记录的温度值来预测未来的气温。

进行单变量预测时,仅使用历史时序数据来预测未来数据。例如,如需预测纽约市明天的气温,单变量预测意味着仅使用历史气温这一个变量来预测未来气温。进行单变量预测时,您还可以发现季节性模式和趋势。

多变量数据

多变量数据由对多个变量或属性的观察结果组成。多变量时间序列包含多个单变量时间序列变量。每个变量不仅依赖于它自己的过去值,而且还依赖于其他变量。这种依赖性被用来预测未来的值。

进行多变量预测时,使用多个因素来预测未来的数据。例如,如需预测纽约市明天的气温,除了使用历史气温之外,您还可以使用气压、紫外线指数、附近地理区域的云量百分比、风速和其他变量。

有监督学习

有监督学习,也称为监督机器学习,是机器学习的一个子类别。它的定义是,通过使用带有标签或标记的数据集来进行算法的训练:

  • 数据分类:即分类任务(classification task)。这是一种监督学习任务,旨在使算法能够区分不同的类别。在异常检测的场景下,分类任务是将数据点分类为离群/非离群,取值范围为[0,1]。
  • 结果预测:即回归任务(regression task)。作为另一种监督学习任务,其目标是预测一个连续的数值。在异常检测场景中,回归任务的目的是预测异常分数,该分数表示数据点异常的可能性,取值范围为[0, Inf)。

因此,为了训练和使用此类算法,我们需要准备一个包含标记特征(X)和已知真实情况(目标,y,即 is_anomaly = {0, 1})的数据集。

Prometheus 的数据格式非常适合算法训练,因为它天然具有标签。

引导

  • 当拥有高质量的标记数据集并清楚了解业务环境中的异常构成时,可以采用这些技术和机器学习模型。
  • 虽然监督学习擅长处理已知类型的异常,但它可能无法有效识别偏离既定模式的全新行为。
  • 请注意,这些数据集通常在正常和异常实例的分布中表现出[明显的不平衡]。

模型

  • 逻辑回归(Logistic Regression):一个简单但有效的模型,用于二元分类任务(即结果只有两种可能类别的情况)。在 scikit-learn库中,可以使用LogisticRegression来实现逻辑回归。特别适合于数据集具有线性决策边界的情况,即可以通过一个或多个线性方程清晰分开的不同类别。
  • 随机森林(Random Forest):一个集成学习方法,可以处理复杂的数据集,并且对于具有非线性关系的分类问题特别有用,它通过组合多个决策树来提高模型处理具有非线性关系的复杂数据集的性能。在scikit-learn库中,可以使用RandomForestClassifier来实现随机森林。
  • SVM( Support Vector Machine ):在高维空间中有效,尤其适用于正常与异常之间有明显区别的情况。在scikit-learn库中可以使用SVC来实现 SVM。

无监督学习

无监督学习 也被称为无监督机器学习,是指使用机器学习算法分析和聚类(cluster analysis)未标记的数据集,执行降维(dimensionality reduce)并发现隐藏的模式或数据分组,所有这些过程都不需要人工干预:

它利用数据中的隐藏模式和基于邻近度的标准(proximity-based criterias)来发现数据集中的异常点(即寻找那些与中心群体“远离”的数据点)。因此,要训练和使用这类算法,只需要未标记的(无监督的)数据集,其中只包含特征(X),而不需要目标变量(如有监督学习中的 y)。

引导

在异常检测中使用无监督学习的核心假设是:

  1. 异常比正常数据少得多:这一假设支撑了各种算法的有效性,这些算法将异常识别为与大多数数据的显著偏差。示例算法包括:

    1. 孤立森林(Isolation Forest
    2. 椭圆模型拟合 Elliptic Envelope
    3. 局部异常因子(Local Outlier Factor):novelty=False 模式

这些方法在正常点周围构建了某种置信区间(或信任区域)。超过这个区间的异常点(黑点)可以被识别为异常,这是一种无监督的方法:

  1. 对底层过程进行建模并预测未来行为:通过分析过去,这些方法可以预测时间序列的未来值,并将与这些预测有显著偏差的点标记为异常。这种方法可以同时归类为:

    1. 无监督学习:没有已知的预定义异常
    2. 自监督学习:数据本身(y == X)用于学习和得出预测。
    3. 时序预测:根据过程的过去/现在值预测其未来值。

下图显示了预测的未来(预期行为)以及偏差(实际行为)。这些偏差的大小与异常分数的严重程度相关;偏差越大,异常分数越高。

所以

  • 当没有干净和/或标记的数据集时,请选择这些技术和模型。在无法对数据进行标记的情况下,这种方法表现良好。但是,该方法在处理与正常数据非常相似的细微异常时,可能会遇到困难

  • 根据数据复杂性,例如趋势或季节性的存在,可以下两种方法之间进行选择:

    • 基于分布的算法(distribution-based algorithms):如孤立森林(Isolation Forest)
    • 时序预测技术(time-series forecasting): 通过预测未来的时间点并将其与实际观测值进行比较,可以识别出偏离预期的异常点。

模型

  • Facebook 的 Prophet:适合处理具有强烈季节性影响、变化点和趋势的时间序列。
  • 诸如 LightGBM 这样的机器学习算法,特别是与时间序列特定特征一起使用时。
  • (S)ARIMA(X):适用于具有清晰、明确趋势的时间序列。
  • Holt-Winters 指数平滑法:可有效捕捉时间序列数据中更简单的季节性和趋势。
  • 诸如 Z 分数等简单技术在某些时间序列场景中可能非常有效

半监督学习

半监督学习,也称为弱监督学习,是机器学习的一个分支,它在训练时使用了少量的有标签数据(Labeled data)和大量的无标签数据(Unlabeled data)。半监督学习介于无监督学习(训练数据全部无标签)和有监督学习(训练数据全部有标签)之间。半监督学习旨在缓解训练数据中有标签数据有限的问题:

  • 使用没有异常的“正常”数据点组来训练模型,以将新数据点分类为“内联”(指新数据点与训练时所用的正常数据点相似,即它们是常规观察)或“外联”(新数据点与训练数据中的常规模式不同,可能表示新奇)。
  • 使用少量标记的异常的子集,在数据集中找到类似的异常以进行进一步的细化和专家评估。

半监督学习可以作为专家更深入分析的起点,通过机器学习模型初步筛选出可能的异常,然后由专家进行更细致的评估和决策。

半监督异常检测技术基于一个仅包含标记为“正常”( is_anomaly=0 )实例的训练数据集。在这种设置下,如果一个未见过的数据实例与训练数据学习到的特征非常吻合,则被分类为正常;如果偏离这些特征,则表明存在异常。

这种检测方法在新奇点检测时非常有效。

下图示突出显示了透明边界框内“正常”数据的区域,在这个区域时间序列表现出预期的行为。与我们之前讨论的无监督学习方法相比,标记这样扩展的、一致的区域通常更简单、更节省时间,而不是精确地确定许多个别的异常。

引导

当数据集质量很高,且几乎只包含非异常数据点时,可以选择这些方法和机器学习模型。这可能需要领域专家的参与,以准确识别和标记时序数据中的“正常”时期。

然而,半监督异常检测的有效性取决于“正常”数据标签的准确性,并且可能会错过那些与正常模式微妙融合的异常

对于提供离群点和新奇点检测模式的算法,建议在配置中切换到新奇点模式。一个例子是使用 scikit-learn 库中的中的局部异常因子(Local Outlier Factor)算法,将 novelty=True。

模型

自监督学习

自监督学习是一种机器学习过程,其中模型从输入数据的一部分学习到另一部分。它也被称为预测性学习或预训练学习。在这个过程中,无监督问题通过自动生成标签被转化为有监督问题。

时序预测介绍

时序预测:根据历史和当前数据,预测未来一段时间或某个特定点的值的技术。其方法包括[从单变量输入/单变量输出]到[多变量输入/多变量输出]等不同设置。

时间序列预测本身可以用于异常检测任务,当我们根据过去的时间序列数据训练模型时,预测未来并根据以下情况计算异常分数:

不平衡数据

不平衡数据是指目标类别在数据点分布上不均匀的数据集,即一个类别标签拥有大量观测值,而另一个类别则只有少量观测值。在异常检测场景中,一个例子是标记过的数据集中有数千个“正常”类型的数据点(is_anomaly=0),而只有少数几个点被标记为“异常”(is_anomaly=1)。

假阳性(False Positive

假阳性(也称为假阳性错误或第一类错误)是二元分类[监督问题]中的错误,指测试结果错误地指示了某种情况的存在,而实际上该情况并不存在。(例如,实际数据点正常却被预测为异常,也就是误报)。

假阴性(False Negative

假阴性(也称为假阴性错误或第二类错误 是二元分类[监督问题]中的错误,与[假阳性]相反测试结果错误地指示某种条件不存在,而实际上存在该条件(例如,将某个点归类为“正常”,而它在真实数据中却是异常的,也就是漏报)。

精度

精度(也称为阳性预测值)是检索到的实例中相关实例的比例,取值范围在 0 到 1 之间(完美的数据点分类)。在异常检测的场景下,精度可以被计算为预测为异常的点数与检索到的真实数据中真实异常点数的比例

举例:

  • 有 100 个数据点,其中 10 个是真正的异常。
  • 该模型预测有 10 个异常。
  • 这 10 个预测中有 7 个是正确的(与基本事实标签相交),3 个是错误的([误报])
  • 精度即为正确预测的异常数量除以预测的异常数量,即:7/10=0.7

召回率

召回率(也称为敏感度)是检索到的相关实例的比例,取值范围在 0 到 1 之间(完美的数据点分类)。在异常检测场景下,它可以被计算为预测为异常的点数与所有真实异常点数的比例

举例:

  • 有 100 个数据点,其中 10 个是真正的异常。
  • 该模型预测了 12 个异常。
  • 这 12 个预测中有 8 个是正确的(与基本事实标签相交)。
  • 召回率 =正确预测的异常数量/所有异常数量, 即: 8/10 = 0.8。

异常检测在可观测系统中的作用

[异常]不仅仅是数据集中不规则的数据点。特别是在时间序列数据中,它们对整个监控和可观测性机制有着重要的影响。虽然异常检测至关重要,但它只是更广泛可观测性策略的一个子集

了解由数据的时间序列特性引入的异常类型,有助于简化实时告警和建模。同时,每种异常类型可能需要不同的处理方法,包括简单的基于阈值的规则,以及考虑时间空间背景(如趋势或季节性)的复杂机器学习模型。此外,响应措施也会因异常类型而异,例如,财务中的点异常可能需要迅速的人工干预,而能源消耗中的上下文异常可能触发较慢的自动响应。

异常的类型和算法模型

[虽然下面的分类并不全面,但在异常检测]场景下,异常通常分为以下三个主要类别之一:

  • 点异常
  • 上下文异常
  • 集体异常(特别是包括新奇事物和转折点)

点异常(Point Anomalies

点异常是指数据点与其他数据相差太大的单个数据点。当特定数据样本与数据分布明显不同时,就会发生这种情况。例如,在信用卡欺诈检测中,购买高价值商品可视为点异常。

它不需要考虑时间序列的背景或序列性质。点异常与传统上称为“离群值”的现象最为相似。

检测点异常时,评估分布的基本统计属性(指的是数据分布的均值、中位数、标准差等关键特征)的模型通常非常有效。点异常本质上是那些显著偏离分布均值或中位数的单个数据点,因此它们相对容易识别。如果时间序列数据呈现出趋势,通常可以通过简单的差分技术来去趋势(de-trended)。在这种方法中,每个数据值被替换为其当前值与前一个值之间的差值,记为Y_t=Y_t-Y_{t-1,其中表示特定的时间点,表示特定的时间点,表示时间序列,Y_表示时间序列在特定时间点在特定时间点的值。

特性:模型的[单变量]或[多变量]性质,取决于您是一次分析单个时间序列还是多个时间序列。

模型Z 分数或类似的简单模型。

上下文异常(Contextual Anomalies)

上下文异常是指在特定上下文环境中出现明显偏差,但在该上下文环境之外却看似正常的数据点。例如,在正常工作时间内,由于员工访问云服务和在线协作,网络带宽使用率较高可能是正常现象。然而,在预计办公室关闭的深夜,同样的带宽使用率将被视为上下文异常。这种异常可能意味着未经授权的访问或设备故障。

总的来说,这种类型的异常只有在特定背景下(如一天中的时间、季节等)才被视为异常。在确定其异常性质和时间序列的时间性质时,会考虑周围的数据点。

特性:必须能够处理趋势季节性,有时需要超参数调整才能正确捕捉上下文。

模型Prophet,使用 LOESS (STL) 进行季节趋势分解

集体异常(Collective Anomalies)

集体异常是由一系列数据点的组合表现出的异常模式,而不是由单个数据点引起的。在集体异常中,单独观察每个数据点时,它们可能看起来是正常的,没有显著偏离预期。然而,当将多个数据点视为一个整体进行分析时,它们共同表现出异常行为。例如,有人为了逃避检测而重复进行多次小额交易,这些交易就会构成一个集体异常。

特性:能够分析序列并捕捉时间依赖性,通常需要对更长的序列进行训练才能正确理解集体行为。

模型

新奇

新奇是指在数据中首次出现的、从未被观察到的模式。与离群值不同,新奇代表着产生数据的底层系统发生了变化,这表明系统进入了一个全新的、之前从未被观察到的状态。

例如,当从一个状态明显切换到另一个状态时,即使两个状态单独考虑都被认为是正常的,它们之间的过渡点(变化点)在数据中引入了“新奇”或意外的行为。这种行为或结构的突然变化就是使其成为新奇的原因。

在时间序列分析中,变化点通常表示系列属性的结构性断裂、均值、方差或其他转变。在这种情况下,新奇的关键在于它代表了系统以前未观察到的状态或行为,即使该状态或行为本身在正常范围内。两个这样的状态之间突然和意外的转变使得变化点成为新奇。

从这个角度来看,新奇可以被视为集体异常的一个特例。

特性

  • 重点在于识别以前未观察到的新模式。
  • 通常需要不断地重新训练或调整模型,以解释数据中的新模式。
  • 我们需要一种机制来区分数据的暂时变化和持久变化。

模型:

  • 隔离森林(Isolation Forest):可以通过调整其算法来专注于新模式,从而适应新颖性检测。孤立森林通过“孤立”数据点来识别异常值,即那些与大多数数据点分离的点。
  • 单类 SVM(One-Class SVM):用于检测数据中的“新奇事件”。它通过学习未受污染的正常数据的边界,来识别那些远离正常模式的数据点。
  • 自编码器(Autoencoders):通过对正常数据进行训练,自动编码器学习了数据的一个压缩表示。如果新数据点与训练数据显著不同,网络将产生高重建误差,从而指示出新颖或异常的模式。
  • 变点检测模型:如累积和(CUSUM),这些模型专门开发用于时间序列中的变化点检测。CUSUM通过监控数据的累积和来快速识别过程均值的突然变化
  • 任何其他的新奇检测模型:任何其他基于“训练数据代表正常行为”这一假设的新奇检测模型,都有助于模型有效地区分正常观察结果与潜在的(以前未观察到的)异常。

总结

异常检测没有万能的解决方案,特别是在监控和可观测领域。时序数据的复杂性要求我们对所从事的特定领域有深入而细致的理解。最重要的是选择合适模型并对其不断的调优。

参考

异常检测---孤立森林 | one-class SVM