正在加载

查找异常值

Elastic Stack 无服务器

异常值检测是指识别与数据集中的其他值显着不同的数据点。 例如,异常值可能是数据集中的错误或异常实体。 异常值检测是一种无监督机器学习技术,无需提供训练数据。

重要提示

异常值检测是一种批处理分析,它对您的数据执行一次。 如果有新数据进入索引,您需要对更改后的数据再次进行分析。

在 Elastic Stack 中,我们使用四种不同的基于距离和密度的异常值检测方法的集合

  • K 个最近邻的距离:计算数据点与其 K 个最近邻的距离,其中 K 是一个较小的数字,通常与数据点的总数无关。
  • K 个最近邻的距离:计算数据点与其最近邻的平均距离。 具有最大平均距离的点将是最异常的。
  • 局部异常因子 (lof):考虑了点到其 K 个最近邻的距离,以及这些邻居到其邻居的距离。
  • 基于局部距离的异常因子 (ldof):是两个度量的比率:第一个计算数据点与其 K 个最近邻的平均距离;第二个计算邻居本身成对距离的平均值。

您不需要选择方法或提供任何参数,但如果您愿意,可以覆盖默认行为。 基于距离的方法 假设正常数据点保持更接近或值相似,而异常值位于远处或值显着不同。 这些方法的缺点是它们没有考虑数据集的密度变化。 基于密度的方法 用于缓解这个问题。

这四种算法并不总是在哪些点是异常值上达成一致。 默认情况下,异常值检测任务使用所有这些方法,然后对结果进行标准化和组合,并为索引中的每个数据点提供一个异常值评分。 异常值评分范围从 0 到 1,其中较高的数字表示数据点与索引中的其他数据点相比是异常值的可能性。

特征影响 - 在检测异常值时计算的另一个评分 - 提供了不同特征及其对点成为异常值的贡献的相对排名。 此评分允许您了解某个数据点成为异常值的上下文或原因。

Elastic Stack 中的异常值检测可用于检测给定群体中的任何异常实体。 例如,检测机器上的恶意软件或网络上异常的用户行为。 由于异常值检测假设异常值仅占整体数据群体的一小部分,因此您可以在这种情况下使用此功能。 异常值检测是一种批处理分析,最适合以实体为中心的索引。 如果您的用例基于时间序列数据,您可能需要使用 异常检测 代替。

机器学习功能提供无监督的异常值检测,这意味着无需提供训练数据集。

在使用 Elastic Stack 机器学习功能之前,需要解决一些配置要求(例如安全权限)。 请参阅 设置和安全性

异常值检测需要专门结构的源数据:二维表格数据结构。 因此,您可能需要 转换 您的数据以创建可用作异常值检测源的数据框。

您可以在 本节 中找到如何将数据转换为以实体为中心的索引的示例。

数据框分析任务包含执行分析任务所需的配置信息和元数据。 您可以通过 Kibana 或使用 创建数据框分析任务 API 来创建数据框分析任务。 选择异常值检测作为数据框分析任务执行的分析类型。 您还可以决定在创建任务时包括和排除分析的字段。

提示

您可以在数据框分析向导中查看可选字段的统计信息。 在弹出窗口中显示的字段统计信息提供了更有意义的上下文,以帮助您选择相关字段。

您可以通过 Kibana 或使用 启动数据框分析任务 API 来启动任务。 异常值检测任务有四个阶段

  • reindexing:文档从源索引复制到目标索引。
  • loading_data:任务从目标索引中获取必要的数据。
  • computing_outliers:任务识别数据中的异常值。
  • writing_results:任务将结果与目标索引中的数据行匹配,合并它们,然后将它们索引回目标索引。

在完成最后一个阶段后,任务停止,结果即可用于评估。

异常值检测任务 - 与其他数据框分析任务不同 - 在其生命周期中运行一次。 如果您想再次运行分析,则需要创建一个新任务。

使用数据框分析功能从数据集中获得见解是一个迭代过程。 在您定义了要解决的问题,并选择了可以帮助您解决问题的分析类型后,您需要生成高质量的数据集并创建适当的数据框分析任务。 在获得满足您用例的结果之前,您可能需要尝试不同的配置、参数和转换数据的方法。 评估数据框分析 API 是此过程的一个有价值的补充,它使您可以评估数据框分析性能。 它可以帮助您了解错误分布并识别数据框分析模型表现良好或不太可靠的点。

要使用此 API 评估分析,您需要使用一个字段来注释包含分析结果的索引,该字段标记每个文档的真实值。 评估数据框分析 API 根据此手动提供的真实值评估数据框分析的性能。

异常值检测评估类型提供以下指标来评估模型性能

  • 混淆矩阵
  • 精确率
  • 召回率
  • 接收者操作特征 (ROC) 曲线。

混淆矩阵提供了四个衡量数据框分析在您的数据集上的工作情况的指标

  • 真阳性 (TP):分析识别为类成员的类成员。
  • 真阴性 (TN):分析识别为非类成员的非类成员。
  • 假阳性 (FP):分析错误地识别为类成员的非类成员。
  • 假阴性 (FN):分析错误地识别为非类成员的类成员。

虽然评估数据框分析 API 可以根据分析结果计算混淆矩阵,但这些结果不是二元值(类成员/非类成员),而是一个介于 0 和 1 之间的数字(在异常值检测的情况下称为异常值评分)。 此值捕获数据点成为某个类成员的可能性。 这意味着由用户决定将数据点视为给定类成员的阈值或截止点。 例如,用户可以说所有异常值评分高于 0.5 的数据点将被视为异常值。

考虑到这种复杂性,评估数据框分析 API 会在不同的阈值(默认情况下为 0.25、0.5 和 0.75)返回混淆矩阵。

精确率和召回率值将算法性能概括为一个数字,从而更容易比较评估结果。

精确率显示了多少被识别为类成员的数据点实际上是类成员。 它是真阳性的数量除以真阳性和假阳性的总和 (TP/(TP+FP))。

召回率显示了多少实际类成员的数据点被正确识别为类成员。 它是真阳性的数量除以真阳性和假阴性的总和 (TP/(TP+FN))。

精确率和召回率是在不同的阈值级别计算的。

接收者操作特征 (ROC) 曲线是一个图,表示二元分类过程在不同阈值下的性能。 它比较不同阈值级别下的真阳性率与假阳性率,以创建曲线。 从此图中,您可以计算曲线下面积 (AUC) 值,该值是介于 0 和 1 之间的数字。越接近 1,算法性能越好。

评估数据框分析 API 可以在不同的阈值级别返回假阳性率 (fpr) 和真阳性率 (tpr),因此您可以使用这些值来可视化算法性能。

离群值检测的目标是找到索引中最不寻常的文档。让我们尝试检测 数据日志样本数据集 中的异常行为。

  1. 验证您的环境是否已正确设置为使用机器学习功能。如果启用了 Elasticsearch 安全功能,则您需要一个有权创建和管理数据框分析作业的用户。请参阅 设置和安全。由于我们将创建转换,因此您还需要 manage_data_frame_transforms 集群权限。

  2. 创建一个转换,生成一个以实体为中心的索引,其中包含要分析的数字或布尔数据。在此示例中,我们将使用 Web 日志样本数据,并透视数据,以便获得一个新的索引,其中包含每个客户端 IP 的网络使用情况摘要。具体来说,创建一个转换来计算特定客户端 IP 与网络通信的次数 (@timestamp.value_count)、网络和客户端机器之间交换的字节总和 (bytes.sum)、单次通信期间交换的最大字节数 (bytes.max) 以及特定客户端 IP 发起的请求总数 (request.value_count)。您可以在 堆栈管理 > 转换 中创建转换之前预览它

    Creating a {{transform}} in {{kib}}

    或者,您可以使用 预览转换 API创建转换 API

有关创建转换的更多详细信息,请参阅 转换电子商务样本数据

  1. 启动转换。
提示

即使资源利用率会根据集群负载自动调整,但在运行时,转换会增加集群上的搜索和索引负载。但是,如果您遇到过大的负载,则可以停止它。

您可以在 Kibana 中启动、停止和管理转换。或者,您可以使用 启动转换 API。

  1. 创建一个数据框分析作业,以检测新实体中心索引中的异常值。

    在 Kibana 中 机器学习 > 数据框分析 页面上的向导中,选择新的数据视图,然后使用异常值检测的默认值。例如

    Create a {{dfanalytics-job}} in {{kib}}

    该向导包括一个散点图矩阵,使您可以探索字段之间的关系。您可以使用该信息来帮助您决定要包含或排除哪些字段进行分析。

    A scatterplot matrix for three fields in {{kib}}

    如果您希望这些图表表示来自更大样本量的数据或来自随机选择的文档,您可以更改默认行为。但是,更大的样本量可能会降低矩阵的性能,而随机选择可能会由于更密集的查询而给集群带来更大的负载。

    或者,您可以使用 创建数据框分析作业 API

配置完作业后,配置详细信息将自动验证。如果检查成功,您可以继续并启动该作业。如果配置无效,则会显示警告消息。该消息包含改进配置以进行验证的建议。

  1. 启动数据框分析作业。您可以在 机器学习 > 数据框分析 页面上启动、停止和管理数据框分析作业。或者,您可以使用 启动数据框分析作业停止数据框分析作业 API。
  1. 查看离群值检测分析的结果。数据框分析作业会创建一个索引,其中包含每个文档的原始数据和离群值分数。离群值分数表示每个实体与其他实体的差异程度。在 Kibana 中,您可以查看数据框分析作业的结果,并按离群值分数对其进行排序

    View {{oldetection}} results in {{kib}}

    ml.outlier 分数是介于 0 和 1 之间的值。值越大,它们成为离群值的可能性就越大。在 Kibana 中,您可以选择启用直方图图表,以更好地了解结果中每列的值分布。

    除了总体离群值分数之外,每个文档都使用每个字段的特征影响值进行注释。这些值加起来为 1,并指示哪些字段在决定实体是离群值还是内群值时最重要。例如,客户端 IP 111.237.144.54bytes.sum 字段上的深色阴影表示交换的字节总和是确定该客户端 IP 为离群值时最具影响力的特征。

    如果要查看确切的特征影响值,可以从与数据框分析作业关联的索引中检索它们。

Kibana 还在结果中提供了一个散点图矩阵。分数超过阈值的离群值在每个图表中都会突出显示。可以使用矩阵下的滑块设置离群值分数阈值

View scatterplot in {{oldetection}} results

您可以突出显示其中一个图表中的区域,并且相应区域也会在其余图表中突出显示。此功能使您可以更轻松地关注结果中的特定值和区域。除了样本量和随机评分选项之外,还有一个 动态大小 选项。如果启用此选项,则每个点的大小会受到其离群值分数的影响;也就是说,最大的点具有最高的离群值分数。这些图表和选项的目标是帮助您可视化和探索数据中的离群值。

既然您已经在样本数据集中发现了异常行为,请考虑如何将这些步骤应用于其他数据集。如果您有已标记为真实离群值的数据,则可以使用评估数据框分析 API 来确定离群值检测算法的执行效果。请参阅 6. 评估结果

提示

如果您不想保留转换和数据框分析作业,则可以在 Kibana 中删除它们,或者使用 删除转换 API删除数据框分析作业 API。当您在 Kibana 中删除转换和数据框分析作业时,您可以选择同时删除目标索引和数据视图。

© . All rights reserved.