阿里音乐预测最终报告

背景

阿里音乐拥有数百万的曲库资源,拥有数亿人次的用户试听、收藏等行为。在原创艺人和作品方面,拥有数万的独立音乐人,每月上传上万个原创作品,形成超过几十万首曲目的原创作品库,对于音乐流行趋势的把握有着极为重要的指引作用。本项目以阿里音乐用户的历史播放数据为基础,期望可以通过对阿里音乐平台上每个阶段艺人的试听量的预测,挖掘出即将成为潮流的艺人,从而实现对一个时间段内音乐流行趋势的准确把控。

问题重述

此问题的目标是对阿里音乐的播放量进行预测,详细说来,给定多个用户长达6个月的播放数据,包括用户行为表和歌曲艺人表,结果是每个艺人后两个月的播放量,形式如下:

  • 用户行为表
user_id song_id gmt_create action_type Ds
xxxxxxxxxx sbgcvdkjdhhjjkjkh 1426406400 1 20150315
  • 歌曲艺人表
song_id artist_id publish_time song_init_plays Language Gender
sbgcvdkjdhhjjh xaxaxaxa 20150325 0 100 1
  • 需要提交的表格包含后两个月每个艺人的播放量预测:
artist_id Plays Ds
xaxaxaxa 5000 20150325

方法综述

特征选取

这个预测问题涉及到多个属性,包括播放量、下载量、收藏量、粉丝数(听众),以及单首歌的播放量,歌手性别,歌的发行时间和语言等。特征选取是模型建立中极其重要的一环,通过可视化分析,我们发现对播放量影响直接的特征是播放量、下载量、收藏量,所以我们选取这三个特征。新歌显然会对后面的播放量产生很大影响,但是在后期预测过程中我们没有任何方法能捕捉到新歌发行事件,所以这个不做考虑。

朴素的均值方法

我们首先分别求出每个歌手每一天的所有歌曲播放量、下载量和收藏量和,并做可视化操作,如下:

歌手每天播放、下载、收藏量

通过分析发现,整体播放量的波动影响是有少数几首歌的火爆引起的,可能是新歌也可能是老歌,由于对于新歌和老歌的流行预测是非常困难的,我们只关注预测稳定趋势,而不考虑播放量暴增或者暴减的突发事件。算法的主要思想是使用给定数据后n天的播放量的均值作为后面的预测值,且后面所有的预测值都一样,另一点需要注意的是我们在计算均值之前需要将n天的播放量去除最值,计算公式如下:

基于滑动窗口的均值预测方法

基于滑动窗口的均值预测方法是建立在朴素的均值基础上的方法。一般地,如果给定数据的后几天数值会出现的波动较大,波动会逐渐消失,数据变化会渐趋平缓。为了能够体现这样的变化趋势,我们利用滑动窗口的思想,公式如下:

上述方法只用到了播放量这一种数据,而下载量和收藏量也一定与后来的播放量有关系,但是由上节图示可以看出收藏量与播放量的相关性较小,而下载量与播放量的相关性则较大。本方案中,我们加入播放下载比这样一个参数,具体算法描述如下:

# 获得每个歌手183天内的所有歌曲的单天播放,收藏,下载数
preprocess;
# 计算播放下载比
compute h;
while (not finish):
    get multi-window with different length;
    for each window:
    	remove extreme value;
    	calculate mean and variance;
    select window x with smallest variance;
    set m = mean of window x;
    #h()为关于播放下载比的一个函数
    m = m * h(播放下载比);
    set m as current play;

实现与结果

实现

算法用python语言实现,系统环境为windows10,主要分为预处理阶段和预测阶段。其中,预处理阶段将给定的两个原始表格数据聚合,得到每个歌手每一天的所有歌曲播放量、下载量和收藏量;预测阶段是利用预处理阶段的数据,应用相应的预测算法求出预测值。

结果

对算法结果可视化如下图所示,该图是对上文中出现图片对应歌手数据的预测。

预测图示

第一赛季最优成绩为第1名,最终成绩为103名,共5000+支队伍。