建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
温馨提示

抱歉,您需设置社区昵称后才能参与社区互动!

前往修改
我再想想

华为云大赛技术圈

话题 : 467 成员 : 405

加入HCSD

华为网络人工智能黑客松大赛二等奖方案分享

华为云大赛... 2020/11/28 1628

比赛页面:https://competition.huaweicloud.com/information/1000029328/introduction?track=111

作者:原子弹从入门到精通


HDC2020网络人工智能黑客松大赛告一段落,来自深圳福田莲花街道的原子弹从入门到精通同学(也就是我)最终果然没能逆袭成功,线上得分0.4488,排名第二,本文将给出我的赛题解析和方案介绍。


一、赛题介绍

赛题背景:华为数据中心服务器硬件故障中,硬盘故障占比高达48%。因此构建硬盘故障预测模型,提前感知硬件故障,对于降低数据中心的运维成本,提升业务体验均有着重要意义。

赛题数据:比赛提供2017,2018年硬盘最后一次检测前一个月的检测数据进行训练,对未来的硬盘检测数据进行线上预测,评估硬盘未来是否会损坏。

模型的开发需要在NAIE服务器中完成。其中训练数据集不可以从云端下载到本地,测试数据无法查看,模型建立完成后需将预测代码打包生成推理服务进行线上测试。

评价指标:本次比赛的评价指标如下:

FDR = TP/(TP+FN)

FAR = FP/(TN+FP)

SCORE = max(FDR)  s.t. FAR≤0.1%

二、指标分析

仔细观察评价指标可以发现,评价指标中的FAR,FDR其实就是AUC曲线中的FPR和TPR。那么把指标翻译成人话就是:在误报率≤千分之一的分数阈值下,坏硬盘的召回率。

虽然score与AUC息息相关,但是直接使用AUC作为建模阶段的评价指标会存在一些问题。图1的两个模型从AUC的角度来说显然是model2显著优于model1,然而本题的score是在FPR<0.1%下的max(TPR),也就是图中红色框框这个范围,因此虽然model2的AUC大很多,但是model2的score仅有0.21,而model1的score却有0.42。

image.png

基于以上分析,在建模的过程中需要针对本题建立一个专属的评价指标,我使用的是LightGBM,建立评价函数my_score_,在调用模型的时候将my_score_传给lgb.train的参数f即可。

image.png


三、目标分析

由于本题线上仅需对每块硬盘的最后一条记录进行预测,因此我的分析也会以最后一条记录为主。首先看一下每个月坏硬盘的分布情况。从图3中我们可以很清楚的看到坏硬盘的数目随着时间的推进呈现震荡下降的趋势。原因可能是华为数据中心在不断优化或坏硬盘的损坏类型在发生变化,这我们不得而知。

image.png

我们能拿到的是2017年和2018年的坏样本,而线上需要预测的是2019年的坏样本。既然坏样本的分布随着时间逐渐变化,在无法对2019年数据进行分析的情形下,基于图3的趋势,我倾向于相信2019年坏样本的分布与2018年下半年最为接近。因此在建模的时候我选择直接舍弃早期坏样本,把目光集中在2018年下半年,尤其是2018年8月后,因为这段时间的曲线最为平稳。

四、数据分析与建模

由于训练集中仅有每块样本前30天的记录,而样本变为坏样本后便不再有记录,因此,数据中好样本都集中在2018年12月而坏样本大多在2018年11月之前,如果把时间作为入模变量进行建模,就能在训练集完美区分好坏样本——12月没了记录的就是坏样本,但这显然是过拟合。由于没有2018年11月前的好样本数据,因此这个比赛存在超级难点,即如何判断模型是在识别好坏样本而不是在识别时间的远近。

更雪上加霜的是硬盘自身的相关属性本身就会随着时间的增长而改变,如smart9累计通电时间(图4),smart241写入总数/写入剩余寿命(图5),等等。训练集中某变量的有效范围[a,b]在测试集中可能已经偏移到[a+c,b+c],而c是多少,我们并不知道。


image.png

image.png

图6是硬盘的写入总数smart_241_raw在好坏样本上的分布,从图6的好坏样本密度图中我们可以看到在训练集中smart_241_raw这个变量有着非常强的区分能力,写入总数越少的样本坏的比率越高,或者说剩余寿命越长的样本坏的比率越高。但是从业务的角度来说显然剩余寿命越长损坏的几率越小,然而由于数据分布的原因,好样本记录的时间节点比坏样本多了那么一两年,导致分析的结果恰恰相反,得出了剩余寿命越长损坏的几率越大这种结论。这其实是一种不公平比较,好坏样本没能也无法在同一时间切片上进行比较,将这种数据直接扔进模型进行训练,就会造成严重的过拟合,很多同学线上分数无法突破0.1主要就是这个原因。

image.png


为了解决这个问题,我尝试了很多方法:

  1. 与时间相关的变量除以通电时间进行标准化处理:

尝试将时间相关的变量除以通电时间,即将变量标准化为平均每单位时间,这种操作确实能使得分布看起来比较平滑,但这个操作不仅消除了时间的影响,也消除了大量有效信息,未能带来有效的提升。

  1. 对所有数据进行归一化处理,但每个数据集仅使用该数据集本身的统计指标进行归一化,比如训练集中变量A的最大值是56而测试集中变量A的最大值是321,那么在训练集中将56设置为1,而在测试集中将321设置为1:

理论上树模型仅基于数据的rank,无需做数据的标准化处理,但是在当前赛题下,2018年变量的范围是[a,b],而2019年变量的范围却是[a+c,b+c],两个数据集的取值并不是等价关系,而我希望2019年的b+c等同于2018年的b,因此我想到对2018年和2019年的数据分别做标准化处理,考虑到2019年的标准化可能涉及数据穿越的问题,即20190101的标准化是[20190101,20190120]的数据做出来的,对20190101数据进行标准化的过程中使用到了未来的数据,因此我又考虑每日标准化,即20190101的标准化仅使用当天数据,20190102的标准化也仅使用那一天的数据,以此类推,但一通操作后我发现推理服务中的预测是将测试集数据切分成73份的,所以该想法并不能很好的实现,不过做了这个与所想不符的操作也没有掉分,属实比较奇怪。虽然该操作在NAIE上没能实现,但是我觉得这个操作很骚且疑似很强,不知道隔壁阿里赛道有没有同学使用类似的方法;

  1. 尽量使用滑窗统计,差分等相对平稳的变量:

由于推理服务中有10分钟的限制,并且我在推理服务的predict中使用并行总是无响应,为了避免超时,我最终上线的代码仅开了3,7,15天的窗口。此处仅举例均值滑窗统计及差分的代码,其他统计指标如std,skew,kurt等可直接替换修改:

image.png


  1. 使用无监督模型;

经测试,在这道题中使用无监督异常检测算法iForest有着良好的效果,无监督单模型线上分数接近0.4,已经到达奖牌区,无监督的入模变量我选择了对2018年四个季度的坏样本都有效的变量,即使用LightGBM分别对四个季度的坏样本进行训练,取四个集合中都有效的变量作为无监督模型的入模变量。

做完以上分析与操作后,把建模样本限制在2018年下半年,线上分数0.3,调整模型参数后线上分数0.3x,进入奖牌区;

将样本范围限制在2018年8月及以后,同时将坏样本的倒数第二条记录也作为坏样本加入训练集(一边降低坏样本数,一边增大坏样本数),线上分数提升至0.41,持续一周TOP1后被超越,模型融合后线上分数0.43,短暂TOP1,最终TOP2;

直接使用无监督的结果,线上分数接近0.4,无监督单模进入奖牌区,逼近奖金区;

无监督做规则模型,结合有监督最强单模,线上分数0.4488,最终TOP2;

五、总结

这次比赛让我思考了很多以前没有考虑过的问题,对我日常的工作学习还是很有帮助的,但过程中仍有很多不足的地方:

  1. 我平时经常把无监督的输出作为有监督的入模变量使用,在这题一开始我也是这样操作,但是没有显著的效果,直到最后一天晚上黔驴技穷了才开始尝试无监督直接作为输出结果使用,没想到效果这么好,导致我既没做相关调优,也没做阈值调整,感觉无监督这一块还有很大的开发空间;

  2. 直到最后我也没能很好的处理变量时间泄露和变量真实效果之间的问题,可能TOP1大佬raw变量除normalized变量的骚操作才是关键吧,不过我觉得大佬上分的核心应该是基于这个衍生变量的统计变量,而不是这个变量本身。

六、吐槽

1. 本题中训练集的date_g是str格式,而线上测试数据是datetime格式,导致同样的代码在predict的时候总是出错,刚上手NAIE的我debug到脑壳疼;


七、鸣谢

非常感谢小爱姐,希旭哥,诸葛亮等各位老板在参赛过程中给予的帮助与解答,尤其是希旭哥和小爱姐,总是能够及时地答疑解惑。

最后祝华为及NAIE越来越好,向下扎到根,向上捅破天!


来源:网络人工智能园地
链接:https://zhuanlan.zhihu.com/p/131275558




回复 (0)

没有评论
上划加载中
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

华为云大赛小助手

角色:成员

话题:136

发消息
更新于2020年11月28日 10:13:51 16280
直达本楼层的链接
楼主
正序浏览 只看该作者
[参赛经验分享] 华为网络人工智能黑客松大赛二等奖方案分享

比赛页面:https://competition.huaweicloud.com/information/1000029328/introduction?track=111

作者:原子弹从入门到精通


HDC2020网络人工智能黑客松大赛告一段落,来自深圳福田莲花街道的原子弹从入门到精通同学(也就是我)最终果然没能逆袭成功,线上得分0.4488,排名第二,本文将给出我的赛题解析和方案介绍。


一、赛题介绍

赛题背景:华为数据中心服务器硬件故障中,硬盘故障占比高达48%。因此构建硬盘故障预测模型,提前感知硬件故障,对于降低数据中心的运维成本,提升业务体验均有着重要意义。

赛题数据:比赛提供2017,2018年硬盘最后一次检测前一个月的检测数据进行训练,对未来的硬盘检测数据进行线上预测,评估硬盘未来是否会损坏。

模型的开发需要在NAIE服务器中完成。其中训练数据集不可以从云端下载到本地,测试数据无法查看,模型建立完成后需将预测代码打包生成推理服务进行线上测试。

评价指标:本次比赛的评价指标如下:

FDR = TP/(TP+FN)

FAR = FP/(TN+FP)

SCORE = max(FDR)  s.t. FAR≤0.1%

二、指标分析

仔细观察评价指标可以发现,评价指标中的FAR,FDR其实就是AUC曲线中的FPR和TPR。那么把指标翻译成人话就是:在误报率≤千分之一的分数阈值下,坏硬盘的召回率。

虽然score与AUC息息相关,但是直接使用AUC作为建模阶段的评价指标会存在一些问题。图1的两个模型从AUC的角度来说显然是model2显著优于model1,然而本题的score是在FPR<0.1%下的max(TPR),也就是图中红色框框这个范围,因此虽然model2的AUC大很多,但是model2的score仅有0.21,而model1的score却有0.42。

image.png

基于以上分析,在建模的过程中需要针对本题建立一个专属的评价指标,我使用的是LightGBM,建立评价函数my_score_,在调用模型的时候将my_score_传给lgb.train的参数f即可。

image.png


三、目标分析

由于本题线上仅需对每块硬盘的最后一条记录进行预测,因此我的分析也会以最后一条记录为主。首先看一下每个月坏硬盘的分布情况。从图3中我们可以很清楚的看到坏硬盘的数目随着时间的推进呈现震荡下降的趋势。原因可能是华为数据中心在不断优化或坏硬盘的损坏类型在发生变化,这我们不得而知。

image.png

我们能拿到的是2017年和2018年的坏样本,而线上需要预测的是2019年的坏样本。既然坏样本的分布随着时间逐渐变化,在无法对2019年数据进行分析的情形下,基于图3的趋势,我倾向于相信2019年坏样本的分布与2018年下半年最为接近。因此在建模的时候我选择直接舍弃早期坏样本,把目光集中在2018年下半年,尤其是2018年8月后,因为这段时间的曲线最为平稳。

四、数据分析与建模

由于训练集中仅有每块样本前30天的记录,而样本变为坏样本后便不再有记录,因此,数据中好样本都集中在2018年12月而坏样本大多在2018年11月之前,如果把时间作为入模变量进行建模,就能在训练集完美区分好坏样本——12月没了记录的就是坏样本,但这显然是过拟合。由于没有2018年11月前的好样本数据,因此这个比赛存在超级难点,即如何判断模型是在识别好坏样本而不是在识别时间的远近。

更雪上加霜的是硬盘自身的相关属性本身就会随着时间的增长而改变,如smart9累计通电时间(图4),smart241写入总数/写入剩余寿命(图5),等等。训练集中某变量的有效范围[a,b]在测试集中可能已经偏移到[a+c,b+c],而c是多少,我们并不知道。


image.png

image.png

图6是硬盘的写入总数smart_241_raw在好坏样本上的分布,从图6的好坏样本密度图中我们可以看到在训练集中smart_241_raw这个变量有着非常强的区分能力,写入总数越少的样本坏的比率越高,或者说剩余寿命越长的样本坏的比率越高。但是从业务的角度来说显然剩余寿命越长损坏的几率越小,然而由于数据分布的原因,好样本记录的时间节点比坏样本多了那么一两年,导致分析的结果恰恰相反,得出了剩余寿命越长损坏的几率越大这种结论。这其实是一种不公平比较,好坏样本没能也无法在同一时间切片上进行比较,将这种数据直接扔进模型进行训练,就会造成严重的过拟合,很多同学线上分数无法突破0.1主要就是这个原因。

image.png


为了解决这个问题,我尝试了很多方法:

  1. 与时间相关的变量除以通电时间进行标准化处理:

尝试将时间相关的变量除以通电时间,即将变量标准化为平均每单位时间,这种操作确实能使得分布看起来比较平滑,但这个操作不仅消除了时间的影响,也消除了大量有效信息,未能带来有效的提升。

  1. 对所有数据进行归一化处理,但每个数据集仅使用该数据集本身的统计指标进行归一化,比如训练集中变量A的最大值是56而测试集中变量A的最大值是321,那么在训练集中将56设置为1,而在测试集中将321设置为1:

理论上树模型仅基于数据的rank,无需做数据的标准化处理,但是在当前赛题下,2018年变量的范围是[a,b],而2019年变量的范围却是[a+c,b+c],两个数据集的取值并不是等价关系,而我希望2019年的b+c等同于2018年的b,因此我想到对2018年和2019年的数据分别做标准化处理,考虑到2019年的标准化可能涉及数据穿越的问题,即20190101的标准化是[20190101,20190120]的数据做出来的,对20190101数据进行标准化的过程中使用到了未来的数据,因此我又考虑每日标准化,即20190101的标准化仅使用当天数据,20190102的标准化也仅使用那一天的数据,以此类推,但一通操作后我发现推理服务中的预测是将测试集数据切分成73份的,所以该想法并不能很好的实现,不过做了这个与所想不符的操作也没有掉分,属实比较奇怪。虽然该操作在NAIE上没能实现,但是我觉得这个操作很骚且疑似很强,不知道隔壁阿里赛道有没有同学使用类似的方法;

  1. 尽量使用滑窗统计,差分等相对平稳的变量:

由于推理服务中有10分钟的限制,并且我在推理服务的predict中使用并行总是无响应,为了避免超时,我最终上线的代码仅开了3,7,15天的窗口。此处仅举例均值滑窗统计及差分的代码,其他统计指标如std,skew,kurt等可直接替换修改:

image.png


  1. 使用无监督模型;

经测试,在这道题中使用无监督异常检测算法iForest有着良好的效果,无监督单模型线上分数接近0.4,已经到达奖牌区,无监督的入模变量我选择了对2018年四个季度的坏样本都有效的变量,即使用LightGBM分别对四个季度的坏样本进行训练,取四个集合中都有效的变量作为无监督模型的入模变量。

做完以上分析与操作后,把建模样本限制在2018年下半年,线上分数0.3,调整模型参数后线上分数0.3x,进入奖牌区;

将样本范围限制在2018年8月及以后,同时将坏样本的倒数第二条记录也作为坏样本加入训练集(一边降低坏样本数,一边增大坏样本数),线上分数提升至0.41,持续一周TOP1后被超越,模型融合后线上分数0.43,短暂TOP1,最终TOP2;

直接使用无监督的结果,线上分数接近0.4,无监督单模进入奖牌区,逼近奖金区;

无监督做规则模型,结合有监督最强单模,线上分数0.4488,最终TOP2;

五、总结

这次比赛让我思考了很多以前没有考虑过的问题,对我日常的工作学习还是很有帮助的,但过程中仍有很多不足的地方:

  1. 我平时经常把无监督的输出作为有监督的入模变量使用,在这题一开始我也是这样操作,但是没有显著的效果,直到最后一天晚上黔驴技穷了才开始尝试无监督直接作为输出结果使用,没想到效果这么好,导致我既没做相关调优,也没做阈值调整,感觉无监督这一块还有很大的开发空间;

  2. 直到最后我也没能很好的处理变量时间泄露和变量真实效果之间的问题,可能TOP1大佬raw变量除normalized变量的骚操作才是关键吧,不过我觉得大佬上分的核心应该是基于这个衍生变量的统计变量,而不是这个变量本身。

六、吐槽

1. 本题中训练集的date_g是str格式,而线上测试数据是datetime格式,导致同样的代码在predict的时候总是出错,刚上手NAIE的我debug到脑壳疼;


七、鸣谢

非常感谢小爱姐,希旭哥,诸葛亮等各位老板在参赛过程中给予的帮助与解答,尤其是希旭哥和小爱姐,总是能够及时地答疑解惑。

最后祝华为及NAIE越来越好,向下扎到根,向上捅破天!


来源:网络人工智能园地
链接:https://zhuanlan.zhihu.com/p/131275558




点赞 举报
分享

分享文章到朋友圈

分享文章到微博

游客

您需要登录后才可以回帖 登录 | 立即注册