前言
最近和实验室的同学一起参加了pakdd2020硬盘故障预测比赛。初赛A组第3名,B组第13名,复赛第17名。最后的成绩是35.94(没有突破36分,有点伤心)。实现目标,但仍要记录下来,以便日后复习和学习,与大家学习交流。
结果截图:


一、赛题任务
根据硬盘SMART日志数据(SMART参数详解SMART硬盘检测参数详解_运维_bemyself24-CSDNblog),预测30天内硬盘是否会出现故障。
比赛数据:提供硬盘SMART日志数据,根据硬盘类型分为1组和2组数据。时间201707~201807,测试集A列表只预测1,时间为201808,B列表预测2,时间为201808,半决赛预测1和2,时间为201809。
评价指标:


注:评价指标为F1分数,但与一般的F1分数不同,主要是TP(True Positive)的计算方法。这需要结合实际业务来理解。对这块的理解也有点模糊,所以不敢多写了(我的理解是把它们当成同一个值)。如果哪位大佬对此有更清楚的解释,请留言与我们分享。

抽象建模:将问题建模为二类问题。
二、数据集构建
1、单个样本的定义:一条SMART日志记录对应一个标签,作为一个样本;
2、Positive 样本定义:故障硬盘前10天的SMART日志都标记为正样本。但是在分析过程中,我们发现故障硬盘出现故障后一天会输出SMART日志。比如一个硬盘20180601故障,但是20180602有SMART日志,大部分故障硬盘都有这种情况。仍然有少数故障硬盘在故障后会有n天(n>1))的SMART日志。结合实际业务,这种情况应该是硬盘坏了,但是对输出SMART没有影响。因为硬盘故障级别分为几种 有七种类型(包括题中的0到6)。对于失败后一天的样本,我们仍将其定义为正样本。而且,通过对比,我们发现加入这部分正样本会有很大的提升。从结果上看,这部分正样本的特征应该很明显,对模型的学习很有帮助。
3、negative 样本定义:在SMART日志中,除正样本外,其他都标记为负样本。在实际过程中,我们发现删除故障硬盘的负样本对提高分数是有效的,而且提升还是比较大的。从业务角度来看,有可能硬盘的SMART参数特性会在硬盘坏掉之前(30天以上)发生变化。这时候,如果被标记为负样本,就相当于加入了噪声。
4、离线验证集时间窗口为201806,其对应的训练集为201806之前的数据,但应删除2018年5月(模拟真实情况)的负样本;
5、Online 训练集时间窗为201807之前的数据,同理删除201807的负样本(因为不知道201808的故障硬盘标签)。
数据集构建中有用的上限(适用于亲测)
1、Data Set只使用了201801-201806的数据,删除了2017年的数据,从结果分析来看,应该是2017年和2018年的特征还是有区别的。
2、正负样本比例为1:200,负样本采用月分层抽样方式。
三、特征工程
1、Feature筛选:主要是根据空值率,是否为相同值并结合测试集进行筛选。比如训练集中的特征有值,分布很均匀,而测试集中的特征是空的。类特征也应该删除。

2、Feature Engineering:主要用一天的差值,即当前值-前一天的值。
data = data.groupby(["manufacturer", "model", "serial_number"], as_index=False).fillna(method="ffill")
moving_fea_col = ["smart_7raw", "smart_5raw", "smart_193raw", "smart_188raw",
"smart_190raw", "smart_197raw", "smart_189raw", "smart_192raw", "smart_187raw"]
moving_fea = data.groupby(["manufacturer", "model", "serial_number"])[moving_fea_col].apply(lambda df: df - df.shift(1))
moving_fea.columns = [col+"_diff_1day" for col in moving_fea.columns]
data = pd.concat([data, moving_fea], axis=1)同时基于华为网络人工智能黑客马拉松大赛的灵感|一等奖方案分享,我们也尝试过用归一化的特征来划分raw,下面称为划分特征,但是效果不是很明显。不过也贴出代码,大家一起学习
###
index_fea_col = [1,4,5,7,9, 12, 184, 187, 188, 189, 190,191,192, 193, 194, 195, 197, 198, 199]
#index_fea_col = [191, 7, ]
division_fea_col = ["division{}".format(i) for i in index_fea_col]
division_fea = data.groupby(["manufacturer", "model", "serial_number"])[division_fea_col].apply(
lambda df: df.rolling(20, min_periods=5).mean())
division_fea.columns = [col + "_mean" for col in division_fea.columns]
data = pd.concat([data, division_fea], axis=1)
division_fea = data.groupby(["manufacturer", "model", "serial_number"])[division_fea_col].apply(
lambda df: df.rolling(20, min_periods=5).max())
division_fea.columns = [col + "_max" for col in division_fea.columns]
data = pd.concat([data, division_fea], axis=1)
division_fea = data.groupby(["manufacturer", "model", "serial_number"])[division_fea_col].apply(
lambda df: df.rolling(20, min_periods=5).min())
division_fea.columns = [col + "_min" for col in division_fea.columns]
data = pd.concat([data, division_fea], axis=1)
for c in division_fea_col:
data["{}_max_min".format(c)] = data["{}_max".format(c)] - data["{}_min".format(c)]
data["{}_max_mean".format(c)] = data["{}_max".format(c)] - data["{}_mean".format(c)]
data["{}_mean_min".format(c)] = data["{}_mean".format(c)] - data["{}_min".format(c)]
###四、模型
Lightgbm 主要用于代替模型融合。我觉得如果你做模型融合,你应该可以多做一点。 Kfold + 不同的随机,想法,仅供参考。
clf = LGBMClassifier(
learning_rate=0.001,
n_estimators=n_estimators,
num_leaves=127, # 20, max_depth:5
subsample=0.8,
colsample_bytree=0.8,
random_state=2019,
#scale_pos_weight=50,
metric=None
)五、华为硬盘损坏检测顶级程序总结
同期PAKDD2020比赛,隔壁华为也玩过同样的问题。楼主还看了上面的解决方案,记录下来。
1、冠军节目:冠军节目最抢眼的特点就是构造了划分特征,将原始值除以归一化值,然后用相应的方法选出最优特征子集(xgb ,lgb 特征重要性,对比实验),后来使用不同的随机和交叉验证进行模型融合。但是我对PAKDD数据进行了实验,发现除法特征基本没有效果。应该是华为和阿里的硬盘特性不同造成的。不过这也体现了冠军选手的数据分析和特征工程能力,我很佩服。
2、亚军节目:亚军节目最抢眼的特点是使用了有监督(lightgbm)和无监督模型(iForest)的融合,以无监督结果为规则,然后制作了一个直接有监督的并行模型。还有更强大的数据分析,得出华为硬盘运维在不断优化的结论,所以只选取最近6个月的样本进行训练。不要低估这一点。这是游戏中非常重要的地方。它可能是你与 50% 甚至 80% 的人分离的地方。
有关顶级计划的链接,请参阅文章末尾。

五、赛后总结
我应该在前后两个月参加这个比赛。算是花了很多心思。如果达到最后的结果,就达到了最低的目标(在首页,top20)。虽然PAKDD没有KDD级别高),但无论如何也是一个不错的会议。它应该被归类为B类(我还没有检查过细节)。反正我从头到尾都没有想过放弃,也算是坚持到最后。一些想法:
1、 进入比赛后,第一步一定是EDA,即数据探索。可以更简单,但是这一步必须要做。如果简单的话,就是统计数据量和正负样本的比例。 、空值、特征分布、均值、最大值最小值、方差等统计。这一步用到的工具一般有pandas、seaborn、matplotlib
2、一定要懂业务,这个可能很笼统,具体深度看个人能力和水平;
3、 关注特征,关注模型:更快的方法必须是构建强大的特征。在模型方面,模型融合可以作为最后的杀手锏。点数肯定没问题。
总之,我还是很佩服前排的大佬们,尤其是那些经常拿奖,拿到顶尖成绩的大佬们,因为参加比赛确实需要很多时间和精力。毅力需要很大的毅力和兴趣。 参加比赛确实能学到很多东西,无论是技术能力、编码能力、业务能力都能学到很多。
github 代码:/DJofOUC/PAKDD2020DiskFailurePredict_Rank17
华为网络人工智能黑客马拉松大赛-硬盘异常检测网址:/information/1000029328/introduction
华为冠军计划:/s/LEsJvrB4V3YyOAZP-PGLFA
华为亚军计划:/s/wEnZUwMgyBGtyzLz4tz_PQ
PAKDD 冠军计划:/s/g4BuGgLbnQ-UlGfaT54bXg
有什么想法可以留言讨论,大家一起进步。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/dianqi/article-380463-1.html
去雷军家买是不是也会遇到山寨雷军呢