[参赛经验分享]揭开KPI异常检测顶级AI模型面纱--二等奖(sh团队)
声明:本文首发于华为NAIE《网络人工智能园地》微信公众号,如有转载,请注明出处。
本文首发:https://mp.weixin.qq.com/s/bF-dbc-nmSlvbDo_d_BggA
团队名称:sh
大赛地址:https://competition.huaweicloud.com/information/1000041319/introduction?track=107
赛题介绍
1.1 赛题描述
核心网在整个移动运营商网络中占据着举足轻重的地位,一旦故障,会对全网的服务质量影响很大。需要及时快速发现核心网的风险,在影响范围扩大之前及时消除故障。关键性能指标(KPI),反映了网络性能和质量。对KPI进行检测,能够及时发现网络质量劣化风险。目前KPI异常检测指的是通过算法分析KPI的时间序列数据,判断其是否出现异常行为。
这里存在几个难点:
a.异常发生的频率很低,网元数据很少发生故障,因此可供分析的异常数据很少
2
b.异常种类多,核心网网元数据多,故障发生的类型也多种多样,导致了异常种类也多种多样
3
c.KPI曲线的多样性,KPI曲线表现为周期型的,有稳定型的,也有不稳定型的
针对以上难点,为了提高核心网网元数据的异常检测算法的准确率和召回率,主办方将在比赛中提供某运营商的KPI真实数据,采样间隔为1小时。参赛选手需要根据历史数据异常标签数据(训练数据集),训练模型并检测后续一段时间内各KPI(测试数据集)中的异常。
1.2 数据介绍
本次比赛提供两份数据,其中一份包含标签列,另一份不包含标签,分别为phase1_train.csv(带标签), phase1_test.csv(不带标签)。包含标签的数据有参赛选手自行划分为训练集,验证集和测试集,不包含标签的数据需要用户采用训练好的模型进行检测输出对应标签并提交,phase1_train.csv 和 phase1_test.csv 文件格式(结构化字段)说明:1.3 评价指标1)相关定义:TP(True Positive): 真实为 1,预测也为 1;FN(False Negative): 真实为 1,预测为 0 ;FP(False Positive): 真实为 0,预测为 1;TN(True Negative): 真实为 0,预测也为 0。2)按以下公式计算参赛者的成绩评分,依据准确率(公式 1)和召回率(公式 2),计算 F1-score(公式 3),最后按照 F1-score 对所有参赛者进行排序。P = TP/(TP+FP) (公式 1)R = TP/(TP+FN) (公式 2)F1-score = 2*P*R/(P+R)(公式 3) 数据理解
2.1 关于kpi_id和采样时间
给定的数据一共包含20种不同的kpi_id:
每个kpi_id的value序列采样时间和数据量都是一致的,并且测试集的时间紧跟在训练集后面,这为我们处理这种基于时间序列的数据提供了很大的便利,测试集数据可以直接拼接到训练集后面。
具体的,训练集和测试集的采样时间都是一个小时,训练集数据的时间范围为:‘2019-08-01 00:00:00’到'2019-09-22 23:00:00',共20*1272 = 25440条数据;测试集数据的时间范围为:'2019-09-23 00:00:00'到'2019-09-29 23:00:00',共20*168 = 3360条数据。
2.3 关于时间序列值value
直接统计value数值的分布情况:
可以看出绝大多数value的数值分布0-3000的范围内。但是,绝不能简单根据value的数值分布来建模,而忽视各kpi_id的具体情况。不同的kpi_id对应的value序列往往具有不同的特性,下面两张图可以很直观地体现这种差异:针对第一种情况,我们用肉眼就能很轻易地判断出异常点,这种情况往往通过聚类算法(例如GMM),或者基于统计分布的异常检测算法(例如3-sigma和box-plot)就能够较好地检测出异常点,这样的方法基于数值的统计分布规律,不需要使用时间信息。
针对第二种情况,value序列体现出周期变化的规律,异常值往往来自于序列的周期变化规律遭到破坏。(上面的图如果太小,下面给出了异常点附近的局部放大图)
对于这种周期变化的情况,可以考虑采用基于传统的时间序列异常检测方法。时间序列异常检测算法中,对于有趋势项或周期项的,可以采用经典的时序分解模型(例如Holt-winter、STL等);对于平稳的时间序列,可以采用ARIMA算法(序列不平稳的情况下也可以采用一些方法将其转化为平稳序列);对于其他时间序列,可以采用机器学习或深度学习模型等。
针对目标序列的情况,我首先尝试了相对简单的指数平滑模型(由于其具有周期性,所以采用三指数平滑,即Holt-winter算法)。另外,对于时序数据,由于数据间存在时间依赖性,所以交叉验证时,随机划分数据集会破坏序列的时间结构,需要采用滚动交叉验证进行参数选择。
经过尝试,传统的时间序列异常检测算法能够达到一定的效果,但是当我使用了比赛大杀器xgboost模型后,发现前面的方法瞬间变得“不香”了。本质上来说,传统的时间序列预测模型还都是线性模型,而对于xgboost(包括后来加上的LR模型),可以自己构造大量的非线性特征,因此效果自然好了许多。另外,我最后采用的是基于二分类的方式来对标签进行预测。
下面主要介绍构造特征过程中的做法。
特征工程
3.1 提取时间信息
赛题中提供的数据是一个时间戳,但是时间戳只是一个具有相对大小的数值而已,我们可以提取出其中的“Hour”和“Day”信息,进一步还可以得到某一天是周几,是否周末等信息。
3.2 onehot编码
kpi_id属于类别特征,上一个过程提取得到的“Hour”和“Day”也是,这些类别特征可以进行onehot编码,onehot编码主要是用于LR模型的输入。
3.3. value处理成标准形式
首先统计历史中值和标准差。这里采用中值而非均值是因为异常值对均值的统计会造成较大的影响;标准差是逐天统计,之后取中值而非均值,同样是为了减轻异常值的影响。
Value可以有几种标准化的方式,比如:1、除以中值或者减去中值,保留各kpi_id标准差的相对大小关系2、减去中值,除以标准差,各kpi_id有统一的评估标准
3.4 对标准形式的value离散化
离散化的目的是对特征进行非线性处理,并且可以把连续型特征转化为类别型特征,便于采用类别特征的处理方式进一步加工。分桶数目可以选取多种,以此创造足够多的非线性特征。经过测试,按照分位数进行分桶具有较好的效果,分桶数目一共设置了四种:20,50,100和200。
3.5 对标准化形式的value进行其他处理
主要是一些常见的做法,比如一阶二阶差分,和前一小时、历史中值的差值/比值等,前一小时或者前几天的中值也都可以添加进来作为当前样本的特征。对上述重要特征再进行分桶操作。
3.6 滑动窗口特征
滑动窗口可以创造出大量的特征,主要的可选参数和方法有:1、滑动窗口长度;2、窗口内的统计量:最大值、最小值、均值、中值、方差,甚至三阶矩和四阶矩(偏度和峰度)等3、同比或者环比滑动窗口得到的重要特征可以进一步处理以获得更多的交叉特征,比如减法、除法、分桶、聚合等。
3.7 fft特征
计算谐波大小,位置等,希望以此衡量周期性强弱(这里发现效果不是太明显)。
3.8 模型前一个时刻的预测值在分析数据中发现(如下图所示),对于某些kpi_id,若前一小时异常,那么下一个小时也有较大的概率也为异常,即当前时刻数值的异常概率和下一时刻数值的异常概率具有关联性,因此一些模型对前一小时的预测值(异常概率)可以作为其他模型当前小时的样本的特征,这一特征依然可以进行离散化等操作。
3.9 Target Encoding
对于上面得到的重要类别特征,可以进行目标编码。目标编码可以理解为统计每一种类别的概率分布信息,即用类别对应的标签的期望代替原始的类别特征。这样的特征和标签具有很强的相关性,因此具有较大的标签泄露风险,那么就容易导致过拟合。但如果处理得好,目标编码得到的特征一般都是强特征。这里采用的方案是通过K折target encoding来抑制过拟合问题。
3.10 特征筛选
1、基于特征相关性
这里需要筛选出与标签相关程度较大的特征。而特征之间相关性较大的则需要适当删除,减少对模型的干扰。
2、基于树模型输出的特征重要性
3、手工筛选
手工筛选特征主要针对解释性较好的LR模型,不仅可以筛选特征,还可以调整特征权重,后面的模型选择部分也会提到相关内容。
模型和方案选择
4.1 基于boosting的树模型有了特征之后首先尝试的当然是基于boosting的树模型,我主要尝试了xgboost、catboost和lightGBM三种模型,根据最终模型的表现情况,采用了lightGBM模型。另外,选择了两组特征作为lightGBM模型的输入,得到了lgb_pred1和lgb_pred2两个预测结果,选择不同的特征能够让模型具有不同的关注点,同时,这两个预测结果也具有相对独立的误差分布,最终融合之后也会有较好的效果。
4.2 逻辑回归
采用逻辑回归模型主要基于如下两点考虑:
1、具有较好的可解释性,方便手工选择特征或者调整权重;2、用于重点关注lightGBM模型表现不佳的地方。在交叉验证的过程中,可以得到训练集的预测结果,进一步可以查看当前模型在什么情况下预测效果不佳。下图是某一次lightGBM模型的预测结果,黄色的星星是真实异常点,绿色的圈圈是预测的异常点,说明lightGBM模型存在预测不准的地方,那么可以重点关注这些点,针对性的选择特征,用于LR模型的训练和参数的调整,但是这种做法需要注意存在过拟合的风险。
4.3 基于kpi_id之间的相似度
在数据分析过程中发现了一个特点:有些kpi_id之间具有较高的相似性:不仅曲线相似,它们还倾向于在同一个时刻发生异常(如下图)。
因此,可以考虑利用当前时刻其他kpi_id的上述模型预测概率的加权,来预测当前时刻当前kpi_id的异常概率,而不仅仅局限于对当前kpi_id进行建模。相似度度量方式主要有Jaccard系数、向量内积、余弦相似度、Pearson相关系数等。
余弦相似度实际上是向量内积的归一化形式,而Pearson相关系数则可以看成余弦相似度的去偏置(均值)形式。最后,我采用的相似度度量准则是Pearson相关系数,并加入了适当的手工修正,因为基于相似度的预测效果,不同的kpi_id表现不尽相同。通过基于相似度的预测,得到的预测结果为sim_pred。
4.4模型融合
最后四个结果(lgb_pred1、lgb_pred2、lr_pred、sim_pred)通过加权融合得到最终的预测结果。
总结和鸣谢
(1)排行榜真的是焦虑源泉,不过有焦虑才有动力;
(2)另外,数据和特征才是王道,好的特征带来的提分效果还是比较明显的;(3)这里要感谢各位一起参赛的选手,从大家在微信群里的交流讨论,以及思路和方案中学到了很多很多;(4)最后当然要感谢主办方,微信群内的细致答疑、不定期抛出的学习资源、以及华为NAIE的服务资源等等,温暖周到又贴心,点个大大的赞!
- 点赞
- 收藏
- 关注作者
评论(0)