NIUHE

日々私たちが过ごしている日常というのは、実は奇迹の连続なのかもしれんな

阿里音乐流行趋势预测大赛总结

赛题分析

题目要求根据用户过去六个月的交互纪录来预测未来两个月歌手的播放量。

解题思路

数据感知

刚开始拿到数据之后做了一些简单的统计,发现艺人数量不是很多,只有50个,用户数量35万左右,而且每个用户的平均交互数量很低,半年内只有16次,低于平均值的用户占比70+%。总体来看活跃用户不多,把歌手播放量曲线画出来之后发现大部分的歌手的播放量都在2000以下。

预测用户行为

开始我们打算通过预测用户的播放行为来预测歌手的播放量,因为感觉这样有理有据,比如一个用户今天播放并下载了一首歌曲,那么他明天很可能还会听这首歌等等。根据这些逻辑我们从历史纪录里提取出了一些特征,然后用这些特征预测下一天的播放量,把预测好的再加入历史纪录用于预测下下一天,如此反复直到预测完2个月的播放量。

但是这样做有几个问题:

  • 首先,训练周期太长。光提取特征就要花一个小时左右的时间,再加上训练,合并训练集等,一共要两个小时左右,但这才预测了1天,把60天都预测完需要 60 * 2 = 120 小时,所以这么做肯定不行。
  • 其次,单个用户的随机性太强,导致训练误差也非常大,而且误差还会积累。 于是我们就放弃了这种方法。

时间序列分析

时间序列分析的方法也是参赛后在交流群里听说的,有人说用ARIMA能做到6200(当时第一6500+),我就去查了查,发现了时间序列分析这个理论体系。

于是我也用ARIMA试了,但是遇到一个很蛋疼的问题,ARIMA预测的好坏很依赖于他的参数!虽然50个歌手不多,但是为每个歌手单独调参肯定会累死,大家都用一套参数效果又不好。这时我又发现了R的auto.arima,用这个可以自动调参,但用了之后发现效果也没那么好,记得好像6000分左右吧。

均值大法好

在第一赛季期间总是有人在群里说规则轻松6500,模型打不过规则等,但一直不知道规则是啥,感觉很神秘很牛逼,后来才恍然大悟,这个比赛里它们说的规则就是取均值。

我就一点一点试,发现取最后十天左右的均值确实可以达到6500,刚发现的时候排名还挺高,后来大家都知道了排名就下来了,不过一直稳定在前100名。

从此以后我的方法就一直围绕均值展开,各种变花样均值,比如滑动窗口、平滑一下再取均值、STL分解一下再取均值等。

回归模型

到了第二赛季,平台上没有提供时间序列算法,只能用回归模型了,先后试了GBDT和XGBOOST,前者预测出来好多负值,非常不靠谱,不造怎么回事,后者还可以,虽然效果不如均值,但最起码比较接近。

回归模型的好坏主要依赖于特征的选择,就好比你要判断一个人是男是女,如果你的判断依据是头发长短,头发长认为是女生,头发短认为是男生,那么你判断的正确率可能在95%左右;但如果你的判断依据是那个人的染色体数目,那么你的正确率肯定在99.999%以上。

我在某次选择时加上了下载量这个特征,发现预测78月的效果超过了均值,不过由于没有9、10月的下载量数据,所以用均值替代,我把78月的真实下载量也用均值替代,重新预测78月的播放量发现也比均值的效果好。可是,当我用该方法预测9、10月时,分数TMD也变低了!线上效果又没有均值好,很醉。后来还尝试了不同的特征、feature stack等方法,效果都不如花样均值。

最后我只有祭出目测大法,才稍稍提了几分,能留在前50实属万幸。

赛后总结

赛后看了其他人写的博客发现,自己数据预处理做的不够,那些爆发点很可能是刷单的,应该清洗掉,但当时没考虑到,而且感觉比赛的时候思维比较局限,总是围绕着一点转来转去,导致最后效果一般。

Powered by Hexo and Theme by Hacker
© 2019 NIUHE