2016中国高校计算机大赛大数据挑战赛上,陕西师范大学网路信息中心团队对阿里音乐流行趋势预测进行了自己的成果展示。首先从解题思路开始谈起,重点对算法进行了阐述,包括类别最优值选择法和子序列模式匹配法,最后对比赛中遇到的问题进行了总结。一起来了解下。
总体思路
陕西师范大学的同学们采用了标准时间序列的分解思想,将日播放量分解为长期趋势、中期与随机干扰三项,但在最终的算法当中,只对长期趋势进行了预测,我们的算法分为数据预处理、编码、分类、预测方法选择和附加处理五个环节,整体来讲是以歌手为单位,对数据集进行预处理,根据预处理结果对歌手进行编码,依据编码将所有歌手进行分类,分为24个基本类别,针对每一个类别选择出它的最优预测方法,最后为了提高分数,我们也对部分歌手做了附加处理。
算法阐述
预处理部分,我们采用数加平台,在数加平台中建立SQL节点,执行SQL语句完成的数据预处理的结果,包括从样本中提取的每个歌手的日播放量序列、周播放量均值序列、月播放量均值序列、日变化率序列等,前三个序列将在编码中使用,日变化量序列用于选择每个类别的最优预测方法,在此基础上对歌手进行编码。
编码方法
编码包括月编码、周编码与日编码,进行编码的主要目的是大致的判断歌手日周月播放量的变化趋势,以月编码为例,编码是以基本趋势和增量趋势两部分组成的,基本趋势的编码规则是当月均值高于前一个月均值,则为“1”,否则为“0”,例如,4月份的均值大于三月份的均值,那一位就为1,5月份均值小于4月份均值,对应位为0;增量趋势代表变化幅度的大小,它的编码规则是若当月均值高于前一月,则当月均值除以上月均值的结果取整,否则上月均值除以当月均值的结果取整,例如,最后一位为5,表示的是8月均值与7月均值相差5倍以上,到底是增长还是下降,我们从前面基本趋势可以得出结果,综合基本趋势和增量趋势两个部分,就可以知道8月均值在7月均值上正向一个大幅度的增长。同样地,日编码和周编码都可以使用这个方法得到。
分类
根据月编码、周编码、日编码的基本趋势和增量趋势部分对歌手进行分类,最终分为24个基本类别。
进行分类的主要目的是将播放量变化总体趋势相似的歌手归为一类,例如,将基本趋势的后两个月连续上升的、增量趋势最后一个月变化平稳的歌手归为第一类,将增量趋势最后一个月大幅度增加的歌手归为一类,最初只分为8个类别,在比赛进行的过程中我们对类别进行了不断的验证与细化,最后形成了24个基本类别。
预测方法选择
对歌手分类好后,就需要对每个类别找到它的最优预测方法。寻找最优预测值的方法有两种:
类别最优值选择法
对歌手60天的日播放量进行预测,很难进行精确预测,应该尽可能预测9到10月份的日播放量的均值水平,因此选用最后三天均值法、最后一个月均值法以及各类使用百分位数作为预测值的方法等作为待选预测方法的集合。
有了待选方法集之后,就要针对每一类别的歌手评判他的最优预测方法,使用3到7月的数据作为训练集,8月份的数据为测试集,遍历待选预测方法集合,用当前选定的待选预测方法计算八月份的预测值,根据大赛提供给我们的评判公式,我们对8月份预测值进行评分,得分最高时对应的方法正是我们要求的这一类别歌手的最优预测方法,使用最优预测方法就可以计算这一类别歌手9到10月份的日播放量。
子序列模式匹配法
在第二赛季第二批数据集当中,通过对歌手的日编码、周编码的增量趋势部分查看发现,存在40多位歌手8月中下旬的日播放量突然成倍增长的情况,这部分歌手的日播放量趋势与其他歌手的相差很大,我们认为对这部分歌手的预测要采取不一样的方法,因此,针对这一类歌手,我们采用子序列模式匹配法来进行预测,这种方法是通过对其他歌手样本数据中曾经出现过的类似曲线的学习,
计算出待预测歌手9-10月份日播放量回落到正常水平的预测值。具体来讲分为以下三步:
- 截取歌手的待匹配子序列:截取待预测的歌手最后15天的日变化率序列;
- 求最佳匹配子序列:在其他歌手的日变化率序列中找出欧式距离最小的5个子序列;
- 确定预测值:从选出的五个最佳匹配子序列中选取后续变化比较平稳的三个子序列作为计算预测值的依据。
对选出的3个子序列匹配结束后的样本序列的变化率进行处理,计算出待预测歌手的9、10月份的日播放量趋势。我们发现歌手的日播放量回落一般是需要一个过程的,不是一下子回落到水平状态的,因此我们做了分段下降处理,使9到10月份呈现一个阶梯式的回落过程。
附加处理
- 对top1歌手的处理:
上图为歌手月播放量均值的示意图,从图中可以明显看到,第一名歌手的播放量是其他歌手的若干倍,由大赛提供的评判公式可以知道,对日播放量越大的歌手预测的准确程度对分数的影响越大,因此我们认为,提高第一名歌手的预测准确度是非常重要的,所以在已有预测值的基础上根据二分法对第一名歌手的预测值进行了多次调整,最后提高了600多分。
- 发布新专辑:根据专辑发布时间,以发布时间为分割点对9-10月份进行分段,根据专辑中的歌曲数量,对发布时间后的预测值略作提升,用这个值作为最后的预测值。
总的来说,我们是从样本集中提取出每个歌手的日、周、月播放量序列和日变化率序列,根据这些序列对每个歌手进行日编码、月编码与周编码,根据编码将所有歌曲分为24个基本类别,然后对每个类别选用它的最优预测方法,同时对月播放量最高歌手和有新专辑发布歌手做了特殊处理,形成最终提交的结果集。
曾经的尝试
我们的算法不是一朝一夕形成的,也迈过了很多的坎坷。比如:
- 我们尝试过使用常见时间序列模型( Arima、STL、Holt-Winters)进行预测,但由于预测的日期数较长,会出现过拟合问题;而且,Arima等时间序列模型的拟合依据与比赛的评判函数不同。
- 我们也对所有日播放量歌手序列进行过周期性判断,但由于待预测的时间范围较长,样本集中的周期性未必会延续下去;趋势预测的偏差过大会导致叠加周期性后的效果适得其反。
周期性与趋势是随机序列中的确定性因素,随机干扰是时间序列中的不确定因素,它对长时间的预测扰动是比较小的,而且,我们也没有很好的办法地随机干扰进行提取,所以我们忽略了随机干扰。此外,我们也尝试过用户对歌曲的收藏量、下载量和播放量的相关性进行过研究。