在智能运维领域,告警关联中的频繁项集挖掘(也被称之为关联规则挖掘)算法,在告警关联分析、根因定位以及告警降噪中经常使用。本篇内容我们将为大家介绍一种典型的频繁项集挖掘算法:FP-Growth 算法。

一、告警关联简介

随着大型公司系统架构复杂性、异构性的快速发展,故障定位的效率和异常行为监测的准确度直接决定了公司内业务系统的稳定程度,并间接影响了公司的实际经济效益。 因此,越来越多的公司开发出足够强大的监控中心,能够有效管理、监控和追踪系统中潜在的故障和已经发生的故障,并将其作为警报发送给运维人员。然而如何高效的处理大量警报,也由此成为了运维人员面临的新挑战。

理论上讲,如果能够实时并百分百准确地实现对每个警报的根因定位,那么便能够有效解决这一问题。然而根据学术界目前的研究进展,在未来几年内都很难实现这一目标,主要原因不仅在于研究本身的难度,也与警报的发送机制有关,很多情况下,根因警报反而在衍生警报之后发出,这使得实时根因分析不可能得到最正确的结果。因此,不论是学术界还是工程界最终都更倾向于从 时间 、文本、空间等维度挖掘警报之间的关联关系,并根据这种关联关系实现警报的分组,按照所含信息量及严重程度等信息划分警报的优先级,以加速故障定位的过程。

为此,我们提出了一种告警降噪的架构,并在其中详细的定义了告警关联这一问题,定义如下:根据关联场景,将一定 时间 窗口内的多个警报按照时间、空间和语意相关性,关联为描述当前场景中特定问题的集合,每个集合称为一个事件。 基于这一定义,我们研发出了多种算法分析警报之间的关联特性,其中 FP-Growth 算法便是一种典型的分析时间相关性的方法。

二、频繁项集挖掘简介

频繁项集挖掘常用于购物记录分析中,通过分析用户经常一起购买的商品实现商品推荐功能。在这一场景中,频繁项集挖掘是查找经常一起购买的商品组合的技术术语,而在告警关联场景中,我们可以认为频繁项集挖掘是指查找经常一起出现的警报组合,其中每一个警报以及上文中的每一件商品都可以被称之为一个“项”,比如警报 ID“A”、“B”或者商品“啤酒”、“鸡蛋”都可以被看作一个单独的项。多个项组合在一起可以被成为一个项集,比如警报 ID 组成的项集["A"、"B"],商品项集["啤酒"、"鸡蛋"]。

这类问题的原始数据是多个项集组合成的数据库,频繁项集挖掘的目标是使用快速有效的算法识别其中频繁一起出现的项与项的组合,最容易想到的解决方案是遍历所有项,并列举出所有可能存在的项集,这显然需要消耗大量的时间,因此我们需要更好的解决方案。

三、Apriori 算法原理

FP-Growth 算法是该领域中最先进的算法之一,但为了更好的理解 FP-Growth 算法,我们将首先介绍该领域中最基本的算法,即 Apriori 算法,并借此引出频繁项集挖掘这一领域的部分基本概念。

在 1994 年提出的文章《Fast Algorithms for Mining Association Rules》中,作者提出了 Apriori 算法用于解决这类问题,这一算法主要包含 7 个步骤:

  1. 计算项的支持度

频繁项集挖掘算法基于支持度的概念,支持度可以被理解为在全部的项中,待计算项出现的概率, 具体的计算方法是统计待计算项出现在了几个项集中,以及原始项集的总个数,求取比值作为当前待计算项的支持度。

假设啤酒、纸尿裤都被 4 个人购买,鸡蛋只有 2 个人购买,则根据步骤 1,我们能够计算出三件商品的支持度。

  1. 确定支持度阈值

确定每个项的支持度后,需要一个标准用于过滤掉不常见的项,这个标准称之为支持度阈值。 比如对于步骤 1 中的数据,假设我们并不希望关注购买人次不足 3 人次的商品,则可将支持度阈值设定为 0.3。

  1. 筛选频繁项

确定支持度阈值后,支持度低于这一标准的项将作为不常见的项被过滤掉,也就不会参与到后续的分析步骤中。 在上文的案例中,鸡蛋便是被过滤掉的不频繁项。

  1. 计算频繁项集的支持度

接下来的分析与上文相同,但分析的单元从单独的项变成了项与项的组合也就是项集。比如上文提到的啤酒和鸡蛋组合后可看作一个项集。可以想象,经过对频繁项的筛选,需要生成的项集组合的数目比不经过频繁项筛选时要少得多。针对这些新的项集组合,我们依然可以统计他们的出现频次,计算所有组合出现频次之和,并确定他们的支持度。

  1. 对新的项集重复上述步骤

经过步骤 1-4,我们已经实现了频繁项的过滤与组合,以及支持度的统计,重复上述步骤,我们便可以获得包含更多项的频繁项集。

  1. 生成关联规则并计算置信度

现在我们已经获得了频繁项集,在特定的场景下,仅仅是频繁项集并不能够满足使用者的需求,还需要将他们转化为关联规则,并针对这些关联规则的可信程度进行评估。 关联规则的格式为:项 X = > 项 Y,这意味着我们获得了一条规则,规则的含义为在项 X 存在的情况下,有很大概率项 Y 也会存在。而置信度则是对这一规则的可信程度的考量,置信度 100%意味着项 X 存在的情况下,项 Y 永远存在,而 50%则意味着项 X 存在时只有 50%的概率同时出现项 Y。这一指标可通过计算项 X 和项 Y 的出现次数与项 X 单独出现次数的比值获得。

  1. 计算提升度

在商品推荐等场景中,还存在有提升度的概念,这一指标用于评价项与项之间关联的强度,比如"任何产品=>X"的置信度为 10%,"A=>X"的置信度为 75%,则提升度为 75%/10% = 7.5。如果最终结果小于 1,则可以认为这条关联规则并不成立,规则内的项彼此独立。

通过上述介绍,我们已经了解了告警关联和频繁项集挖掘的基本概念,并介绍了频繁项集挖掘类算法的三个基本的评价指标,即支持度、置信度、提升度。 而作为目前最先进的频繁项集挖掘算法之一的 FP-Growth,相比与 Apriori 算法又有哪些改进呢?

四、FP-Growth 算法

与 Apriori 算法相似,FP-Growth 算法的基石同样是从数据集中找出频繁的项目集,并过滤掉不频繁的部分,但为了更快的实现这一过程,FP-Growth 算法引入了树结构代替项集,这种结构可以在更短的 时间 内扫描数据集并生成关联规则。 算法的具体步骤如下:

  1. 计算项的支持度

FP-Growth 算法最初的步骤与 Apriori 算法相似,但为了更加直观的展示这一过程,我们将从如下的示例数据入手:

统计原始数据中各项的支持度,为了更加直观的展示实际效果,我们将项一共出现在了几个项集中作为该项的支持度,比如对于项“A”,在项集 1、2、4、5、7、8、9、10 中都出现过,共出现在了 8 个项集中,则 A 的支持度为 8,其余各项的支持度如下。

  1. 确定支持度阈值

同样的,FP-Growth 算法也需要确定支持度阈值,假定支持度阈值设定为 2。

  1. 筛选频繁项

不满足支持度阈值的项将被删去,则保留的项和支持度如下:

  1. 根据项的支持度对项集排序

为构建树结构,需要将剩余的项按照支持度进行排序,即按照 A、C、E、G、B、D、F 这一顺序排序项集。(同支持度的项可按照项的出现顺序进行排序,不同支持度的项按照支持度排序,比如 G 的支持度为 5,小于 E 的支持度,则排在 E 后)。

  1. 创建树并逐个添加项集

获得经过排序后的频繁项集后,将建立项头表和 FP 树,项头表可被认为是频繁项以及节点链表的组合,FP 树可以被认为是将项集内的节点一一映射到树中,树上的每个节点为一个项,这些节点都可以通过项头表内的节点链表访问到,也可以通过树的根节点访问到。同样的,为了直观说明,我们给出了如下图示,扫描项集编号为 1 的项集[A、C、E、B、F]后,可建立项头标以及树,项头表第一列为项的编号,第二列为该项的支持度,第三列为节点链表的起始点。

重复上述步骤,直到扫描完成所有项集,可得如下结果,其中部分项无法仅用一个节点表示,比如 G,在项集 2 和 5 中,项集分别为[A、C、G]和[A、C、E、G、D],因此需要采用链表链接两个节点:

  1. 扫描 FP 树并获得关联规则

建立 FP 树后,该如何挖掘关联规则?这里我们需要引入 FP-Growth 算法特有的条件模式基的概念,条件模式基是指某个项的前缀路径的集合,通俗理解即是从根节点到该项所有节点走过的路径组成的新的树。举例说明,假定我们希望挖掘与 D 有关的规则,则 D 的条件模式基为图中的标红部分。

获得 D 的条件模式基后,我们可以看出共有两个主要分支,即 A-C-E-G-D 和 A-C-D,由于末端节点 D 的出现次数都为 1,因此以上两个分支的出现次数也为 1,这一点通过原始数据也可以看出。接着我们能够判断其中的公共分支为 A-C-D,在两个分支中各出现 1 次,一共出现了 2 次,由于我们的支持度阈值为 2,因此[A、C、D]为频繁项集之一,其子集[A,C], [A,D], [C,D]也就都是频繁项集。至此我们演示了如何挖掘频繁项集。

  1. 生成关联规则并计算置信度

对于关联规则置信度的计算方法,频繁项集挖掘类算法基本一致,可参考 Apriori 算法中的第 6 步骤,这里不再赘述。

五、总结

在本篇文章中,我们介绍了频繁项集挖掘算法,讲解了基础算法 Apriori 和目前较为先进的算法 FP-Growth,并详细描述了相关概念及实现步骤,下期我们将会就如何将这一算法应用到告警关联场景中,进而实现告警降噪的功能进行进一步的说明,敬请期待。

开源福利

云智慧已开源数据可视化编排平台 FlyFish 。通过配置数据模型为用户提供上百种可视化图形组件,零编码即可实现符合自己业务需求的炫酷可视化大屏。 同时,飞鱼也提供了灵活的拓展能力,支持组件开发、自定义函数与全局事件等配置, 面向复杂需求场景能够保证高效开发与交付。

点击下方地址链接,欢迎大家给 FlyFish 点赞送 Star。参与组件开发,更有万元现金等你来拿。

GitHub 地址: https://github.com/CloudWise-...

Gitee 地址:https://gitee.com/CloudWise/f...

万元现金活动: http://bbs.aiops.cloudwise.co...

微信扫描识别下方二维码,备注【飞鱼】加入AIOps社区飞鱼开发者交流群,与 FlyFish 项目 PMC 面对面交流~


云智慧技术社区
70 声望18 粉丝

我们秉承Make Digital Online的使命,致力于通过先进的产品技术,为企业数字化转型和提升IT运营效率持续赋能。