阿里音乐预测最终报告
背景
阿里音乐拥有数百万的曲库资源,拥有数亿人次的用户试听、收藏等行为。在原创艺人和作品方面,拥有数万的独立音乐人,每月上传上万个原创作品,形成超过几十万首曲目的原创作品库,对于音乐流行趋势的把握有着极为重要的指引作用。本项目以阿里音乐用户的历史播放数据为基础,期望可以通过对阿里音乐平台上每个阶段艺人的试听量的预测,挖掘出即将成为潮流的艺人,从而实现对一个时间段内音乐流行趋势的准确把控。
问题重述
此问题的目标是对阿里音乐的播放量进行预测,详细说来,给定多个用户长达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+支队伍。