2019腾讯算法大赛参赛感悟
今天的你如果不懂机器学习、不懂人工智能,也许很快就会被时代所淘汰。
参加腾讯算法大赛已经有一个月的时间了,这一个月里大葱哥体会颇多,既有心酸又有满满得收获感,在此和大家分享如下。
小白起步
大葱哥深深地感觉到了智能浪潮的冲击感,于今年2月底开始了机器学习领域的自学之路,期间我看了一部分吴恩达教授主讲的机器学习视频、看了tensorflow官方教程的mnist数据集案例并跟着案例写了一遍代码、拜读了大师级人物的《终极算法》纸质书,还结合自己擅长的Java语言,实现了一遍mnist的神经网络。当然还下载了不少的电子书比如西瓜书、花书等,但因为时间关系还没有学习。
以上算是自己在机器学习领域的储备了,属于典型的小白起步阶段。
"误入"赛区
一次偶然的机会,我得知了腾讯算法大赛的消息,于是到官网查看了相关信息,基于大葱哥对机器学习的浅薄认知,当即决定借这个机会练手,当时大葱哥幼稚的认为“比赛不就是把数据交给模型训练,然后调整模型参数看结果准确度,结果理想了就可以预测嘛”。
"一入候门深似海"
经过一段焦急、兴奋的等待,迎来了官方的正式开赛,在下载完数据后大葱哥傻眼了,训练集在哪里呢?没有训练集我怎么训练模型啊?经过详细阅读官方的相关文档,大葱哥终于明白了,理想是丰满的现实是骨感的,训练集需要自己构造,算你狠!
打开测试集文件,大葱哥又懵了,怎么这么多id字段呢?mnist可都是数值呀,这些id神经网络怎么消化呢?然后我看到了投放时间、定向人群两个字段,这两个字段的值是分隔符分割的一串字符,这类数据神经网络又该怎么处理呢?
这和自己对机器学习的认知差距太大了,和自己看的示例完全不一样,我甚至开始“怀疑人生”了,原来机器学习这么难呢!
万事开头难
兵来将挡水来土掩,有困难我们就解决困难,没有困难我们制造困难也要上,这才是大葱哥的风格。
既然一头雾水,那就说明缺乏总体思路,大葱哥各种网络资源如百度、腾讯官方公众号、官方QQ群等来寻求答案,经过学习和沾消化,我逐渐了解到了赛题的整体解答思路:
- 数据清洗
- 训练集特征构造
- 训练集标签统计
- 特征分析
- 特征处理
- 构造模型
- 训练模型
- 调整模型
- 预测结果
有了总体思路,我就可以一步一步的破除障碍前进了。
这里面训练集构造工作是大葱哥最困难的一步,从最简单的python语法、cvs文件读取到复杂的数据相关性分析、数据行转列等等,这些知识我都是从零开始摸索。
当然也要感谢官方的QQ群,里面经常有同学分享经验,让我学到了很多知识和技巧,说实话最开始的时候群内讨论的问题我听不懂,知识盲区太多,于是对自己听不懂知识开始补课,就在这一听一补之间,慢慢的能听懂群内的讨论了,并开始尝试借鉴同学们的思路写代码实现。
柳暗花明又一村
经过不断的学习和编码尝试,大葱哥也能通过写代码生成最基本的baseline可,按出价排序生成结果集,这算是这个比赛中的一个入门技巧。
每次看到结果集提交后成绩有了提升,我内心还是很兴奋的,当然这种兴奋支撑我基于攻坚克难。
经过前期的艰难匍匐前进,大葱哥对赛题的规则也有了深入理解,开始尝试创新,我自己依据官方的文档编写了检测结果集单调性的代码,这样可以方便自己在线下检验结果集的单调性分数,作为线上提交前的检验,因为单调性再比赛中占到60分的权重,因此这个部分我们必须要拿到满分,不能丢分。
我根据广告静态记录、广告操作记录,利用行转列、去重、异常值处理等技巧,构造出了和测试集具备一样特征(也就是字段)的训练集,再结合历史曝光数据按天统计了标签数据,至此,就完成了训练集的构造,当然这里涉及很多细节问题,比如当天有修改的广告记录是否适合做训练集等,建议仔细阅读官方的文档,我这里是把这类情况的广告排除了。
有了训练集下一步就是特征分析和处理了,当然为了快速出一个baseline,这里也可以直接使用原始特征,先不做处理。
接下来就是模型的构造了,可选的模型很多,比如lightgbm、xgboost、随机森林、神经网络等,都可以考虑使用。简单期间可以先考虑树模型,这类模型可以直接处理离散型特征。
模型中会涉及到线下验证集的问题,这里我使用了3月19日的数据作为验证集,按时间划分主要是为了避免数据泄露问题,验证方法建议自己实现单调性和准确度计算,这样便于直观的了解模型分数。
我主要摸索了lgb模型、神经网络模型,期间也遇到了不少困难,但有一种无形的力量牵引着大葱哥前进、前进,办法总比困难多,有问题就一定有解决办法,实在不好解决的我们可以先绕过去,大葱哥相信只要功夫深铁杵磨成针。
无论成败我已收获满满
比赛已经进入了初赛的B榜阶段,很快就要决定是否可以进入复赛了,但对大葱哥来说无论成败,我已收获颇丰。
参赛至今,我对机器学习的理解已经从小白到了大白阶段,所谓小白就是知道自己不会,但不知道具体哪些方面欠缺;所谓大白就是知道自己在哪些地方有欠缺了,知道一个完整的机器学习场景包含了哪些方面,知道自己应该加强哪些知识了,路漫漫兮吾将上下求索。
关于比赛的几点建议
对于比赛我总结了如下几点建议,希望能对同学们有所帮助。
-
关注官方信息
官网提供的资料、信息;
官方的公众号,定期推送排行榜前排同学的干货文章;
官方QQ群,多听听同学们的讨论,也许你会恍然大悟。 -
正确描述问题
在参赛中遇到问题困难不可怕,可怕的是我们不能说清楚问题。
要对自己的问题进行提炼,仔细想想自己的困扰到底是什么?
只有想清楚了,并能准确描述自己的问题了,我们才能很快的找到解决办法,比如找人咨询或者百度求助等。 -
参赛代码做好管理
比赛期间我们需要编写很多代码,最好对代码进行版本管理,可以使用本地git,每次大的变动都提交一次git。
比如我们调模型参数时,可能调整了很多次,在官网也提交了很多次,但对比发现还是之前的某次提交成绩好,如果不做git管理的话,有可能会把成绩最好的那次对应的模型参数搞混。
致谢
比赛期间大葱哥结识了很多赛友,在我遇到问题求助时,他们给予了耐心的解答和帮助,让我茅塞顿开重新启航,在此大葱哥一并感激。
当然也感谢官方提供了这样一个平台,让大葱哥有机会接触到前线的实际场景,系统全面的了解了机器学习和广告推荐业务领域知识。
最后预祝参加比赛的同学们都能取得自己理想的成绩,能通过比赛提升自己的技能收获知识。