由于论坛发帖限制,链接和图片内容见CSDN博客
阿里音乐流行趋势预测大赛一起做-(6)小结
部分内容如下:
最近一直在忙毕业的事情,比赛也落下不少。今天第一次切换了数据,在此对之前的工作做个简单的总结。感谢组委会岱月邀请我写自己的参赛经历,《天池小白成长记》在阿里的“天池大数据科研平台”上发布了,还是蛮激动的。好啦,进入正题!
扒一扒别人的方法
在论坛和QQ群里看到有部分同学透露自己的方法,我就顺道记下来啦,注:以下成绩均为6月7日切换数据前的成绩,评分时间大概在6月1日到6日之间
1、RNN(递归神经网络)
有位大神用RNN预测,不过收敛比较严重,加入了星期特征,成绩约6200。
这应该是一周前的成绩了,现在不知道怎么样了。喜欢神经网络的同学可以试试。
2、GBDT
有人放了星期、节假日、三日均值等特征,得分6350。
这个算法复赛平台里有,所以初赛复赛可以较好地衔接。
3、ARIMA
有几个人直接用的auto.arima,不过得分大不同。有人得分6200、6300,有人得分6455。有一个得分6459的同学给的提示是:用你能想到的一切的方法去切割数据集。不止50个数据集,还要对歌手近一步切割。
时序算法复赛平台里目前没有。
4、Random forest
有人得分得分6444,有人6483,也有人改进后提升到6518。
这个算法复赛平台里有。
5、小波包分解
有人对每天的播放人数进行小波分解(直接调Python包),分解3层以上,周期感觉很明显。按照艺人每天不同的播放人数,把趋势分解出来,剩下的是随机波动,有很明显的周期,7天左右。
我猜测该同学是信号处理专业的,有兴趣同学也可以试试傅里叶变换等信号处理算法,有可能独辟蹊径。
6、其他方法
有人滑动窗口取均值+规则,得分6400。有人聚类+规则得分6528。
这里的聚类我觉得应该是用户分类或者歌曲分类吧,细节没有透露。
在群里看到一位同学说的好:“现阶段大家多尝试尝试些新东西 ,就会发现玩着玩着就入门了,就有想法了,就变的厉害了, 这是我这阶段的收获。 “
不推荐的方法
之前试过不少方法,时间序列、回归里的多种模型,实际测试后发现某些方法想想挺美好,实际使用时却不合适(个人观点,也许是我做的不好,有兴趣的自己尝试,以免受我误导)。
1、曲线拟合
刚开始觉得每个歌手的播放曲线都有其趋势,比如上升,下降,平稳等,用曲线拟合应该可以很好的把趋势抓出来吧。
我选取了某一个歌手的播放量分别对最后一个月、最后两个月做了简单的拟合试验,曲线拟合Python代码如下:
# 对数据集做曲线拟合
from pandas import Series, DataFrame
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# import dataset
importdata = pd.read_csv('F:/AliMusicTianChi/data/2e14d32266ee6b4678595f8f50c369ac.csv')
#x = importdata['Ds']
x = np.linspace(1,183,183) #生成1到183的数
y = importdata['play_num']
x1 = x[-60:]
y1 = y[-60:]
x2 = x[-30:]
y2 = y[-30:]
z1 = np.polyfit(x1, y1, 1) #用1次多项式拟合,可更改为更高次
z2 = np.polyfit(x2, y2, 1)
p1 = np.poly1d(z1)
p2 = np.poly1d(z2)
y1new=p1(x1) #拟合值
y2new=p2(x2)
plt.figure()
plt.plot(x, y, '*-',label='original values')
plt.plot(x1, y1new, 'r*-',label='polyfit 2months')
plt.plot(x2, y2new, 'g*-',label='polyfit 1month')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend()
plt.title('polyfitting-2e14d32266ee6b4678595f8f50c369ac')
predict_x = np.linspace(184,244,61)
predict_y1 = p1(predict_x)
predict_y2 = p2(predict_x)
plt.plot(predict_x, predict_y1, 'k*-',label='fit2months predict')
plt.plot(predict_x, predict_y2, 'b*-',label='fit1month predict')
plt.savefig('polyfitting1.png',dpi=400,bbox_inches='tight')
一次线性拟合结果如下图。
这里写图片描述
容易发现选取不同时间段的拟合结果差别很大,预测的结果趋势走向都不一样。那2次曲线拟合会不会好一点,我们把上述代码中的z1 = np.polyfit(x1, y1, 1)的最后一个参数1改为2,结果如下:
这里写图片描述
同样地,三次曲线拟合如下:
这里写图片描述
我们发现阶数高于2次后的曲线是完全发散,不可控的,而2次曲线和一次线性拟合对于时间段的选取和数据集的选取非常敏感,所以曲线拟合的想法只是想起来很美好而已。
另外,我还另外尝试了其他方法,如样条插值,效果都不理想。所以果断的放弃了该方法。
2、时间序列
刚开始我也是用时间序列在做,发现越做越难做下去。总结有如下几点:
1)时间序列在复赛平台上没有库。这点在“扒一扒”里也提到了,所以即使你时间序列运用的炉火纯青了,复赛没有支持的算法库调用也是很悲催的。除非你自己写,但是工作量非常大。
2)时间序列参数很难调。大部分人还是直接掉auto.arima省事,也有部分人自己研究参数的选取。以ARIMA为例,使用时需要用某种方法(差分、平滑等)将数据转换为适合它处理的平稳时间数据,这在很多时候是很难做到的。定阶、评价参数等都需要有一定时间的研究才能完全吃透。
3)工作量大。对每个歌手都要调出一个满意的参数和预测结果需要何等的时间和勇气啊!
推荐的方法
前面说了,时间序列方法不推荐(并不代表不可行),根据大家的讨论,大部分同学还是采用回归的方法来进行预测的。
回归方法相比时间序列方法还是有不少好处的:
1)不需要将数据处理成严格的时间序列形式,也不需要把数据变成平稳序列。
2)回归模型很多,常用的有LR,GBDT,XGBOOST,RF等。
3)可以方便的切入自己的特征。
但是也是有不少问题的:
1)一般的时间特征(星期、假日、月等)可以在预测集中得到,但是其他的特征比如下载量如何在预测集中得到?这是困扰大家的难题之一。
2)这么多模型,如何选取?这么多特征,如何选取?
推荐的思路
1、用户或者歌曲分类
去年资金预测的第一名的大熊就做了初步的用户分类,这也是他和其他几个团队相比的一个重要胜出因素。我觉得音乐预测也一样,这方面应该有搞头。
2、特征选取和挖掘
赛题中的数据给了很多,目前为止大部分的人还是只用了播放量这一个特征,其他的特征如果能很好地嵌入应该会有大幅度的提高。
3、不同的滑动窗口
不同曲线取不同的滑动窗口得到的结果差异是非常大的。这一点也可以深入一点挖。
4、数据预处理
是否需要去掉那些操作记录非常少的用户?是否需要平滑抖动非常大的曲线,这些工作也值得深入。
后记
好吧,就写到这里。写博客分享攒人品!我们队的成绩很久没有提升了,希望能早点突破!希望大家能有所收获,欢迎留言或私信讨论!
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。