2018年9月11日 工程

Elastic Machine Learning 时间型分析与种群型分析之间的对比

作者 Rich Collier

通过 Elastic Machine Learning,用户能够发现两种主要类型的异常情况,第一种本质上与时间相关(与其他时间进行对比),第二种与种群相关(与所有其他人进行对比)。但是,这两种分析之间有什么区别呢?如何判断在什么情况下使用哪种分析呢?本篇博文讨论了这两种分析的详细情况以及各自的优点,并且会基于一般经验原则给出一些最佳实践。

首先我们需要对时间型和种群型异常情况进行定义。为此,我们在下面列出了各自的特征:

时间型异常检测

  • 除非专门定义为种群型分析,否则 Elastic Machine Learning 会默认进行时间型异常检测。
  • 对实体自身在一段时间内的行为进行比较。
  • 可以使用 “split”(通过 by_field_namepartition_field_name)针对每个具体实例创建各自的基线(即为每个主机或用户创建一个专有基线)。
  • 不太适用于高基数或者分布十分稀疏的数据元素(例如,网站访客的外部 IP 地址可能分布十分稀疏,而且基数很高,比如有数十万个甚至更多)。如果不[在默认限值的基础上提高]作业的内存限值,将会出现性能问题1。然而,即使提高了时间型分析的内存限值,种群型分析仍然很有可能会更加合适。

种群型异常检测

  • 只有使用 over_field_name(或者使用 Kibana 中的种群型作业向导)后,才会调用。声明作为 over_field_name 的字段将会用来定义种群。
  • 是对种群内成员进行的对等分析,或者更准确地说,是个别实体与一段时间内由所有对等实体组成的聚合模型之间的对比。
  • 也可以使用 “split”(通过 by_field_namepartition_field_name)来创建子种群。
  • 因为个体成员也是聚合行为模型的一部分,所以通常十分适合用于高基数或者分布稀疏的数据元素。

示范用例

现在既然已经讲清了二者之间的区别,我们接下来讨论一个虚拟用例,希望通过这个用例,帮助大家决定如何选择正确的分析方式。

假设我们希望跟踪从内部服务器上下载的文档数量,此服务器所包含文档的适用人群十分广泛,与公司(员工人数超过 50,000 人的大型公司)内的每个人都相关。此外,任何人都可以随时访问此文档服务器。最后,我们假定文档服务器的访问日志会跟踪每次文档访问过程,也会记录下载文档的用户。

时间型异常检测示例

如果我选择时间型异常检测,并且采用下面的分析结构:

    "detectors": [
      {
        "function": "count",
        "partition_field_name": "user"
      }
    ]

然后,我预计将会跟踪每名用户(按名字)一段时间内的下载量。因此,如果用户“王薇”通常每天下载 50 份文档(她在工程部门上班,需要大量使用服务器上的文档),只有在王薇的行为急剧变化并且她的下载量大大减少或大大高于她平时下载量时(例如每天下载 5,000 份),这才属于异常情况。

而且,如我之前所说,我需要知道 Machine Learning 预计会跟踪多少名唯一用户。如果我们提高 Machine Learning 作业的内存限值,50,000 名唯一用户仍在我们的可管理范围之内。然而,还有另外一点也需要我们注意,用户可能不会每天都持续下载文档,所以他们的行为可能分布十分稀疏,可能今天下载了几份文档,然后好几个月才进行下次下载。如果没有关于每名用户的持续观察结果,我们可能很难针对每名用户确立一个准确的基线。

但是,最重要的是下面这种情况,如果有另一个人(用户“赵飞”)一天之内就下载了 5,000 份文档,然后就再也不下载了呢?这属于异常情况吗?赵飞是公司内部的威胁呢?还是外部的数据窃取恶意软件使用赵飞的登录凭证盗取了大量文件并希望发送到公司之外呢?如果使用时间型异常检测方法,我们并不能确定结果是否异常;我们的确不知道这对“赵飞”而言是否算得上异常行为,因为我们并没有他的历史数据进行对比(我们只看到了一个样本)。

种群型异常检测示例

换种方法,如果我们使用种群型异常检测方法解决此问题的话,代码如下:

    "detectors": [
      {
        "function": "count",
        "over_field_name": "user"
      }
    ]

然后,我们就可以进行下列操作:

  • 无论每个 bucket_span(在此示例中为每天)内有多少用户,我们都可以创建一个聚合模型,表明整体用户的典型下载量是多少
  • 将每天中的每名用户与聚合模型进行对比

现在,如果王薇和她的大部分同事每天下载的文档数量为 10-75 份,则典型使用量的整体“聚合”模型将会位于此范围内。如果赵飞下载了 5,000 份文档,这就属于异常情况,因为赵飞的比较对象是王薇和她的同事。Machine Learning 作业会将赵飞作为异常情况标注出来。

然而,还有很重要的一点。如果王薇(不是赵飞)也恰巧下载了 5,000 份文档,王薇也会作为异常情况予以标注,这并不是因为她下载的数量比平时多,而是因为她的下载量比“典型”使用量模型高;该使用量模型正是她和她的同事在一段时间内帮助建立起来的。

重点是,虽然无论使用时间型还是种群型异常检测方法,Machine Learning 作业都会将王薇作为异常情况标注出来,但是在这个示例中,种群型方法更加灵活,因为:

1.即使数据分布稀疏,种群型方法也不受影响
2. 如果唯一用户的数量很高,种群型方法更加高效,也更加节省内存(因为无需为每名用户创建单独模型)
3.对于历史数据很少或根本没有历史数据的异常情况(例如赵飞),种群型方法也能检测出来
4.如果王薇的行为急剧变化,以致于超出了聚合行为模型的范围,种群型方法仍能够检测出王薇为异常情况

还有一个建议:如果正在进行种群分析,您最好在构建种群时尽量确保种群内数据的同质性。换言之,如果您拥有不同用户类型(例如工程师和 HR 员工)的大型集群,相比于把数据合在一起进行分析,更为有效的一种方法是:将这些员工划分为不同的群组,然后进行两次单独分析。

需要注意的最后一点:如果您事先已经知道希望排除种群内的某些成员,则可以考虑将他们筛除出去,既可以对输入数据进行筛选,也可以利用规则对结果进行筛选

希望本文的解释能够帮助您对比这两种方法。如果您希望对自己的数据尝试 Machine Learning,欢迎下载 Elastic Stack 并启用 30 天试用证书,或者也可以开始免费试用 Elastic Cloud