KDDCup2016 总结

KDDCUP 总览与概况

今天已经提交了最后一次kddcup phrase3 的结果。目前为止,今年的kddcup也算是结束,这也是我第一次参加kddcup。在这次kddcup结果出来之前,也只有静静地等待。对于这次的kddcup有一些感想,记录下来。

这次的kddcup2016和以往的有所不同,也和其他kaggle竞赛也有不同。这次的比赛纯粹的是一道预测题,连主办方也没有正确答案。其他类型的题目多是主办方已经有正确答案,整个过程就是离线测试,看看谁的结果好。

这次的比赛是预测2016年若干个国际顶级会议上,全世界各个机构的排名。排名的结果根据该机构下发表文章的作者数与论文数据有关。假设某会议录取的论文中,每篇论文的得分为1,该得分平均分给每个作者,每个作者再将其得分平均分给其所在机构。

需要预测的8歌会议分别是
SIGIR: International ACM SIGIR Conference on Research and Development in Information Retrieval
SIGMOD: ACM SIGMOD International Conference on Management of Data
SIGCOMM: ACM SIGCOMM Annual Conference on Data Communication
KDD: ACM SIGKDD International Conference on Knowledge Discovery and Data Mining
ICML: International Conference on Machine Learning
FSE: ACM SIGSOFT International Symposium on the Foundations of Software Engineering
MobiCom: The Annual International Conference on Mobile Computing and Networking
MM: ACM international conference on Multimedia

目前数据给的是2011-2015计算机会议(包含上述8个会议)的论文,会议,作者,机构等信息,(不包含论文具体的内容及摘要,也不包含机构的地点信息)。也就是对于2016年的信息几乎寥寥无几,不过组委会鼓励大家搜集公开的其他数据。

这道题根据各个阶段时间截止后公布的会议中的一个会议的结果对该阶段进行排序。目前已知第一阶段是SIGIR,第二阶段是KDD。而在比赛阶段使用leaderboard进行实时评估,评估的依据是根据所有人提交的结果计算出平均结果,然后把这个平均结果跟你的结果进行比较,只比较排名。 但是,这个结果只供参考,最后的结果以真实的Ground Truth结果为准。

而leaderboard的结果和真实的结果差距大吗?根据第一阶段第二阶段的结果显示,两者差距相当大!第一阶段SIGIR的前几名都是在leaderboard位于一百名之后。因此,这次比赛的结果表明,即使你再排名中位于3%内,也不见得会在最终的排名中位于20%内,也就是leaderboard结果和真实的结果有巨大的偏差。不过好在在最终结果中排前几名的队伍,在leaderboard也保持很高的得分。而根据得分的计算规则,只考虑前20个机构,而且位于前几名的机构占更大的比重,通常,一些有名的机构会经常占据每年会议前几名。

kddcup的数据简要分析

这次数据量还是比较大的,所有数据的压缩包是23G左右,而解压之后到60~80G。好在数据的格式非常好,易于操作,开始的时候我是用的是Spark处理的数据,后来发现Python已经能够做简单的筛选工作,而且速度还不错。

最容易想到的是,只提取和那8个顶级会议的数据进行操作,根据2016KDDCupSelectedAffiliations, 2016KDDCupSelectedPapers提到的机构和文章对其他的数据进行筛选,把60~80G的数据提取到了2-3M,当然这样也丢失了大量的信息。

根据题目的要去算出各个机构在某年某会议上的得分。

kddcup第一阶段的分析

参加第一阶段的时候,我们的时间就不多了,那个时候也不是全力在搞kdd这个事,主要是前期在纠结数据处理上花了很多时间,包括布局spark和hdfs,其实后来发现不用spark单机处理这些数据完全没问题。

根据我们算出来的机构得分,我们很快使用 2011-2015年的得分数据做已知量,线性拟合出线性的表达式,求出2016年得分。提交结果前位于100名左右,而提交结果之后位于130名左右。

kddcup第二阶段分析

第二阶段开始后一直没动,主要是在等第一阶段的groundtruth。第一阶段的groudtruth出来后,结果不好,第二阶段决定换换套路,首先使用的是机器学习的方法
准备拿11-14年的数据,预测15年的数据。拿12-15年的数据来预测16年的数据,提取了各年排名,得分数据,使用了SVR的回归,效果不好,于是觉得抛弃。

后来想到,对以历史数据来说,在2015,2014年表现的好的,可能今年表现的会更好,2011,2012,2013也会对今年有影响,但是可能影响不及去年和前年,于是按照权重由小到大对于2011-2015的分数加权求和,作为2016年分数,然后归一化作为结果提交上去。根据leaderboard稍微调节一下参数。

结果是在leaderboard排名60左右,在最终的groundTruth达到前top5以内。

第三阶段分析

第三阶段算是做的比较认真的一个阶段了,尝试了各种不同的方法

方法一:线性回归

提取不同的参数,不同的特征,进行线性回归,但是效果不好,$R^2$的值太小,可解释性不好,最终的结果也不好。

方法二:线性加权

线性加权在leaderboard的效果一直不错,我一直在怀疑这种简单的模型是不是可以产生比较好的结果,毕竟大的趋势上线性加权的效果不错。

方法三:分类

这次我把数据分的更细了,2011-2013的数据作为已知数据,2014年的得分对应为target,2012-2014为已知数据,2015年为target,这两个作为训练集。而2013-2015年作为测试集,2016年作为target。训练集分为训练数据和交叉验证数据。一般是5fold。

特征提取了,这些年的依次发表的文章数,得分,排名,作者数,发布多篇文章的作者数,引文数量,被英文数量,以及会议热词(整个会议中的关键词出现的次数较高的词)出现的次数等等。

去进前30名(或者其他)为1,没进的为0,而通常,这个数据的true positive的数据往往比较低,也就是说分类器分的不好,即使正确率很高。

因此,分类没继续做下去了

方法四:回归

回归也是使用分类的思路,使用了三个回归算法,SVR,GradientBoostingRegressor和LinearRegression,发现使用GBR的效果稍好。

方法五:集成学习

把上一个方法的三个结果合并在一起,发现效果稍微有所提高。具体的是使用voting的方法,把上面单个回归所得到的结果从小到大排序,取前50名,第一名得分1.00,第二名得分0.98分,依次类推,然后将得分相加求平均,最后的结果作为集成学习提交,的确比单个回归的效果要好。

总结

最终第三阶段还是使用了线性加权。
不足:
[1] 只考虑了很小一部分数据,而对于大部分数据都直接扔掉了,数据利用率较低。
[2] 对数据特征的挖掘还不够透彻。
[3] 虽然数据量较多,但是一旦以机构来作为样例,数据量还是偏少,应该从其他角度考虑。
[4] 只使用了简单的算法,没有考虑更复杂的算法。
[5] 对数据的操作还有些欠缺。
[6] 投入到竞赛的时间还不够。

文章作者: Victor Zhang
文章链接: http://cupdish.com/2016/05/29/KDDCup2016-总结/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cupdish.com