竞赛复盘2022雪浪算力开发者大赛——阀体异常检测
Posted zadarmo_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了竞赛复盘2022雪浪算力开发者大赛——阀体异常检测相关的知识,希望对你有一定的参考价值。
作者简介:重庆大学22级研一,研究方向:时空数据挖掘、图神经网络。目前正在学习大数据、数据挖掘等相关知识,希望毕业后能找到数据相关岗位。
0. 前言
历时一个月,采用的是单模单折的方式,最后排名大概是56/263(emmm太菜了)。最后几天的时候,考试和比赛时间冲突了,就没怎么弄了。。。
第一次打比赛,还有很多要学习的,继续努力!
1. 赛题基本信息
链接:https://www.xuelangyun.com/#/sign-up-statistics
赛题类型:时间序列、二分类、异常检测
赛题部分原文:
阀体总成装配在变速器装配过程中十分重要,通过生产系统数据采集以及异常监控功能,可以使整线生产情况一目了然,在检测台进行产品是否合格的最终检测,以提高产品的出厂质量。目前已知,若因检测台漏检,不良品误流入市场,返修成本会是生产成本的二倍以上,因此企业十分重视产品合格率和检测台正确率。
题目大意:
给两个文件夹,分别表示正常样本(OK)和异常样本(NG)。其中单个文件夹的目录结构为:
OK
station
sensor
sample1.csv
sample2.csv
...
NG
station
sensor
sample1.csv
sample2.csv
...
每个(station, sensor)
二元组表示一个特征,共401个特征。其中sample.csv
是一个时序数据,只有一列。
最终要求用 <= 50个特征(不包含衍生特征,只是指(station, sensor)
二元组的个数)进行建模,对阀体进行异常检测。成绩按F1
排名。
2. 题目分析
题目的重点在于异常检测,由于阀体的某些特征存在异常,或者它们的组合存在异常,导致阀体存在异常。
而题目中的异常存在两种情况:
- 在装配过程中出现了异常,检测到异常后直接丢弃了(这样会导致后面的特征没有)
- 在装配过程中没出现了问题,装配完成后,阀体流入市场发现了问题(没有被系统检测出来的异常)
比赛方在比赛过程中也明确说明了线上的数据两种情况都有。这种数据集会直接影响两个方面:
- 特征构造:由于两种样本都有,所以特征缺失不能算一个强有力的特征。
- 缺失值填充:一个合理的填充方案应该是让线下数据和线上数据分布基本保持一致。如果不一致,很容易导致过拟合
3. 思路
第一次比赛没什么思路,我就采用了Datawhale的baseline。(视频讲解:https://www.bilibili.com/video/BV14y4y1R77Q/?spm_id_from=333.999.0.0&vd_source=db5dfeeee832a7c78a0c81ef51eeafef)
代码的基本步骤如下:
- 特征提取:计算每个样本一个特征下的衍生特征,得到一个总的表(我个人觉得这样方便后续操作)
- 缺失值填充:由于有些阀体某些特征没有,所以会存在缺失值
- 特征选择:题目要求<=50个特征
- 模型训练:选择一个二分类模型进行训练
在搭好了基本的baseline之后,我就开始尝试进行改进了。
3.1 第一阶段:学习没有用过的方法
在这个阶段,我把我查到的常用的一些方法都试了一遍,其中包括:
- 缺失值填充:正太分布、平均值、中位数、众数、向前填充、向后填充、插值填充、-1、不填充
- 特征选择:方差、互信息、lightgbm的重要性、方差+lightgbm(结果和只用lightgbm没什么区别,猜测先用方差过滤可以加快lightgbm特征选择的速度,没实验)
- 模型训练:随机森林、GDBT、决策树、KNN、SVM、逻辑回归、xgb、lightgbm、catboost(都没有调参)
然后每次都是选择了一个线下效果最好的作为当前最优方案。
3.2 第二阶段:开始无脑堆特征
之前就了解到,数据挖掘比赛中特征很重要。所以在学习完之后,我开始查相关资料,找时序数据有哪些可以构造的特征。其中包括:
- 基本统计特征:最大值、最小值、平均值、中位数、众数、方差、标准差、极差、均方根、最大值个数、最小值个数、最大值与最小值之差、最大值与均值的差、波峰个数
- 分布特征:25百分位数、50百分位数、75百分位数、峰度、偏度
- 一阶差分特征:平均值、中位数、众数、平均值的和、平均值的中位数
- 异常相关特征:箱线图异常点个数、箱线图异常点比例
结果证明,比赛的时候确实有点陷到无脑对特征这个想法里去了。(最后是堆了20多个衍生特征,线上分数在75上不去了)(特征不在于多,强特才是王道!)
另外,这个题是异常检测的题目,应该多考虑异常相关特征的。
3.3 第三阶段:EDA
堆特征无果,我开始尝试EDA了。我的做法是正负样本各取20个,查看同一个衍生特征的分布。看了几个特征都一样,只有箱线图异常点这个特征稍微有点区别,其他的基本都一样,我怀疑是我自己的问题就没有深入了。(赛后讨论发现是自己做的不够深入,多做几个就能看出区别)
这一部分应该是最重要的,但是我只做了一点点,这也是导致我分数上不去的一个主要原因。
4. 提分较大方案
4.1 25分-50分
关键词:过拟合、xgb与随机森林的区别
- 衍生特征:最大值、最小值、均值、标准差、极差、一阶差分平均值、一阶差分绝对值的平均值、一阶差分绝对值的中位数、一阶差分绝对值的和、最大值最小值之差
- 缺失值填充:取所有样本的正态分布进行填充
- 特征性选择:lightgbm重要性筛选
- 模型:由xgb改成了随机森林
猜测提分原因(参考:贝叶斯优化在XGBoost及随机森林中的使用):xgboost是按顺序构造多个树模型,模型之间会相互影响;而随机森林是独立训练每棵树,使得整个森林的结果比单个模型结果更健壮。所以随机森林比xgboost更不容易过拟合。而我的特征构造的比较多,过多的特征干扰了模型的训练,导致xgb出现了过拟合,所以随机森林线上结果更优。但是由于特征太多,且没有强特,所以分数还是很低。
当然一般来说,还是xgb性能更好,前提是要调参,我这里是没有调参的。(参考:Random Forest 比 XGBoost 效果更好的原因可能有哪些?)
4.2 50分-69分
关键词:样本分布不一致
把缺失值填充由正态分布填充改成了用dataframe的pad方法填充。
猜测提分原因:正太分布、平均值、中位数、众数填充这些方法都用到的是所有样本的信息,正常样本的分布干扰了异常样本的分布,导致异常样本填充之后模型可能会认错。而pad填充用到的是相邻样本的信息,也就是说异常样本只会用到异常样本的特征,所以效果相对好一点。
我赛后觉得,合理的填充方式应该是让线下的样本和线上的样本分布一样,即:异常样本中留一部分不填充,让它缺失;另一部分用正常样本的值进行填充。这样两种异常样本都会有,可能效果会更好。(没实验过)
5. 前排方案分析
我觉得我与前排的差距主要在于:
- 最大的区别就是分析不够深入,浅尝辄止
- 对于业务理解不够深入,没有从业务的角度去思考该如何构造特征
- 理论知识不够扎实,有很多没有学习过的方法
5.1 20名方案
链接:https://uoe9mhgegk.feishu.cn/docx/QrdGdtLuPoka2gxwW4Mc4cZlnmf
亮点:
- EDA分析很深入,针对不同类型的样本分析了不同的衍生特征分布
- 有创新,采用了无监督学习聚类,利用聚类的结果作为特征
6. 项目产出
dataframe
常用的方法:https://github.com/zadarmo/learning-ml/blob/main/pd_libs.py(这里也包括我之前做项目用到的)- 这篇文章
7. 总结与反思
比赛经验:
- 参加比赛跑通baseline很重要,直接决定了自己的比赛心态
- 缺失值填充要保证线上线下数据分布尽量一致
- 不要一味地堆特征,多做EDA,用EDA的结论来驱动衍生特征的构造
- 模型参数要理解,必要的时候对参数进行调整有利于得到较优的结果
- xgb和lightgbm一般来说是最优的,前提是要调参
- 实验很重要,有了理论 + 想法之后,一定要做实验证实或证伪自己的想法,通过结果推动新的想法的产生
- 实验过程最好详细地记录下来:什么想法催生了这个实验、改动了什么、结果是什么、和之前结果有什么区别、为什么会有这个区别。这样方便后期进行复盘
- 每次实验改动最好只改一个部分,控制变量,好分析方法的有效性
- 要有用于创新,尝试大家没有试过的方法,如果方法有效说不定就能冲进前排
- 方法没有绝对正确和绝对错误,只要有想法,并且合理,就尝试开展实验,用结果说话
8. 努力与改进方向
- 基础
- 常用树模型的优缺点,参数的含义
- 如何较为全面地做EDA,找一些教程深度研究一下
- 模型融合如何做(这次没有用到模型融合)
- 实战
- 多参加比赛,多和他人交流
- 没有时间的话可以学一学公众号开源的比赛教程
9. 写在最后
非常感谢雪浪云、Datawhale的baseline,以及zy、zs、as、fg、hh等各位大佬传授的经验,大家都太厉害啦!
需要交流的话,可以加微信:18171091491。共同进步!
以上是关于竞赛复盘2022雪浪算力开发者大赛——阀体异常检测的主要内容,如果未能解决你的问题,请参考以下文章