作者简介:重庆大学22级研一,研究方向:时空数据挖掘、图神经网络。目前正在学习大数据、数据挖掘等相关知识,希望毕业后能找到数据相关岗位。
历时一个月,采用的是单模单折的方式,最后排名大概是56/263(emmm太菜了)。最后几天的时候,考试和比赛时间冲突了,就没怎么弄了。。。
第一次打比赛,还有很多要学习的,继续努力!
链接: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
排名。
题目的重点在于异常检测,由于阀体的某些特征存在异常,或者它们的组合存在异常,导致阀体存在异常。
而题目中的异常存在两种情况:
比赛方在比赛过程中也明确说明了线上的数据两种情况都有。这种数据集会直接影响两个方面:
第一次比赛没什么思路,我就采用了Datawhale的baseline。(视频讲解:https://www.bilibili.com/video/BV14y4y1R77Q/?spm_id_from=333.999.0.0&vd_source=db5dfeeee832a7c78a0c81ef51eeafef)
代码的基本步骤如下:
在搭好了基本的baseline之后,我就开始尝试进行改进了。
在这个阶段,我把我查到的常用的一些方法都试了一遍,其中包括:
然后每次都是选择了一个线下效果最好的作为当前最优方案。
参考资料:时间序列特征总结、时序数据中的特征工程(待续)、时序数据特征工程浅析
之前就了解到,数据挖掘比赛中特征很重要。所以在学习完之后,我开始查相关资料,找时序数据有哪些可以构造的特征。其中包括:
结果证明,比赛的时候确实有点陷到无脑对特征这个想法里去了。(最后是堆了20多个衍生特征,线上分数在75上不去了)(特征不在于多,强特才是王道!)
另外,这个题是异常检测的题目,应该多考虑异常相关特征的。
堆特征无果,我开始尝试EDA了。我的做法是正负样本各取20个,查看同一个衍生特征的分布。看了几个特征都一样,只有箱线图异常点这个特征稍微有点区别,其他的基本都一样,我怀疑是我自己的问题就没有深入了。(赛后讨论发现是自己做的不够深入,多做几个就能看出区别)
这一部分应该是最重要的,但是我只做了一点点,这也是导致我分数上不去的一个主要原因。
关键词:过拟合、xgb与随机森林的区别
猜测提分原因(参考:贝叶斯优化在XGBoost及随机森林中的使用):xgboost是按顺序构造多个树模型,模型之间会相互影响;而随机森林是独立训练每棵树,使得整个森林的结果比单个模型结果更健壮。所以随机森林比xgboost更不容易过拟合。而我的特征构造的比较多,过多的特征干扰了模型的训练,导致xgb出现了过拟合,所以随机森林线上结果更优。但是由于特征太多,且没有强特,所以分数还是很低。
当然一般来说,还是xgb性能更好,前提是要调参,我这里是没有调参的。(参考:Random Forest 比 XGBoost 效果更好的原因可能有哪些?)
关键词:样本分布不一致
把缺失值填充由正态分布填充改成了用dataframe的pad方法填充。
猜测提分原因:正太分布、平均值、中位数、众数填充这些方法都用到的是所有样本的信息,正常样本的分布干扰了异常样本的分布,导致异常样本填充之后模型可能会认错。而pad填充用到的是相邻样本的信息,也就是说异常样本只会用到异常样本的特征,所以效果相对好一点。
我赛后觉得,合理的填充方式应该是让线下的样本和线上的样本分布一样,即:异常样本中留一部分不填充,让它缺失;另一部分用正常样本的值进行填充。这样两种异常样本都会有,可能效果会更好。(没实验过)
我觉得我与前排的差距主要在于:
链接:https://uoe9mhgegk.feishu.cn/docx/QrdGdtLuPoka2gxwW4Mc4cZlnmf
亮点:
dataframe
常用的方法:https://github.com/zadarmo/learning-ml/blob/main/pd_libs.py(这里也包括我之前做项目用到的)比赛经验:
非常感谢雪浪云、Datawhale的baseline,以及zy、zs、as、fg、hh等各位大佬传授的经验,大家都太厉害啦!
需要交流的话,可以加微信:18171091491。共同进步!