在比赛之前就想着这次主攻C题(数据题),主要考虑到和自己所学的知识有些沾边,也不想为了美赛专门去学一些以后用不上的数学建模知识。
这次美赛比较特殊,因为疫情的关系,美赛划分成了两个时间段,2月的和3月的,各有3道题(本来是6道题一起比),其实没啥区别,疫情比之前想象要严重,现在快三月中旬了也不知道啥时候能开学。之前和队友商量选哪个时间段,队友都想再等等,说不定三月能见面,刚好目标的C题也在三月这次的美赛,于是就等到了这几天。
第一天拿到题时感觉还挺兴奋的,题目内容大概是有个亚马逊用户的数据集,要求帮一家公司发掘一些有用的、能帮助其制定新产品营销策略的信息,涉及数据挖掘、nlp、时间序列,具体的小问大概有五六个。当时觉得题目有些出乎意料,虽然数据挖掘和nlp也没有什么丰富的经验,但至少了解过一些,知道大概怎么回事,特别是前者,常见的模型基本都有些了解,至于其他的,直接调包就行了。当时甚至觉得这题会不会过于简单了。第一天我的工作基本就是进行了些数据清理,当天感觉特别顺利,总有些“乐在其中”的感觉(其实事后回想起来,效率还是有些低的,那时还没意识到时间的紧迫)。晚上十一点半约组员语音交流了一下,突然发现问题了。之前我一直觉得不就是确定好X和y,调包选个效果不错的模型,然后去看看数学解释往论文里代不就行了吗。结果我语音时突然发现不知道拿什么来当y,其实也就是没读懂题目想让我们干嘛。

主要是a,b,c题。 题目让我们设计一个基于评论和评分的度量来告诉公司一些有用信息,来预测商品的成功或失败。然而数据集中并没有给销量数据,主要都是与评论相关的(数据集中除了各种ID和商品名字外有价值信息的只有评分、评分标题和内容、评分投票、特邀用户、特殊购买、购买时间),那我们衡量成功的标准是什么呢?abc题的评判标准我都很疑惑(b题后来理解了)。我们手里就只有评分之类的数据,假设我们基于这些设计好了一个模型,那我拿什么去衡量我这个模型的好坏呢?当时在网上看了一大堆所谓“思路”,但我看着就感觉像那种“想当然”型的,都是自己没做,然后可能知道有些啥模型就blabla说一大串,最神奇的地方就是我看的时候感觉嗯语言衔接什么的都没问题,但读完之后居然不知道他说了些啥可实操的东西,也就是根本没法上手,也没解决我前面关于题目的疑惑。其实到现在我还是没太懂ac两题让我们做什么。
第二天起来决定先搞情感分类,先把nlp的部分做了。上网了解到nlp主要有两种方式,一种是基于情感词典的,也就是把输入和情感词典中的情绪词进行比从而算出情感得分,另一种是基于机器学习的,就是训练模型,让它自己找到X和y的映射关系。当时为了照顾可解释性,也害怕使用情感词典算外部数据(题目要求只能使用所给的数据集),我就在找传统机器学习关于情感分类的一些资料,后来找着了,准备开始试的时候意识到,题目其中的一个意思不就是让我们探究评分和评论内容的关系吗?那我把评论内容和评分当成X和y去训练不就相当于强行建立他们的联系,这样得出来的评论内容的得分不就必然和评分强相关了吗?所以就只能用情感词典。当时找到了TextBlob这个可以无脑直接用的库,效果只能说勉强还行吧。后来想了想,还是想要有更好的可解释性,我想不调库,自己去统计高分评论和低分评论的高频词然后根据这个去计算情感得分,后来发现这个思路没那么容易。直接统计出来的词语尽管已经过滤了一些也还是有很多的stopwords,而且和想象不一样,比如great这个词肯定是积极的,但在低分评论里也有不少,我看了看,大概就是用户说这个东西不如他想象中的那么great,或者刚拿到时很great,后来又出问题了,诸如此类,不能只考虑单词本身。这条思路走不通,那行吧,最后由于时间关系还是接纳了TextBlob。
第三天起来很惆怅,e小问使用前一天统计的高分和低分的高频词然后再反向算出含这个词语的平均得分就基本可以解决了,但前面的abcd还是没什么思路,于是我就打算看看能不能从看数据中有所启发。看了看数据集中的属性名,仔细想了想,有了些猜测的方向,然后一个个试了一下,也挖掘出了一点点有意思的信息(后来看论文时发现好像没写进去)。然后下午逛了逛知乎,看到一个新用户的回答,比之前看的要靠谱得多,让我突然感觉对题目的理解好了一些。下午又和队友商量了一下,分了下工,我负责与时间有关的bd(都第三天下午了,我们还有一大半的题没做2333)。然后我先开始想b,刚开始很懵,“讨论一个基于时间的度量和模式,能暗示产品的声誉是在上升还是下降”,声誉不就是和评论有关的吗,那我们有的不就只是和评论有关的信息吗,难道输入和输出都是评分吗?想了很久,洗完澡之后慢慢有了些思路,没错,输入和输出就是一样的呀。。。时间序列就是这样,找出一组时间维度上的数据的趋势规律。总之只要找出能预测和拟合得比较好的时间序列模型就行了。然后就开始上网找,此时好像都快十二点了,我才懂了这道题啥意思,但还是很不顺利。python的有很多时间序列模型的常用的那个库我装不了,折腾了一下也没搞好,时间紧没时间研究了,然后就去找看看有没有手写的,找到了Holt-Winter 三次指数平滑,看了看数学原理好像还挺好理解的,然后跑了一下,嗯,能用,终于可以放心地睡了,此时已经三点了。
第四天由于是最后一天,d题之前也还没啥思路,虽然三点睡的,八点半就起来了,幸好马上就有了些思路,题目要求看看“特定的星级是否会引起更多评论”,其实也就是非常简化的模型,把数据按季度累积,计算了上一/二/三个季度的评论星级和这个季度的评论人数和评论星级的皮尔逊相关系数,然后这道题就算结束了。接着就是开始一些收尾工作(完善之前做完的题和结论,写出中文版的去给队友翻译)。由于一直不知道论文的情况,交流时感觉好像还可以然后就拖拖拉拉的,先是弄完了e题,还弄了个词云效果图,看起来还不错,然后就开始完善前一晚的b题,也就是三次指数平滑模型,这个折腾了好久,因为这次的数据集总共才两万多条吧,筛选了一下,评论数有几百条的产品也就只有几十个,就这几十个能用,即使是这几十个,我都把时间按季度来统计了(这个精度算低的了),也还有些季度是缺失值,当时已经较晚了,怕弄不完,就只在没缺失值的几个上面跑了一下。然后匆匆赶往d题,把d题的解释简单说了一下此时就快十二点了。然后开始写摘要,摘要挺重要的,不知不觉就写了快四个小时(主要是担心语句不通顺,语句是否地道,以及之前其实没啥机会看论文的情况,顺道仔细看了看论文已经写好的部分,找找疏漏,梳理一下思路)。。。论文的问题比我想的要多(多方面的,并不只是指翻译,还有模型论述、漏了我的工作的一些内容等等),可惜没太多时间修改和补充了,而且队友用的是LaTex,我没用过这东西,我们又不在一起,改起来比较麻烦,只是把一些好改的说了下。不知不觉就快六点了,心想这次就这样吧。
回想起来这四天的美赛,感觉还是有很多体会的。
首先是反思。这次最后的结果其实我是有些不太满意的,感觉做得并不好。想了想原因,大概有如下几点:
1.python不熟。虽然之前试过数据清洗,对pandas常用的数据结构以及用法还有些了解,但其他方面的如处理时间这一块的(比如画时间序列的图和按时间聚合),画图这一块的等等都不太熟练。不知不觉累积起来也浪费了一些时间。
2.分工不明确。我们三个其实差别不大,没有谁数学/英语/计算机特别好,我们可能就都只是懂些计算机的知识,数学也就是普通的非数学专业学生的水平,英语的话我应该比他们好些。当时想着是咱们三个始终一起行动,一起建模一起写论文,但现在看来效果不太好。这种模式对交流效率的要求比较高,最好是要大家都在一起。其次是有一位组员几乎没接触过python,他用的比较熟的主要是javascript,这就比较麻烦了。机器学习和处理数据肯定是Python比较方便的,我和另一位组员都用的python,这没法合作,所以后来也让他先去写论文了。
3.网上交流不方便。正如前面所说,假如分工明确可能会好一些,但效率也比较低。
4.没有时间意识。虽然表面看每天除了睡觉的时间就在建模,但实际上稍微计一下时就会发现这些时间的效率不高(当然,如果效率高的话,也许也做不到连续四天每天弄那么久了,毕竟很累的)。应该把每天任务列好,明确好大概的时间分配。另外也可用冥想划分时间块,同时还能休息眼睛。
然后简要谈一下收获吧。这次美赛有几个收获:
1.第一点这个其实不能算收获,顶多算认识吧。就是经这个美赛发现自己比想象中的能“熬”。前两天晚上都是二点睡九点起,第三天晚上三点睡八点半起,第四天六点睡,醒着的时候除了生活必须活动就是建模。这是我活到现在应该是最高强度的一个作息了。感受就是睡眠不够人的脑袋确实会有些反应不灵敏吧。(感觉建模的时候时间过得飞快)
2.python的熟练度提升了不少。经过这次美赛,感觉自己写python已经能和Java、C差不多了(这两个都是在学校学过)。从这方面来看,这四天的时间挺划算的。
最后简要感慨一下吧。没想到一年过去了,尽管自认为思维水平和代码能力都有了一些提升,但这次美赛还是如此的不顺利。一年前真的是在胡闹。这次可能和题目也有关系吧(毕竟审题审到最后都还是没完全搞清楚),如果这次C题延续以往C题的风格也许会好一些?不知道。总之最大的原因还是能力不足。最后,装模做样地学别人说一句,“菜是原罪”。
分享个令我印象深刻的片段吧。我的两位队友分别是一方和栋哥。
好像是哪一天晚上,我们三个语音,我和栋哥两人大概是吐槽了一下这个日子太“南”了之类的,一方听到后可能理解错了,平常都不说话默默干活的他此刻用一种非常萌的声音插了句话,好像是,“我只知道做啥事都不要怕”。