您的位置:首页 > 其它

天池阿里音乐流行趋势预测大赛--初赛

2016-08-24 16:36 351 查看

天池阿里音乐流行趋势预测大赛

☛想要干货直接忽略这部分☚

先来个简单的总结吧。其实最后几天排行榜还是风起云涌的,我们一路从第八冲到第二,然后跌倒第六,中间仅有五天的时间,所以不到最后一天还是不要放弃,梦想一定要有,万一见鬼了呢(我们一直怀揣“干”掉金陵老师的梦想,可是到了最后一天还是没有见鬼。。。)!

学习下论文的结构,还是先来介绍一下做这个的动机吧,首先我们团队是研二的学生,面临就业,但是实验室的工作比较繁琐,没有特别拿得出手的项目经验(作比赛中,还在鼓捣MFC(我们组主要的研究方向是深度学习。。。),囧),想的就是参加一个比赛,毕竟7月中旬就结束了,打完比赛直接刷题找工作,阿里音乐就这么出现在了眼前。

再来看一看一下团队成员,养男孩(杨南海),我们组的大神,kaggle出身,顺便搞一下天池,几乎承包了这次比赛的全部idea,顺便担任一下我们组的颜值担当。 addsteel(曾钢),add曾也,steel钢也,人称刚哥,超级码力,几乎承担了所有线上mr工作,wangqingbaidu(张志伟)大家喜欢加我伟哥,但是大学人家更喜欢加我大伟哥,双高患者(年龄高,血压高),这次比赛主要是给两位大神端端茶,倒倒水。



OK,不扯淡了,进入正题。

一、 初赛——绝望到几乎要放弃了


赛制不多说,相信各位太君应该都是过来人,初赛的数据时提供下载的,这里我们犯了一个很严重的错误就是,就是立马分工(问题都没有分析清楚。。。),团队3个人,加上这个数据给的比较特殊,正好可以从3个角度去考虑问题——
user-artist
song-artist
artist-self




Tips:

这里有一点一定要说的(当然也是因为南海这种经验丰富的人)就是第一赛季虽然可以可以尝试任何东西,甚至自己一个值一个值的手动去调都可以,但是还是建议大家一定要想第二赛季的规范看齐,因为第二赛季给大家提供的工具是有限的(odps sql,仅有的几个机器学习模型)所以除非代码能力超群,或者只想参加第一赛季,还是建议大家尽量不要把自己的特征搞得太麻烦,同时尽量避免使用python去提取特征(虽然我是python狂热的拥趸者)要不然第二赛季就等着GG吧。



1、 user-artist的角度

由于这个粒度是三种方向最细的,所以对预测出来的结构聚到artist角度得到最后的提交集。ok,首先介绍一下这个角度的特征工程,前期提特征弄了100多维,当然特征是显而易见的那种,包括最大值最小值,中位数,均值……



因为用户的
action_type
包括3类,所以就在每一类上都进行特征的提取。后面就不再进行赘述,现在挑几个详细介绍一下。

a.用户听歌时间习惯特征

首先是gmt_date,通过mysql的
str_to_date
函数将这个字段转化成24小时的数值,表示用户喜欢在哪个时间段听歌,对这个24个值弄成one-hot编码,作为用户的一类特征。

然后是针对不同的
action_type
获得的每一天的均值。





b.用户品味特征

这个特征包括用户钟爱的artist,喜欢的
language
gender
然后进行one-hot编码。





c.聚类特征





前面已经得到了用户的几类特征,然后通过kmeans对用户分别进行聚类(由于kmeans要指定聚类的个数,所以类别数选取的比较naive,就弄了10类)然后再对这个类别ont-hot。




其实通过这些特征,感觉应该就有一个baseline了吧,由于我是小白,其他两个大神原来做的比赛都是很依靠模型,以及对模型的理解,所以被他们带的都成为了模型的忠实拥趸者。



不得不说python的sklearn简直不能在方便了,模型就只需要修改一个类初始化就不用去修改其他的代码,可以直接跑。



使用sklearn,尝试了几乎所有的常见模型,包括
Random Forest
GBDT
LinearSVR
,
Ridge
XGB
,基本上都是各种调参,
GBDT
都快吐了,单线程而且我做的角度比较细,所以跑一次简直时间不要长,虽然后面对所有的
Train DataSet
,
Test DataSet
,
Submit DataSet
进行了缓存依然模型
fit
的时间超级慢,使用
RF
一次都要20分钟的时间,最后只能写个循环,网上仍在服务器上,让他自己去跑。



最后应该是
RF
的分数是最高的,但是也仅有5000多分(第一赛季没换数据之前,300名左右)还是多少忘记了,反正很低,模型的参数是这样的:

model = RandomForestRegressor(n_jobs=-1,
n_estimators=100,
max_features=5,#5
max_depth=8,#8
min_samples_leaf=2,
random_state=219)




user-actists角度总结:

其实最后虽然能做到5000多分很大程度上是因为开了天眼(因为我们是3个人,南海那边已经得到了比较优的结果,所以调参最后是依据他的数据进行的),而且最大的问题就是通过模型弄出来的结果抖动特别特别大,举一个简单的例子就很好解释了,假如一个user每天都听一个artist(当然这是最好的情况,虽然一般这种情况是不会出现的),好,那我就有很大的把握他过两天还是会听,但是因为这个问题是回归问题,并不是一个分类问题,所以到底听多少,这个问题是很难把握的,如果他在每天听歌在random(1,10),这个区间之内,我虽然很有把握他会在接下来的60天会继续听歌,但是到底听多少还是不好预测的,而且naive的想法是取均值,但是同样有一个灾难的问题就是往上累加的时候还是会出现很大的偏差。



一个可行的办法是把预测的值修改成均值,也就是前面180天平均到每一天的均值,这样预测出来的也就是一个实数而不会像整数那样偏差这么大,通过这个转化也就勉强5000分的样子。



其实从结果可以看出,这个角度获取不可行,因为确实抖动太大,而且从公式的角度去看,这个过程很容易就出现了本来是极小值,但是最后预测成了极大值,这样就会造成致命的损失。


To be continued...

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: