本文以天池大数据竞赛的阿里音乐流行趋势预测大赛为背景,将机器学习实战的背景、模型、算法、代码和结果等都整理下来,放在博客中,算是对自己知识的整理吧,有兴趣的朋友也可以看看一起讨论学习。
由于很多比赛和项目是由第三方提供的,我会仔细核查是否有规定不允许公开讨论相关内容,只有在确定没有限制的情况下,我才会放在个人博客上,但难免会有疏漏,如果有侵权,请及时联系本人,麻烦了。
1、背景材料
1.1 竞赛题目
本次大赛以阿里音乐用户的历史播放数据为基础,期望参赛者可以通过对阿里音乐平台上每个阶段艺人的试听量的预测,挖掘出即将成为潮流的艺人,从而实现对一个时间段内音乐流行趋势的准确把控。
1.2 竞赛数据
大赛开放抽样的歌曲艺人数据,以及和这些艺人相关的6个月内(20150301-20150830)的用户行为历史记录。
(1)用户行为表(mars_tianchi_user_actions)
1、共35W用户,其中8.3W只出现过一次
2、共1W首歌,其中500首只出现过一次
3、见2.1
4、频次分别为478W,81W,6W
5、3-1到8-30共183天
(2)歌曲艺人(mars_tianchi_songs)
1、共1W首歌,其中500首只出现过一次
2、共50个歌手
3、从19630322到20160227
4、
5、共9种语言
6、男、女、乐队
(3)结果集(mars_tianchi_artist_plays_predict)
选手需要预测艺人随后2个月,即60天(20150901-20151030)的播放数据。
1.3 评估指标
2、注意点
2.1 unix时间
这里的Unix时间并不是“unix时间戳”,即从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
Unix时间戳可以用下述代码转换为常用时间格式
import timefor l in file:x = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(l)))print x
此处是指是此事件需要应用SQL的内建函数FROM_UNIXTIME进行转化。
函数声明:
datetime from_unixtime(bigint unixtime)
用途:将数字型的unix时间日期值unixtime转为日期值。
unixtime:Bigint类型,秒数,unix格式的日期时间值,若输入为string,double类型会隐式转换为bigint后参与运算。
返回值:Datetime类型的日期值,unixtime为NULL时返回NULL。
示例:
from_unixtime(123456789) = 2009-01-20 21:06:29
数据集中提供的gmt_create只能精确到小时,例如1426377600将转化为2015-3-15 8:0:0,其中2015-3-15信息在Ds中已有提供,即gmt_create只能提供小时。
2.2 FAQ有用信息
(1)用户下载歌曲后,离线在本地播放,仍会产生播放记录。
(2)Q:要预测的艺人当天的播放数据是基于user表中已有用户的播放,还是预测网站中所有用户的播放?
A:需要预测网站中所有用户的播放。注:初赛中是针对用户做了一次随机抽样,后续的真实结果也做了处理。所以原则上,只需要根据已有的用户规模做合理预测即可。