Skip to content

Latest commit

 

History

History
41 lines (31 loc) · 12.4 KB

README.md

File metadata and controls

41 lines (31 loc) · 12.4 KB

2020美赛C题经验

1. 前言

前几天美赛出成绩了,有幸能够获得M奖,虽然说在知乎这种人均F奖、M奖的环境下看似乎算不了什么,但是对于我个人而言,和两位队友四天四夜投入所有时间精力来解决一个陌生的问题在我的大学生活中也算是比较珍贵的一段经历吧!
鉴于参赛前参考了很多前辈们的参赛经验帖,受益颇深,因此,我也在此将自己本次参赛的一些心得分享给之后参赛的同学们,但凡能够从某个角度上帮助到某些人,那么我写的这些东西也都是值得的了。
文章提到的资料和我本次参赛的作品均已上传到GitHub,好的正文开始:

2. 参赛经验

关于组队

因为一开始我的想法就是奔着C题大数据去的,因此就直接找了两个经济统计专业的好朋友组队,我们三人都有参加过之前国赛的经历,而且我知道他们两个都很靠谱,所以在组队上我并没有遇到什么太大的问题,我想这也是我们能够拿奖很重要的原因之一吧,但是我知道这次有很多队伍因为组队不慎的原因造成了两人建模甚至一人建模的尴尬处境,所以组队还是得慎重,我的建议就是:优先找自己熟悉的、靠谱的人,而不是一味追求队友要跨专业背景(比如计算机+数学+文科),像我们之前的国赛,我这次的两个队友当时就是为了追求专业背景多样性都遇到了坑队友,队友A找了个数学妹子,结果数学妹子对于建模并没有什么优势,而且当时中秋节还跑出去和她的男票过节了...队友B找了个计算机同学,结果发现好像他编程能力也不怎么样,而且比赛的时候一直在看NBA...所以我觉得组队的一个原则就是首先找的队友要靠谱,就算能力目前不是很强,但是起码会认真对待而且不会半途甩锅走人的那种,在此基础上再去追求队友优势的互补。

赛前准备

他山之石可攻玉,所以我建议在赛前尽可能多的看别人分享的参赛经验贴,然后从中总结出适用于自己的方法和套路,阅读往年的O奖论文也挺重要的(虽然我一篇也没完整的看下去,不过也还是从中学到了一点套路),可以学习别人的行文逻辑等。
队友的分工最好赛前就确定好,可以针对性的去做准备,而且最好是一人负责学习两块这样子,个人觉得建模编程和写作不应该完全割裂开来,比如在这次比赛中,我就是负责编程和建模,然后其他两个队友负责建模和写作,以建模为核心,一人负责两块,这样会减轻沟通成本,就不至于模型都建好了,但是写作的人不理解无法将模型的思想表达到文章中,或者编程的人根本不理解这个模型导致写不出来程序。接下来我会根据这三个模块分享下自己赛前的准备经验。
关于编程
有的人可能会纠结用哪种编程语言,比如用MATLAB还是Python,如果你还没学的话,我推荐学Python吧,由于有着各种第三方库的支持,Python在处理尤其是像C题这种大数据类型的题目简直有着得天独厚的优势,很多模型或者算法都能直接调包解决,比如这次C题的情感分析,不用Python我还真不知道要怎么做。
这里推荐两本书籍,如果你想选C题的话或者以后想用Python做数据分析的话,可以考虑好好阅读一下,寒假时我就粗略看了下,比赛时的我的代码编写效率提高了很多很多:

  1. 《利用Python进行数据分析第二版》:主要讲的是数据处理,pandas,numpy,matplotlib的使用方法,较为详细
  2. 《Python数据科学手册》:一部分和上面那本内容重叠,后面也有讲一些机器学习模型的介绍和使用

由于好像目前建模主流的编程语言都是MATLAB,所以网上能找到很多大佬或者培训机构整理的MATLAB实现算法代码,但是Python好像还很少有人做这样的工作,这里推荐一篇自己赛前收藏的文章,作者整理的还是比较详细的,覆盖了大部分的机器学习模型和启发式算法:数学建模部分算法整理

关于建模
因为在去年暑假的时候参加过学校组织的国赛培训,当初就了解了不少模型,因此在这美赛中我并没有投入太多时间来学习模型。在模型这一块,如果时间足够的话可以去系统的学习下以下的经典的模型,基本上是能够覆盖大部分题型的要求,如果没时间的话,其实大概看一下就行了,知道这个模型的主要思想是什么,能用来解决什么问题,到时候比赛的时候就只需要现学现卖就行了: 



这里也推荐两本书籍(虽然我都没怎么看,但看了还是很有好处的):

  1. 《数学建模算法与应用》--司守奎
  2. 《数学模型》--姜启源

关于写作
写作工具推荐使用latex,当然用word也不是不可以,我看往年的很多O奖文章也都是用word写出来的,使用latex的好处在于能够免去排版的烦恼,如果word的话还得去慢慢调一些字体字号行距页眉页脚等。而且其实latex上手也不是很难,但是需要找到系统的入门教程,比如《Ishort》,该教程可以在LaTeX工作室找到,他家也有提供各种latex模板,我的美赛和国赛的模板都使用他们的,相对于很多网上随便搜索找到的模板制作要好很多,这里也要说一下,如果使用latex 的话一定要用专门的模板,不然的话还不如用word。找到了模板和入门教程,差不多折腾一个晚上也就能上手latex写作了。这里推荐几个latex在线的网站,一定程度上能够提高写作的效率:

  1. Overleaf, 在线LaTeX编辑器:可以在线协同写作,多人编辑需要花钱,不想花钱可以考虑一周试用,原本想用这个的,但是队友没有科学上网条件访问会很慢,遂放弃。
  2. http://www.tablesgenerator.com/#:在线生成表格代码,因为latex弄表格实在太麻烦了,所以我都是现在Excel里面打好表格,然后复制到这个网站里面生成代码,再粘贴到latex编辑器里面。
  3. http://latex.codecogs.com/eqneditor/editor.php:在线生成公式代码,没怎么用过,打公式不熟的话用这个应该可以提高效率

美赛需要英文写作的,专门负责写作的同学不妨看下这本美赛官方出品的《正确写作美国大学生数学建模竞赛论文》,当然我的队友写作都是直接用机翻,写一句中文然后翻一句英文,写出来非常的Chinglish哈哈哈。

比赛时

有效的查找资料,无疑是打开思路最重要的一环,像上次的国赛的出租车问题,我就在IEEE上找到一篇文献,为我们那时候提供了很重要的思路,这次的美赛也是,虽然并没有找到什么有价值的文献,于是我就往kaggle上面找,结果还真发现了很多做电商评论挖掘的,于是带着惊喜认真的看了几个大佬开源的notebook,从中也收获了不少。这里推荐自己查找资料的一些方法:

  1. 谷歌学术+sci-hub:科研狗必备,选择合适的关键词检索往往能够找到不错的文章,就是英文文档读起来比较费劲,可以用谷歌的文档翻译或者更为专业的翻译狗先翻译成中文粗略看一遍如果觉得可以再看原文
  2. 知网上名牌大学发表的期刊论文或者硕博士论文:虽然知网上很多期刊论文都很水,但是这些名牌大学发表的论文硕博士论文质量还是挺有保障的
  3. kaggle或者天池等数据竞赛平台:针对大数据题目有奇效,我去年国赛的数据和这次美赛的思路就是在这里找到的

这次比赛整体来说我和队友还是相处的很愉快的,没有太多冲突,时不时还能互相吹下牛逼,但是在要提交论文的那天晚上,我却因为一个标点符号加不加空格的问题和一个队友吵起来了。。。我们都知道英文每写完一句标点符号后面是要加一个空格的,但是我写作的队友很多地方都没加,不过用的是机翻,从翻译复制过来的那部分就会自己加,于是我就提出了要把所有标点都加上空格,但那个队友嫌麻烦,觉得这种细节的问题并不重要,而且也比较晚了,我们当时就想收工的了,我对于细节要求比较高,所以当时就和那个队友吵起来了,当时情绪都比较激动,所以我就做了让步干脆不加了直接交上去,后面发现其实问题也不是很大嘛。所以我建议比赛时要是和队友发生冲突,先思考下冲突的点是不是问题的本质,如果只是细节问题的话,我就觉得没必要吵了,因为对整体影响不大,没必要因此进行不必要的争吵浪费时间并且破坏大家的心情。

3. C题思路

比赛已经过去快两个月了,我现在对当时的思路印象也不是很深了,而且这个对于后面的人参考意义也不是很大,但还是简单写一下吧!
数据的预处理
仔细看下这些数据,其实是存在很多垃圾数据的,比如奶嘴里面就有很多行商品其实根本不是奶嘴,可能是因为爬虫的原因吧,所以第一步是把那些垃圾数据剔除掉,这里我采取的方法比较简单粗暴,就只是对商品名做了一个判断,比如对于microwave,我会判断他的商品标题里面是不是含有microwave,如果没有microwave这个词,那就给这行数据删掉,这样至少能剔除大部分的垃圾数据。
然后就是评论数据的处理,很关键的一点就是怎么将这些评论数据的情感值量化,一开始我觉得这个很难,因为没做过这种,甚至当时都有点想放弃C题了,不过后面发现其实也很简单,用Python的NLTK包里面就有训练好的情感量化模型,剔除禁用词后直接调用即可,然后就可以将每一行的评论数据都转化成一个情感值,还蛮准的其实,但是在上手NLTK时踩了几个坑(一个是语料库的下载,不知道为什么有的调用代码会下载失败,所以最后我索性直接把的6G多的全部语料库手动下载下来在导进去),所以这里花了挺多时间的。
模型构建
这次我们用到的模型其实都比较简单,题目有一个是需要从评论数据中挖掘出有价值的信息,一开始我们是想用LDA主题建模的,但是发现效果很差,分出来的那几个主题很难找到一个逻辑,遂放弃。后来就直接用了一个简单的逻辑回归模型,将评论分为两类,好的和差的,然后将那列评论数据用Tf-Idf算法向量化,跑个回归,根据逻辑回归的得出的系数大小和显著性就可以筛选出每一个商品最正面的词和最负面的词,这些词就可以反映顾客最关注的产品的特性,然后一通bb即可。
再后面题目有要求构建一个根据时间的评价模型,这里队友想出了一个比较“随意”的模型,把那几列变量用某种方式相加相乘组合得出了一个评分模型,然后按照月份画个图,看看这些商品的评分有没有存在季节性,记得还有一个要求是看这个商品先前的评价是否会影响之后的评价,这个我们就简单测试了一下这个评分是否存在自相关,结论是没有,即不会影响。然后最后就是一通bb。

4. 总结

这次的美赛对于我来说还是比较爽的一段经历,和两位很靠谱的队友在四天之内投入所有时间精力解决了一个自己陌生的问题,说实话也挺累的,不过还是从中收获了很多东西,我之后应该不会再参加什么建模比赛了,所以这篇文章就献给那些之后参赛的朋友,希望能够对你们有所帮助,同时,也用来记录下自己这段比较珍贵的经历。
第一次写这种经验贴,如有不足,还请指正,也欢迎私信和我交流!