【经验分享】我的数据挖掘竞赛之路及秋招总结

作者 | 宇智波子光(cqlll.github.io)

学校 | 东南大学

研究 | 数据科学

出品 | AI蜗牛车

写在前面

大家好,我是一名机器学习爱好者。即便是这样简单的开头,不知为何,我仍有一种心潮澎湃的感觉(哈哈哈,感觉还是高中时候的作文范)。

简单介绍一下我的背景,本科211现985某振动中心研究生,秋招上岸华为算法岗,相比而言,其实现在自己还是很菜,但我很清楚自己loss的优化方向在哪里,在此和大家作些分享,希望我的经验和教训都可以成为你们的经验。

哈哈,先表达一下我对自己所修专业的尊重(手动捂脸)。本科新能源科学与工程(风力发电方向),硕士动力工程及热物理(故障诊断方向),我们能源专业也存在世界级千禧年大奖难题———纳维斯托克斯的存在性与光滑性(与P/NP问题并肩)。

高等传热学的老师曾说,世界上有两种人消失了,一种是死了,另一种则是研究湍流去了... ...或许,我是幸运的,因为我纯粹的爱好刚好能匹配上符合这个时代略微不错的工作待遇,从另一个角度,这也是雷军先生所说的“顺势而为”。但我依然坚信,在每个行业具有匠心一定能发光,现在对我们年轻人的要求越来越高,太多场景需要搞交叉学科的能力,所以和大家共勉。

2016-2017 我与机器学习结缘

由于本科阶段对数学建模比较感兴趣,这也成为了我接触并热爱计算机编程的契机。但是当时并没有意识到数据结构和算法如同基石般重要,只是在参赛过程中熟练了matlab(大三是我对matlab使用的巅峰时期)还有一些在教科书上用matlab实现的智能算法(诸如粒子群算法、鱼群算法),最后的收获是拿到一个省奖和对保研起一定作用的美赛一等奖(前10%)。

也是因为保研,在大三升大四的暑假,偶然的机会,老师在群里发了一条关于首届工业大数据创新大赛的消息,希望我和研究生学长组队参加,当时我热血沸腾(可能参加任何比赛都能打鸡血),但也是真·啥也不会。开始只能求助matlab,我记得很清楚,matlab 2015b 推出了类似机器学习app的模块,我在官网看了类似发布会的视频,其中大致讲解了用现有的机器学习模块对人体状态数据进行分类。

上述提到的赛题是风电齿形带断裂预测,出于对风机结构的了解,我尝试了将主成分分析用在变桨系统运行参数上,用matlab自带的高斯核SVM跑了有监督学习,但是当时连训练集、验证集以及测试集都分不清楚,最终比赛的收获只是增强了用matlab处理结构化数据的能力。

到了大四上学期,我开始真正接触机器学习,跟着Ng推导神经网络的反向传播算法,学习RNN及其一些变种(其实略偏深度学习),学习tensorflow......那段时间主要准备着和上次竞赛相关的毕设论文。

2018-2019 对数据竞赛狂热

真正开始科学投入数据挖掘竞赛是2018的上半年,当时在图书馆(我现在还记得自己坐在五楼的哪个位置上)偶然看到某公众号上的一篇基于人工智能的蛋白质药物分子亲和力预测的baseline。

现在看来那的确是一篇经典baseline,里面出现lighgbm,word2vec等等应用,他能将蛋白质序列采用词向量嵌入的方式把非结构化数据转化为结构化数据,代码简洁适合入门。那是第一次跑baseline提交结果查看成绩,并且尝试不断优化。

我记得自己做的比较有意义的工作是用numpy将蛋白质01字符串ID当成key,实现了pandas的groupby功能(当时并不会用pandas),然后进行ID近似缺失值填充,有一定的线上提升。后来和一位很好的朋友组了队,为了最后的上分,那时候晚上11点多睡,早上5点起来调参(手动捂脸),A榜调进了前十,哈哈,想必结局也能猜到了,B榜崩了,怒退15(由于参赛人数少已经很给之前辛苦调参面子了),所以我对过拟合的认知不是李航博士《统计学习方法》的第一章,而是这第一次shake。

最终,我和队友们拿到了一份电子版优胜奖,还是说不上的开心。

这次竞赛过后,我完成了毕业论文,可当时没有毕业的感觉。我总觉得一切才刚刚开始,之后开始看周志华先生的西瓜书,发现和李航先生的书一样,这些书最精妙绝伦的实际上是前几章,对假设空间的理解,经验风险、期望风险、结构风险的区别,熟悉各式各样的评测指标,方差、偏差......以及那句充满哲学意义的“no free lunch”,深感奥妙无穷。

在那之后,我又以个人和团队的形式参加了各式各样的比赛,按照时间线总结大致如下:

  • Datafountain消费金融场景下的用户购买预测(团队):花了一个晚上看了pandas的官方文档,熟悉了groupby、apply(lambda)、iloc和loc等操作,以及学习了stacking的原理,向队友的代码学习了stacking框架,最终top14。

  • Datafountain风机叶片开裂故障预警(个人):升级版调包pca(以前用matlab),熟悉了数据预处理,异常值剔除,缺失值填充等,开始尝试做简单的特征工程,最终top68。

  • Datafountain光伏电站人工智能运维大数据处理分析(个人):运用tensorflow搭建循环神经网络,对按照batchsize进行分批输入有一定的掌握,最终top121。

  • Datafountain基金间的相关性预测(个人):自己操作了一波皮尔森相关系数的特征工程,最后看到前排有用卷积神经网络处理这种一维序列问题,确实很有创意,最终top51。

  • Datacastle西南财经大学“新网银行杯”数据科学竞赛(团队):遇见了部分无标签的数据集,尝试了半监督的方案,最终top53。

  • Datacastle国能日新太阳辐射指数预测大赛和国能日新太阳辐射指数预测大赛(团队):第一次有接触到多目标回归,尝试过先预测某个目标以之为特征再预测另一个目标的方案,前者最终top3,后者最终top1。

  • Datacastle轴承故障检测训练赛(团队):运用tsfresh无脑提取特征,svm和lightgbm融合准确率可达百分之百。

  • 阿里天池津南数字制造算法挑战赛【赛场一】(团队):收集网上文献,猜测工艺流程并对可能相关的特征做探索性分析,最终top24。

  • Datafountain海上风场SCADA数据缺失智能修复(个人):数据时间线对齐后,运用各种trick,众数填充,均值填充,模型预测填充来修复数据,最终top11。

  • Datafountain面向电信行业存量用户的智能套餐个性化匹配模型(团队):一些列交叉特征工程,开始重视EDA,最终 top110。

  • 阿里天池全球城市计算AI挑战赛(团队):时空序列问题,集成树模型、lstm、CNN包括队友之间不同的特征工程,试了很多方案,最终亚军。

  • 华为digix极客大赛(团队):这次比赛认真学习了wide-deep框架,搭建了DeepFM,也试过做特征工程的方案,在百万级数据上深度学习的威力还是强于简单特征工程,最终top50。

未完待续......

在19年的暑假,我有幸参加Deecamp夏令营,认识了很多在机器学习深度学习领域搞不同方向的朋友以及一位设计小哥哥,在20多天的合作中,我们较好的完成了深度学习对抗攻击组的任务,获得南京区优胜奖和最终的最佳Demo奖。

  • 阿里天池安全AI挑战者计划第一期 - 人脸识别对抗(团队):运用Deecamp所学,我们借鉴了常用的攻击算法FGSM,亮点是准确模拟了线上的评分机制,也就是第一次把线上掌握在了自己手中,仅用cpu就跑到了top3。

  • DataFountain离散制造过程中典型工件的质量符合率预测(团队):比较细致化的EDA和预测方案设计,最终收获单赛题二等奖。

哈哈哈,我的竞赛电影放映到这里也接近2019年的尾声了,太多场景历历在目,上面所有的比赛有精力分配的不同,但总能找到一些闪光点让自己铭记。期间的收获不胜枚举,因为不同场景下的数据业务不同,没有人可以自称数据挖掘专家,而我的经验大多基于竞赛,那就给出自己关于竞赛的一些分享:

  1. print(len(["Always trust the cross-validation(cv)."]*3000)) 重要的事情说3000遍!很多小数据集比赛没有太肝的必要,做了一阵没找到稳定的线上线下就可以跑路摸奖了,多出去打球,身体还是很重要的!

    1. 除非真·啥也不会,否则不要看baseline!我何其有幸看见的第一份baseline是精妙绝伦的,其中最重要的是创意而有效的解决方案设计。很多时候去了解一个业务场景是多么的有趣,形成自己的想法方案是很酷的事情。

    1. 哈哈,当真正找到自己在该领域的兴趣所在就别打比赛了,沉迷科研,无法自拔才是最高境界!(参见Christopher Olah)

    2020

    下面要开始讲自己的一些教训了,因为今年的我已经研三了,面临秋招的我走得并不是很顺畅,即便19年末的时候我在AI独角兽实习过。

    这里面有行业背景的原因,在2019年末获得的信息很不充分,以至于在2020年的3月初我还在参加阿里天池的智慧海洋建设的比赛(即便最终收获了top9)。

    想必很多科班的同学知道现在想要找算法相关工作,各大公司要求都非常高,我缺少的正是刷题环节。先前看过很多秋招总结,在机器学习基础知识以及常见问题都总结的很全面了,在此不再赘述。

    我自己以前数据结构和算法接触的比较少,自学过操作系统概念系列,MIT的算法导论课也是今年年初看了特别重要的几章(动态规划和搜索),还是错过了今年大厂的实习(算法本身hc少,应该在2019年末就要开始准备)。就这样,四月份开始系统刷题的我比较吃亏,刚开始还很慢,后来有阵子可以一天刷十道题。因为周赛的前排都是ACM大佬,我喜欢用C++刷题,熟悉了STL的一些操作之后,可以跟上大佬们的步伐。

    今年leetcode春季赛,有幸和楼天城教主同场竞技(手动捂脸),虽然我只做出了一道签到题,第二题当时还不知道用二分法的极大极小,但是依然是不错的经历。

    在那之后,秋招开始,我笔试面试了阿里菜鸟网络、vivo提前批、趋势科技、中兴、远景智能还有华为技术有限公司,还有做过美团、京东、小米等公司的笔试,之前看见一位朋友说的很好,算法岗现在应该是“金七银八”了,尽管九月份美团小米京东的笔试做得还不错,后来到11月份接到的电话都是没有算法岗hc了。

    印象深刻的是在面试华为的时候面试官有问我,如果让你给一个完全不懂机器学习的人讲解,你会怎样给他介绍这门学问呢?这是很不常见的偏哲学类的问题,想必大家心里都有自己的答案,哈哈哈。最后,我简单总结几条有用的tips吧。

    • 可以事先准备牛客网的输入输出,自己线下构造成leetcode模式,可以随时本地测试,包括树和链表(我自己事先准备了一个Input.h,每次笔试直接贴,然后看输入样式是什么样,挑选成员函数);

    • Xgboost和lightgbm的问题趋势会越来越细致,建议仔细研究论文原文甚至是C++源码;

    • 关注最新模型研究进展,面试官很高兴能看到你在持续不断的学习。

    最后的最后,我在写论文的这段时间会整理之前做的一些数据挖掘的项目,欢迎大家关注我的博客cqlll.github.io(手动捂脸)。

你可能感兴趣的:(算法,编程语言,机器学习,人工智能,java)