你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用多变量异常检测器 API 的最佳做法

重要

从 2023 年 9 月 20 日开始,将无法创建新的异常检测器资源。 异常检测器服务将于 2026 年 10 月 1 日停用。

本文提供有关使用多变量异常检测器 (MVAD) API 时要遵循的建议做法的指导。 在本教程中,你将:

  • API 用法:了解如何使用 MVAD 而不出错。
  • 数据工程:了解如何最好地利用数据,从而提高 MVAD 的准确度。
  • 常见错误:了解如何避免客户遇到的常见错误。
  • 常见问题解答:了解常见问题的解答。

API 用法

请按照本部分中的说明进行操作,以避免在使用 MVAD 时出现错误。 如果仍然出现错误,请参阅错误代码的完整列表获取说明及解决方法。

输入参数

必需的参数

在训练和推理 API 请求中,需要以下三个参数:

  • source - zip 文件的链接,位于具有共享访问签名 (SAS) 的 Azure Blob 存储中。
  • startTime - 用于训练或推理的数据的开始时间。 如果它早于数据中的实际最早时间戳,那么实际最早时间戳将作为起点。
  • endTime - 用于训练或推理的数据的结束时间,必须晚于或等于 startTime。 如果 endTime 晚于数据中的实际最晚时间戳,那么实际最晚时间戳将作为终点。 如果 endTime 等于 startTime,则表示推断出一个单一的数据点,这在流式处理场景中经常使用。

训练 API 的可选参数

训练 API 的其他参数是可选的:

  • slidingWindow - 有多少个数据点用于确定异常情况。 这是一个介于 28 和 2880 之间的整数。 默认值为 300。 如果在模型训练过程中 slidingWindowk,那么在推理过程中至少可以从源文件访问 k 个点来获取有效结果。

    MVAD 采用一段数据点来决定下一个数据点是否异常。 段的长度是 slidingWindow。 在选择 slidingWindow 值时,有两点需要注意:

    1. 数据的属性:它是否是周期性的,以及它的采样率。 如果数据是周期性的,可以设置 1 - 3 个周期的长度作为 slidingWindow。 如果数据的频率较高(小粒度),如分钟级别或秒级别,可以设置一个相对较高的 slidingWindow 值。
    2. 训练/推理时间与潜在性能影响之间的权衡。 较大的 slidingWindow 可能会导致较长的训练/推断时间。 不能保证较大的 slidingWindow 会提升正确率。 较小的 slidingWindow 可能会导致模型难以收敛到最优解。 例如,如果 slidingWindow 只有两个点,则很难检测到异常。
  • alignMode - 如何在时间戳上对齐多个变量(时序)。 此参数有两个选项:InnerOuter,默认值是 Outer

    当变量的时间戳序列之间存在不一致时,这个参数至关重要。 在进一步处理之前,模型需要将变量调整到相同的时间戳序列上。

    Inner 表示模型将仅对每个变量都具有值(即所有变量的交集)的时间戳报告结果。 Outer 表示模型将对任何变量都具有值(即所有变量的并集)的时间戳报告结果。

    下面的示例可以解释不同的 alignModel 值。

    Variable-1

    timestamp
    2020-11-01 1
    2020-11-02 2
    2020-11-04 4
    2020-11-05 5

    Variable-2

    timestamp
    2020-11-01 1
    2020-11-02 2
    2020-11-03 3
    2020-11-04 4

    Inner 加入两个变量

    timestamp Variable-1 Variable-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-04 4 4

    Outer 加入两个变量

    timestamp Variable-1 Variable-2
    2020-11-01 1 1
    2020-11-02 2 2
    2020-11-03 nan 3
    2020-11-04 4 4
    2020-11-05 5 nan
  • fillNAMethod - 如何在合并的表中填充 nan。 合并的表中可能缺少一些值,应正确处理这些值。 我们提供了几种方法来填充这些值。 选项包括 LinearPreviousSubsequentZeroFixed,默认值是 Linear

    选项 方法
    Linear 通过线性内插填充 nan
    Previous 传播最后一个有效值以填充空白。 示例:[1, 2, nan, 3, nan, 4] ->[1, 2, 2, 3, 3, 4]
    Subsequent 使用下一个有效值填充空白。 示例:[1, 2, nan, 3, nan, 4] ->[1, 2, 3, 3, 4, 4]
    Zero 用 0 填充 nan 值。
    Fixed 使用应在 paddingValue 中提供的指定有效值填充 nan 值。
  • paddingValue - 当 fillNAMethodFixed 时,使用填充值来填充 nan,在这种情况下必须提供。 在其他情况下,它是可选的。

  • displayName - 这是一个可选参数,用于标识模型。 例如,可以使用它来标记参数、数据源以及有关模型及其输入数据的其他任何元数据。 默认值为空字符串。

输入数据架构

MVAD 会检测一组指标中的异常情况,我们将每个指标称作变量或时序。

  • 可以从 Microsoft 下载示例数据文件,以检查接受的架构:https://aka.ms/AnomalyDetector/MVADSampleData

  • 每个变量必须且只能具有 timestampvalue 这两个字段,并且应存储在逗号分隔值 (CSV) 文件中。

  • 该 CSV 文件的列名必须是 timestampvalue(区分大小写)。

  • timestamp 值应符合 ISO 8601 标准;value 可为整数,也可为带有任意小数位的小数。 CSV 文件内容的典型示例:

    timestamp
    2019-04-01T00:00:00Z 5
    2019-04-01T00:01:00Z 3.6
    2019-04-01T00:02:00Z 4
    ... ...

    注意

    如果时间戳包含小时、分钟和/或秒,请确保在调用 API 之前正确舍入这些时间数字。

    例如,如果数据频率预期是每隔 30 秒生成一个数据点,但你看到类似于“12:00:01”和“12:00:28”的时间戳,那么,这就相当肯定地表明,应将该时间戳预处理为类似于“12:00:00”和“12:00:30”的新值。

    有关详细信息,请参阅最佳做法文档中的“时间戳舍入”部分

  • CSV 文件名称将用作变量名称,应是唯一的。 例如,“temperature.csv”和“humidity.csv”。

  • 用于训练的变量和用于推理的变量应该一致。 例如,如果使用 series_1series_2series_3series_4series_5 进行训练,则应提供完全相同的变量进行推理。

  • CSV 文件应压缩成 zip 文件并上传到 Azure Blob 容器。 zip 文件可采用任何所需名称。

文件夹结构

数据准备过程中的一个常见错误是在 zip 文件包含多余的文件夹。 例如,假定 zip 文件的名称为 series.zip。 将文件解压缩到新文件夹 ./series 后,CSV 文件的正确路径是 ./series/series_1.csv,而错误的路径可能是 ./series/foo/bar/series_1.csv

在 Windows 中解压缩 zip 文件后正确的目录树示例

.
└── series
    ├── series_1.csv
    ├── series_2.csv
    ├── series_3.csv
    ├── series_4.csv
    └── series_5.csv

在 Windows 中解压缩 zip 文件后错误的目录树示例

.
└── series
    └── series
        ├── series_1.csv
        ├── series_2.csv
        ├── series_3.csv
        ├── series_4.csv
        └── series_5.csv

数据工程

现在,你可以通过 MVAD API 运行代码,而不会出现任何错误。 为了提高模型准确度,可以执行哪些操作?

数据质量

  • 当模型从历史数据中学习正常模式时,训练数据应表示系统的整体正常状态。 如果训练数据中的异常过多,模型会很难学习这些类型的模式。 异常比率的经验阈值为 1% 及以下,表示准确度高。
  • 一般而言,训练数据的缺失值比率应低于 20%。 缺少数据过多可能会导致自动填充值(通常是线性值或常量值)被视为正常模式并被模型学习。 这可能会导致将实际(未缺失)数据点检测为异常。

数据数量

  • MVAD 的基础模型包含数百万个参数。 它需要最少数量的数据点来学习一组最优参数。 经验法则是,需要为每个变量提供 5,000 个或更多数据点(时间戳)来训练模型,从而获得高准确度。 通常,训练数据越多,准确度越高。 但是,如果你还未积累那么多数据,我们仍鼓励你用较少的数据进行试验,然后确定受影响的准确度是否仍可接受。

  • 每次调用推理 API 时,都需要确保源数据文件包含刚刚足够的数据点。 通常是 slidingWindow + 真正需要用于推理结果的数据点数。 例如,在流式处理中,每次要对一个新的时间戳进行推理时,数据文件只能包含前导 slidingWindow 加一个数据点;然后,可以继续使用相同数量的数据点(slidingWindow + 1)但向“右”侧移动一步,来创建另一个 zip 文件并将其提交以进行另一个推理作业。

    位于前导滑动窗口之后或之前的所有数据不会对推理结果产生任何影响,只可能会导致性能降级。 位于前导滑动窗口下面的任何数据可能导致 NotEnoughInput 错误。

时间戳向上舍入

在一组变量(时序)中,每个变量都可能是从一个独立的源收集的。 不同变量的时间戳可能彼此不一致,并且各自具有已知的频率。 下面是一个简单示例。

Variable-1

timestamp
12:00:01 1.0
12:00:35 1.5
12:01:02 0.9
12:01:31 2.2
12:02:08 1.3

Variable-2

timestamp
12:00:03 2.2
12:00:37 2.6
12:01:09 1.4
12:01:34 1.7
12:02:04 2.0

这里是从两个传感器收集的两个变量,传感器每隔 30 秒发送一个数据点。 但是,传感器不会严格按均匀的频率发送数据点,而是有时提前,有时延后发送。 由于 MVAD 会考虑不同变量之间的关联,因此必须正确对齐时间戳,以便指标能够正确反映系统状况。 在以上示例中,变量 1 和变量 2 的时间戳必须按其频率正确“舍入”,然后才能对齐。

我们来看看未预先处理这些时间戳会发生什么情况。 如果将 alignMode 设置为 Outer(意味着联合两个集),则合并表为:

timestamp Variable-1 Variable-2
12:00:01 1.0 nan
12:00:03 nan 2.2
12:00:35 1.5 nan
12:00:37 nan 2.6
12:01:02 0.9 nan
12:01:09 nan 1.4
12:01:31 2.2 nan
12:01:34 nan 1.7
12:02:04 nan 2.0
12:02:08 1.3 nan

nan 指示缺失值。 显然,这不是你预期的合并表。 变量 1 和变量 2 交错,MVAD 模型无法提取有关变量之间的关联的信息。 如果将 alignMode 设置为 Inner,则合并表为空,因为变量 1 和变量 2 中没有共同的时间戳。

因此,变量 1 和变量 2 的时间戳应进行预先处理(舍入为最接近的 30 秒时间戳),那么新时序将为:

Variable-1

timestamp
12:00:00 1.0
12:00:30 1.5
12:01:00 0.9
12:01:30 2.2
12:02:00 1.3

Variable-2

timestamp
12:00:00 2.2
12:00:30 2.6
12:01:00 1.4
12:01:30 1.7
12:02:00 2.0

现在,合并表更为合理。

timestamp Variable-1 Variable-2
12:00:00 1.0 2.2
12:00:30 1.5 2.6
12:01:00 0.9 1.4
12:01:30 2.2 1.7
12:02:00 1.3 2.0

时间戳接近的不同变量的值已对齐良好,MVAD 模型现在可以提取关联信息。

限制

训练 API 和推理 API 都有一些限制,应注意这些限制以避免错误。

一般限制

  • 滑动窗口:28-2880 时间戳,默认值为 300。 对于定期数据,请将 2-4 个周期的长度设置为滑动窗口。
  • 变量数:对于训练和批量推理,最多 301 个变量。

训练限制

  • 时间戳:最多 1000000 个。 时间戳太少可能会降低模型质量。 建议时间戳多于 5,000 个。
  • 粒度:最小粒度为 per_second

批量推理限制

  • 时间戳:最多 20000 个,至少 1 个滑动窗口长度。

流式推理限制

  • 时间戳:最多 2880 个,至少 1 个滑动窗口长度。
  • 检测时间戳:介于 1 到 10 个之间。

模型质量

如何在实际方案中处理误报和漏报?

我们提供了严重性来指示异常的重要性。 可通过设置严重性阈值来筛选出误报。 有时,当推理数据存在模式变化时,可能会出现过多的误报。 在这种情况下,可能需要对新数据重新训练模型。 如果训练数据包含过多的异常,则检测结果中可能存在误报。 这是因为模型从训练数据和异常中学习模式可能会给模型带来偏见。 因此,适当的数据清理可能有助于减少误报。

如何根据训练损失和验证损失估算使用哪种模型最好?

一般来说,如果没有标记数据集,很难确定哪个模型最好。 但是,我们可以利用训练和验证损失来粗略估计并丢弃这些不良模型。 首先,我们需要观察训练损失是否收敛。 不同损失通常表示模型的质量差。 其次,损失值可能有助于确定是否出现拟合或过度拟合。 拟合或过度拟合的模型可能没有所需的性能。 第三,虽然损失函数的定义不直接反映检测性能,但损失值可能是估计模型质量的辅助工具。 损失值低是良好模型的必要条件,因此我们可能会丢弃损失值高的模型。

常见错误

除了错误代码表,我们还从跟你一样的客户那里了解到一些使用 MVAD API 时的常见错误。 此表将帮助你避免这些问题。

错误 结果 说明和解决方案
训练数据和/或推理数据中的时间戳未进行向上舍入,以与每个变量各自的数据频率保持一致。 推理结果的时间戳与预期不符:时间戳太少或太多。 请参阅时间戳向上舍入
训练数据中的异常数据点太多 由于模型在训练期间将异常数据点视为正常模式,因此模型准确度受到负面影响。 从经验上看,将异常比率保持在 1% 或以下将有所帮助。
训练数据太少 模型准确度受到影响。 从经验上看,在训练一个 MVAD 模型时,每个变量需要 15,000 个或更多数据点(时间戳),才能保持较高的准确度。
isAnomaly=true 的所有数据点视为异常 假正太多 应同时使用 isAnomalyseverity(或 score)筛选出不严重的异常情况,并(选择性地)使用分组来检查异常情况的持续时间,以消除随机干扰。 请参阅下面的常见问题解答部分,了解 severityscore 的差异。
将子文件夹压缩到数据文件中,用于训练或推理。 在训练和/或推理期间,忽略子文件夹中的 csv 数据文件。 zip 文件中不允许包含子文件夹。 有关详细信息,请参阅文件夹结构
推理数据文件中的数据太多:例如,将所有历史数据压缩在推理数据 zip 文件中 在尝试将 zip 文件上传到 Azure Blob 以及尝试运行推理时,你可能看不到任何错误,但性能会降级。 有关详细信息,请参阅数据数量
在尚不支持 MVAD 的 Azure 区域上创建异常检测器资源并调用 MVAD API 调用 MVAD API 时,会出现“找不到资源”错误。 在预览阶段,MVAD 仅在有限的几个区域中可用。 请将异常检测器的新增功能加入书签,以随时了解 MVAD 在各个区域的推出情况。 也可以提交 GitHub 问题或通过 AnomalyDetector@microsoft.com 联系我们,以请求提供该工具在特定区域中的推出情况。

常见问题解答

MVAD 滑动窗口的工作原理是什么?

我们使用两个示例来了解 MVAD 滑动窗口的工作原理。 假设已将 slidingWindow 设置为 = 1,440,并且输入数据的粒度为 1 分钟。

  • 流式处理方案:你希望预测在“2021-01-02T00:00:00Z”处的一个数据点是否异常。 startTimeendTime 值将相同(“2021-01-02T00:00:00Z”)。 但是,推理数据源必须至少包含 1,440 + 1 个时间戳。 因为 MVAD 将根据目标数据点(“2021-01-02T00:00:00Z”)之前的前导数据来确定目标是否异常。 在这种情况下,所需前导数据的长度为 slidingWindow 或 1,440。 1,440 = 60 * 24,因此输入数据必须从最近的“2021-01-01T00:00:00Z”开始。

  • 批处理方案:你需要预测多个目标数据点。 endTime 将晚于 startTime。 在这类方案中,推理以“移动窗口”方式执行。 例如,MVAD 将使用从 2021-01-01T00:00:00Z2021-01-01T23:59:00Z(包含开始和结束数据点)的数据来确定 2021-01-02T00:00:00Z 处的数据是否异常。 然后,它会往前移动并使用从 2021-01-01T00:01:00Z2021-01-02T00:00:00Z(包含开始和结束数据点)的数据来确定 2021-01-02T00:01:00Z 处的数据是否异常。 它会以相同方式继续(使用 1,440 个数据点进行比较)直到 endTime 指定的最后一个时间戳(或实际的最近时间戳)为止。 因此,推理数据源包含的数据必须从 startTime - slidingWindow 开始,且理想情况下,包含的总数据量为 slidingWindow + (endTime - startTime)。

severityscore 有何差异?

通常建议将 severity 用作筛选器来筛选出对业务不重要的“异常”。 那些不太重要的异常通常具有相对较低的 severity 值或独立的(不连续)高 severity 值(例如随机峰值),具体取决于你的方案和数据模式。

如果发现需要使用比 severity 阈值更复杂的规则,或发现持续存在的高 severity 值,则可能希望使用 score 来构建功能更强大的筛选器。 了解 MVAD 如何使用 score 来确定异常情况可能会有所帮助:

我们会同时从全局和局部角度来考虑一个数据点是否异常。 如果一个时间戳的 score 高于某个阈值,则会将该时间戳标记为异常。 如果 score 低于阈值但它在一个段中相对较高,则还是会将它标记为异常。

后续步骤