查找异常值

编辑

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

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

异常值检测算法

编辑

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

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

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

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

特征影响

编辑

特征影响——在检测异常值时计算的另一个分数——提供了不同特征及其对某个点成为异常值的贡献的相对排名。此分数使您能够了解某个特定数据点为何成为异常值的上下文或推理。

1. 定义问题

编辑

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

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

2. 设置环境

编辑

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

3. 准备和转换数据

编辑

异常值检测需要特定结构的源数据:二维表格数据结构。因此,您可能需要转换您的数据以创建可作为异常值检测源的数据帧。

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

4. 创建作业

编辑

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

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

5. 启动作业

编辑

您可以通过 Kibana 或使用启动数据帧分析作业 API 启动作业。异常值检测作业有四个阶段

  • 重新索引:文档从源索引复制到目标索引。
  • 加载数据:作业从目标索引获取必要的数据。
  • 计算异常值:作业识别数据中的异常值。
  • 写入结果:作业将结果与目标索引中的数据行匹配,合并它们,并将它们索引回目标索引。

最后一个阶段完成后,作业停止并准备好评估结果。

异常值检测作业(与其他数据帧分析作业不同)在其生命周期中运行一次。如果要再次运行分析,则需要创建一个新作业。

6. 评估结果

编辑

使用数据帧分析功能从数据集中获取见解是一个迭代过程。在定义要解决的问题并选择可以帮助您解决问题的分析类型后,您需要生成高质量的数据集并创建相应的数据帧分析作业。您可能需要尝试不同的配置、参数和转换数据的方式,才能获得满足您用例的结果。评估数据帧分析 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 Kibana

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

    API 示例
    POST _transform/_preview
    {
      "source": {
        "index": [
          "kibana_sample_data_logs"
        ]
      },
      "pivot": {
        "group_by": {
          "clientip": {
            "terms": {
              "field": "clientip"
            }
          }
        },
        "aggregations": {
          "@timestamp.value_count": {
            "value_count": {
              "field": "@timestamp"
            }
          },
          "bytes.max": {
            "max": {
              "field": "bytes"
            }
          },
          "bytes.sum": {
            "sum": {
              "field": "bytes"
            }
          },
          "request.value_count": {
            "value_count": {
              "field": "request.keyword"
            }
          }
        }
      }
    }
    
    PUT _transform/logs-by-clientip
    {
      "source": {
        "index": [
          "kibana_sample_data_logs"
        ]
      },
      "pivot": {
        "group_by": {
          "clientip": {
            "terms": {
              "field": "clientip"
            }
          }
        },
        "aggregations": {
          "@timestamp.value_count": {
            "value_count": {
              "field": "@timestamp"
            }
          },
          "bytes.max": {
            "max": {
              "field": "bytes"
            }
          },
          "bytes.sum": {
            "sum": {
              "field": "bytes"
            }
          },
          "request.value_count": {
            "value_count": {
              "field": "request.keyword"
            }
          }
        }
      },
      "description": "Web logs by client IP",
      "dest": {
        "index": "weblog-clientip"
      }
    }

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

  3. 启动转换。

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

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

    API 示例
    POST _transform/logs-by-clientip/_start
  4. 创建一个数据框分析作业以检测新以实体为中心的索引中的异常值。

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

    Create a data frame analytics job in Kibana

    向导包含一个散点图矩阵,它使您能够探索字段之间的关系。您可以使用这些信息来帮助您确定要包含或排除在分析中的字段。

    A scatterplot matrix for three fields in Kibana

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

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

    API 示例
    PUT _ml/data_frame/analytics/weblog-outliers
    {
      "source": {
        "index": "weblog-clientip"
      },
      "dest": {
        "index": "weblog-outliers"
      },
      "analysis": {
        "outlier_detection": {
        }
      },
      "analyzed_fields" : {
        "includes" : ["@timestamp.value_count","bytes.max","bytes.sum","request.value_count"]
      }
    }

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

  5. 启动数据框分析作业。

    您可以在 机器学习 > 数据框分析 页面上启动、停止和管理数据框分析作业。或者,您可以使用启动数据框分析作业停止数据框分析作业 API。

    API 示例
    POST _ml/data_frame/analytics/weblog-outliers/_start
  6. 查看异常值检测分析的结果。

    数据框分析作业创建一个索引,其中包含原始数据和每个文档的异常值分数。异常值分数指示每个实体与其他实体的不同程度。

    在 Kibana 中,您可以查看数据框分析作业的结果并根据异常值分数对其进行排序。

    View outlier detection results in Kibana

    ml.outlier 分数是一个介于 0 和 1 之间的值。值越大,越有可能成为异常值。在 Kibana 中,您可以选择启用直方图以更好地了解结果中每列值的分布。

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

    如果您想查看确切的功能影响值,则可以从与数据框分析作业关联的索引中检索它们。

    API 示例
    GET weblog-outliers/_search?q="111.237.144.54"

    搜索结果包含以下异常值检测分数

    ...
      "ml" : {
        "outlier_score" : 0.9830020666122437,
        "feature_influence" : [
          {
            "feature_name" : "@timestamp.value_count",
            "influence" : 0.005870792083442211
          },
          {
            "feature_name" : "bytes.max",
            "influence" : 0.12034820765256882
          },
          {
            "feature_name" : "bytes.sum",
            "influence" : 0.8679102063179016
          },
         {
            "feature_name" : "request.value_count",
            "influence" : 0.005870792083442211
          }
        ]
      }
    ...

    Kibana 还提供结果中的散点图矩阵。得分超过阈值的异常值在每个图表中突出显示。可以通过使用矩阵下方的滑块设置异常值得分阈值。

    View scatterplot in outlier detection results

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

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

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

进一步阅读

编辑