小言_互联网的博客

【竞赛复盘】2022雪浪算力开发者大赛——阀体异常检测

230人阅读  评论(0)

作者简介:重庆大学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. 题目分析

题目的重点在于异常检测,由于阀体的某些特征存在异常,或者它们的组合存在异常,导致阀体存在异常。

而题目中的异常存在两种情况:

  1. 在装配过程中出现了异常,检测到异常后直接丢弃了(这样会导致后面的特征没有)
  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分析很深入,针对不同类型的样本分析了不同的衍生特征分布
  • 有创新,采用了无监督学习聚类,利用聚类的结果作为特征

5.2 嘴爷方案

链接:2023 雪浪云阀体检测低保84.61极简方案

嘴爷方案的特征非常简单,只有均值、中位数、方差这几个很常用的特征,但最终的分数仍然在前排(84.61),再一次验证了特征不是越多越好,less is better

其重点在于缺失值的处理。嘴爷文章原文如下:

在实际工况中,按传感器序号顺序,一旦某一组传感器检测到异常,则后续传感器都会不再检测,即测量值为空,训练集就存在这种规律。但为了避免选手通过这个规律进行预测,官方将测试集进行了调整,将正常样本也按照该规律进行了缺失处理。>

那么为了尽量保持训练集与测试集一致,直接人为对训练集进行缺失构造。只需要这一步,就可以从线上10~20分到线上80+。基于基础特征,衍生只做了均值,中位数,方差。

主要思路如下:

  • 用随机数r1确定是否进行缺失处理(概率阈值需要手动测试)
  • 用随机数r2确定缺失程度

亮点:将训练集按照一定规律也进行缺失,保证训练集和测试集尽可能一致。(据说这也是本题的上分点之一)

5.3 top1方案

top1采用了控制过程中的规格界限与控制界限的思想。(具体可以参考:SPC|如何理解规格界限与控制界限?

简单来说(不是专门学控制的,如有不对的地方还请大佬批评指正)

  • 规格界限是产品的质量限。如果产品的某个指标超出了它对应的规格界限,就说明产品质量可能有问题。规格界限上限称为usl、下限称为lsl,这两个限代表了产品的最低标准,是产品在生产之前就确定好的。
  • 控制界限是产品工序的质量限。如果产品在生产过程中,指标没有超出规格界限,但是超出了它应该属于的正常范围,那说明产品生产的工序可能有问题(举个例子,小明平常考试分数都是90-95的,突然某一次只考了88)。控制界限上限称为ucl、控制界限下限称为lcl。控制界限是根据产品在生产过程中测定的质量分布数据来确定的。

top1的方案就是把每个传感器特征的mean计算了一遍,取了一个最大值、最小值,把这个作为上下界(具体是哪种上下界不用纠结),然后计算样本的超限次数,把超限次数作为特征。

(至于为什么取mean,这个可能是试出来的吧。我没有深究,但是这个思想我觉得还是值得学习的。)

6. 项目产出

7. 总结与反思

比赛经验:

  • 参加比赛跑通baseline很重要,直接决定了自己的比赛心态
  • 缺失值处理要保证线上线下数据分布尽量一致
  • 不要一味地堆特征,多做EDA,用EDA的结论来驱动衍生特征的构造
  • 模型参数要理解,必要的时候对参数进行调整有利于得到较优的结果
  • xgb和lightgbm一般来说是最优的,前提是要调参
  • 实验很重要,有了理论 + 想法之后,一定要做实验证实或证伪自己的想法,通过结果推动新的想法的产生
  • 实验过程最好详细地记录下来:什么想法催生了这个实验、改动了什么、结果是什么、和之前结果有什么区别、为什么会有这个区别。这样方便后期进行复盘
  • 每次实验改动最好只改一个部分,控制变量,好分析方法的有效性
  • 要有用于创新,尝试大家没有试过的方法,如果方法有效说不定就能冲进前排
  • 方法没有绝对正确和绝对错误,只要有想法,并且合理,就尝试开展实验,用结果说话

8. 努力与改进方向

  • 基础
    • 常用树模型的优缺点,参数的含义
    • 如何较为全面地做EDA,找一些教程深度研究一下
    • 缺失值处理的重要性
    • 特征选择包括哪些方法,每种方法的优缺点
    • 模型融合如何做(这次没有用到模型融合)
  • 实战
    • 多参加比赛,多和他人交流
    • 没有时间的话可以学一学公众号开源的比赛教程

9. 写在最后

非常感谢雪浪云、Datawhale的baseline,以及zy、zs、as、fg、hh等各位大佬传授的经验,大家都太厉害啦!

需要交流的话,可以加微信:18171091491。共同进步!


转载:https://blog.csdn.net/destiny_balabala/article/details/129134509
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场