揭开 KPI 异常检测顶级 AI 模型面纱
摘要:2020GDE 全球开发者大赛-KPI 异常检测告一段落,来自深圳福田莲花街道的“原子弹从入门到精通”有幸取得了总榜 TOP1 的成绩,在这里跟大家分享深圳福田莲花街道在本次比赛的解决方案。
GDE 全球开发者大赛-KPI 异常检测告一段落,来自深圳福田莲花街道的“原子弹从入门到精通“有幸取得了总榜 TOP1 的成绩,下面给出他的解决方案。
背景介绍
核心网在移动运营商网络中占据举足轻重的地位,其异常往往会导致呼叫失败、网络延迟等现网故障,对全网的服务质量带来重大的负面影响,多则影响十数万用户,并引发大面积投诉[1]。因此需要快速及时地发现核心网的异常风险,在影响扩大之前及时消除故障。
KPI 是一类能够反映网络性能与设备运行状态的指标,本赛题提供某运营商核心网的 KPI 真实数据,数据形式为 KPI 时间序列,采样间隔为 1 小时,选手需要使用[2019-08-01,2019-09-23)的数据进行建模,使用训练好的模型对未来 7 天的数据进行预测,识别未来一周 KPI 序列中的异常点。
评估指标:
本赛题采用 F1 作为评估指标,具体计算公式如下:
P = TP/(TP+FP)
R = TP/(TP+FN)
F1 = 2
P
R/(P+R)
数据探索
数据**有 20 个不同的 KPI,不同的 KPI 物理意义不同,代表了不同的核心网指标,由于赛题需要对未来 7 天的数据进行预测,因此对于建模样本也进行周级别的分布查看。从 Fig1 中可以明显看到训练集中前三周的异常率显著低于后续几周。进一步分析可以发现虽然赛题提供了[2019-08-01,2019-09-23)的全部数据,但 2019-08-15 之前所有 20 个 KPI 均毫无异常,第一个异常点是从 2019-08-15 02:00:00 开始出现的(Fig2),因此推测 8.15 前的数据分布不同于后续样本,或 8.15 之前存在标注异常的问题。实验中剔除 8.15 之前的样本建模效果也优于保留该时间段样本,进一步验证了该推测。
Fig1. KPI 周级别异常统计
Fig2. 异常与否的最早数据时间
时间序列图对于快速理解数据及业务有着重要的作用,对 20 个时间序列进行观察后,我将异常粗分为 4 类,如 Fig3 所示。
Fig3. 异常分类(时间序列中红点为异常,蓝点为正常)
1.边界型异常
如 Fig3 中 a 部分(红框)所示,边界型异常中异常样本的取值范围与正常值取值完全不同,即存在明确的决策边界可以完全分离异常点。
2.趋势破坏型异常
如 Fig3 中 b 部分(绿框)所示,正常样本点的走势往往沿着一个趋势,而趋势破坏型的异常点会偏离这个趋势,但取值范围可能仍然在正常样本的取值范围内,这类异常与相邻点的差异较大,与相同时刻正常点的取值差异也较大。
3.0 值型异常
如 Fig3 中 c 部分(橙框)所示,此类异常取值直接为 0,根据我对业务的理解,正常的 KPI 不应出现 0 值,根据分析,20 个 KPI 中有 19 个正常取值均不应为 0,仅 1 个 KPI 正常取值为 0,非 0 则为异常。
4.其他型异常
如 Fig3 中 d 部分(紫框)所示,此类异常往往既没有破坏趋势,取值也在正常的范围内,但可能会偏离相同时刻的正常取值。
解题思路
赛题**有 20 个不同的 KPI,KPI 物理意义不同且异常的种类也多种多样,若将所有 KPI 作为一个整体建立一个统一的二分类模型,模型效果差强人意,难以进入前排,但若对每个 KPI 单独建模,则需要建立并维护调优至少 20 个不同的模型,维护成本过高,因此我的思路是将 KPI 或异常进行分类建模。
3.1 边界发现
决策树会根据目标的分布将样本划分在不同的特征空间范围内(如 Fig4 所示),非常适合用于边界的发现与确定。因此针对边界型异常,即好坏样本取值完全不同的异常,我采用决策树进行边界的自动发现与确定,具体如下:
遍历 20 个 KPI,若仅使用时间序列取值建立的单变量浅层简单决策树在训练集中的 F1score=1,便认为该 KPI 为边界型异常 KPI,并使用该决策树的预测结果作为决策边界,对相同 KPI 的未来样本进行预测。
Fig4. 基于决策树的边界发现
对 KPI 进行遍历后可知,存在 7 个 KPI 所有异常均为边界型异常,即 7 个 KPI 在训练集中的所有异常取值范围均不同于正常样本。最终结果也表明,该方案不仅在训练集中能 100%识别边界型 KPI 的异常,在测试集中也能 100%识别相关异常。
3.2 非边界型异常探索
非边界型异常往往 KPI 走势存在一定的周期,若将时间周期剥离出来进行分析,则可以从二维的角度对时间序列进行观察。
Fig5. 时间序列的二维展示
以 kpi_id= 9415a… 为例,若将日期信息剥离,x 轴仅为一天中的第几小时,y 轴仍然为时间序列取值,则会得到如 Fig5 的展示。此时整个时间序列被呈现在一个二维空间中,且异常值(红点)多与正常值(蓝点)偏离较远,一个朴素的思路便是采用无监督方法识别图中的异常。事实上,在实际的生产环境中,多达 5000+原始 KPI,300+衍生 KPI,难以获得有异常标注的时间序列,因此在生产环境中往往使用统计方法或无监督算法进行异常检测[1,2]。但在当前有标签的赛题下,经多次尝试,无监督算法如 iForest,DBSCAN 以及时间序列分解方法如 Prophet 均无法胜过有监督机器学习算法。因此,对于非边界型异常,最终决定使用有监督机器学习算法进行建模。
3.3 KPI 类型划分
在 3.1 中基于简单决策树发现了 7 个边界型异常 KPI,但剩余的 13 个 KPI 物理意义各不相同,需要进行分组建模。分组最基本的思想便是相似的 KPI 应该分在相同的组中。Pearson 相关系数是我们最熟悉的相关性指标,其物理意义是表示两个变量同向或反向变动的程度,非常适合用于时间序列的相似性分析。通过对剩余 13 个 KPI 的相似性分析我们可以发现,以下两组 id 间的两两相关系数在 0.9 或以上。cluster1=[9415a…, 600a5…, ed63c…]
cluster2=[b3842…, bb6bb…, 3fe4d…]
Fig6. cluster1 时间序列对比示例
以 cluster1 为例(Fig6.),可以看到相似性分组中不同 KPI 的时间序列不仅走势接近,而且往往当分组内一个 KPI 产生异常时,其他 KPI 也会同步异常,表现出非常高的联动性。因此对于相似性分组的模型建立非常关键,往往异常的召回和误报均为 3 倍,也就是对一个则 3 倍上分,错一个则 3 倍掉分,赛程中段快速上分的核心点便是这部分模型的建立。 对于剩余的 7 个 KPI,最终我依据是否包含周期,将其划分为 3 小类进行分组建模:半周期型:cluster3_1 = [4f493…]无周期型:cluster3_2 = [29374…,8f522…]强周期型:cluster3_3 = [681cb…, 0a9f5…,355ed…,3e1f1…]其中,半周期型 KPI 仅在部分时间段表现出周期趋势,其他时间段取值几乎完全相同。无周期型 KPI 取值与时间无明显关联,强周期型 KPI 取值随时间不同产生周期性波动。
特征构造
根据前文分析以及我对时间序列问题的理解,本赛题中构造了以下 5 种类型的变量。1.基础变量:一天中的第几小时,星期几,kpi_id 的各种编码如 label encoder,target encoder 等等;2.差分变量:一阶差分,二阶差分,三阶差分;3.平移变量:上 n 个时间点该 kpi_id 的 value 或差分的取值及其简单衍生,如 24 小时前的 value 取值等;4.滑窗变量:过去 n 段时间该 kpi_id 的各类统计变量及其简单衍生,如过去 24 小时 value 的均值等;5.强相关窗口统计:如过去 7 天内该时间点上下两小时内介于该取值 0.95-1.05 范围内样本的总个数等等;
模型方案
鉴于本赛题难以建立一个能够应用于全部 KPI 的统一模型,而解题过程中有较多模型需要建立与调优,为提高效率,我在早期进行不同模型的若干次尝试后便决定使用训练速度较快且效果较好的 LightGBM 为各个分组建立二分类模型。
在实际的建模中我发现仅用[2019-08-15,2019-09-08]的数据建模效果优于全部数据或使用更接近测试集样本的后几周数据,结合 Fig1 中异常率在后几周大幅持续降低的现象,我判断[2019-09-09,2019-09-22]的异常分布可能不同或存在部分标注问题。在进一步探索后发现嫁接学习的引入能够充分的使用到全部异常数据并取得更好的效果。
嫁接学习是迁移学习的一种,用来描述将一个树模型 a 的输出作为另一个树模型 b 的输入的方法(a,b 往往数据分布不同或完全属于不同产品,与同分布数据的常规融合有着本质区别),此种方法与树木繁殖中的嫁接类似,故而得名[3]。在 IJCAI2018 广告算法大赛中,前六天和最后一天数据分布不同,于是大部分人用同分布的第七天上半天的数据预测下半天,而植物大佬用前六天的数据训练了一个模型,预测第七天得到的分数作为第七天模型的特征,再用第七天上半天的数据预测下半天,最后轻松得到 solo 冠军,事后植物说这是他玩的最容易的比赛,毕竟人家用半天数据,植物用的是六天半的数据[3,4,5]。其他数据分布不同的场景下 TOP 方案中亦有嫁接学习的身影,如蚂蚁金服 ATEC 支付风险识别 TOP1 方案[6],CCF BDCI 2018 个性化套餐匹配 TOP1 方案[7]等[3] 。
在若干次尝试后,我最终确定了以存在异常日期样本为 1 层模型样本, [2019-08-15,2019-09-08]样本结合 1 层模型分数作为 2 层模型输入的方案,模型框架如 Fig7.所示,该框架的引入在本赛题中提分明显,是上分的关键点之一。
Fig7. 模型框架
结合前文的内容,最终我的建模方案如 Fig8 所示,先进行 KPI 边界的自动发现,解决 7 个边界型 KPI 的异常,对于剩余的 13 个 KPI,先根据相似性将其拆解为相似群组(6 个 KPI)和不相似群组(7 个 KPI),相似群组由组内相关系数较高的 cluster1 和 cluster2 构成,不相似群组按照是否包含周期划分为半周期群组 cluster3_1,无周期群组 cluster3_2 和强周期群组 cluster3_3,再对不同的群组分别建模,最后汇总生成最终结果。最终该方案取得了线上最高分及答辩最高分的成绩。
Fig8. 建模方案
鸣谢
非常感谢希旭哥,苕芸博士,素颜姐,小爱姐等人在比赛过程中的帮助与指导,希旭哥还是一如既往的热情,总能在第一时间为大家答疑解惑。
感谢庐山大佬赛后的精彩分享[2],让人受益匪浅。以前我没看过华为云开发者沙龙的分享,这次看完后觉得可针不戳,以后每期都不能错过。 最后祝华为及 NAIE 蒸蒸日上,再创辉煌!
Reference
[1] 网络 AI-KPI 异常检测,利器大揭秘bbs.huaweicloud.com/videos/1035…
[2] DevRun 开发者沙龙—火遍网络的 KPI 异常检测到底什么vhall.huawei.com/fe/watch/66…
[3] 嫁接学习简述zhuanlan.zhihu.com/p/98728768
[4] 结构化数据的迁移学习:嫁接学zhuanlan.zhihu.com/p/51901122
[5] IJCAI-2018 TOP1 分享github.com/plantsgo/ij…
[6] ATEC 支付风险大赛 Top1 解决方案zhuanlan.zhihu.com/p/45826529
[7] CCF BDCI 2018 个性化套餐匹配 TOP1 方案https://github.com/PPshrimpGo/BDCI2018-ChinauUicom-1st-solution
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/3f0528cd387bbac4b1d30a8f5】。文章转载请联系作者。
评论