首先感谢华为公司举办的比赛,感谢提供给我们一个提升自己的机会。我们是来自南开大学的Excavator团队(挖机联盟),本次比赛非常有幸能进入前10。
一、赛题任务
本次KPI异常检测比赛提供了某运营商的部分网元的KPI真实数据,根据历史一个月的异常标签数据,训练机器学习模型,智能预测后续一周内KPI中的异常。
评价函数为二分类中常用的F1-score:

二、数据初探
训练集数据仅有5列,分别是:
Ø kpi_id:表示某个KPI名称,本次共分为20个KPI_ID。
Ø start time、end time:采样间隔为1小时,用于指示当前KPI值的开始时间和结束时间。
Ø value:KPI值,本次KPI检测的关键数据,核心特征。
Ø label:标签值,指示kpi值是否异常。0为正常,1为异常。
除去ID列和标签列,仅有时间特征和kpi特征。其中最为关键的就是KPI值,通过KPI值的时序变化,来判别异常点。
根据上述分析,将本赛题归纳出几个关键字:时序类数据、原始特征较少、二分类问题。接下来我们进一步分析,发现两个问题:
1.通过绘制value值分布图发现,不同kpi_id的 value值分布截然不同:有的较为平稳,有的波动很大,且取值区间也相差很大。


2.通过对label列的value_counts()函数统计发现,0值较多,1值极少。0与1取值分布如下图所示,比值约为98.5:1.5,训练集数据极为不平衡。

第一时间想到的解决方案是:分ID训练不同模型,根据1/0比值划分阈值。
三、特征工程
时序类数据和时间强相关,上下联系紧密,首先想到的就是窗口特征和差分特征。
1.窗口特征:向上向下取一定数量的值(称为窗口),进行统计分析。可以使用Dataframe中rolling函数。
2.差分特征:时间移位作差,目的是观察时序变化。可以使用diff函数。
3.卡方分箱:将value值放缩并进行一个映射,便于模型理解。
四、解决方案:
常见的时序类模型会想到lstm等神经网络,但是其训练速度较慢,所以本次并未采用。本次采用数据挖掘比赛常用的Lightgbm模型,并结合数据规则进行综合评判。分ID思路如下:
1.稳定ID
一部分ID具有较稳定的value值,异常点即离群点。针对这个现象,我们根据折线图和散点图,找出这些稳定ID,设置一个KPI正常区间。区间之外的点为异常点,置为1。


2.不稳定ID
l 直接按照模型概率划分0,1
对于一部分不稳定ID,我们直接采用LGB模型预测,得到每个点是异常点的概率,再通过计算Train中0,1比例,得到概率划分基准点,再进行微调。划分阈值这里我们的方案如下:五折交叉验证后得到的训练集异常概率,遍历0.001到0.5之间阈值,计算训练集F1_score,得到最优的阈值list

l 经常会出现两个连续1的ID
有一部分ID的异常点经常是连续出现的(2个),根据这种情况,我们采用的方案是:
1)确定必然是异常的点(异常概率大,超过0.5)。
2)在异常点的上下寻找概率较大的点,也将其记作异常点。

l 模型概率加阈值划分
最后一类问题是我们最头疼的一类问题,某些谷底的值,因为下降过程非常平滑,模型有时不能判断其是否是异常,这种我们通过模型概率先找出异常点,再划分阈值来判断异常。

最终评分0.9403,线上排名第10,复核排名第9
五、总结
1. 首先分ID训练优化模型,对于较少ID的比赛(比如本次比赛)还可以,对于ID多的恐怕会相当复杂,所以还是很期待前排“1”佬们的方案。
2. 我们提供的方案主要还是单模,难免在最后阶段进入瓶颈期。后面还要更多考虑模型融合,发掘不同模型之间的优势,取长补短。
3. 特征挖掘思路较为常规,还需要进行更深入的挖掘,毕竟“特征为王”,挖到几个强特可能直接分数暴增。
4. 对于华为NAIE平台,刚开始使用的时候还是挺困难的,但是一天的摸索后,就一句话:NAIE真香。
----------------------------------------------------分割线---------------------------------------------------------
5. 对于赛制:没有B榜可能是唯一的槽点吧,全都朝着A棒拟合,模型泛化能力检测不够吧。有点慈善赛的味道(不是为了买代码)。
6. 希望下次还能有机会参加华为的比赛,和各路高手比拼。和GREAT再战300回合!
作者:派森挖掘机、爱撒谎的小超
