比赛页面:http://www.kaggle.com/c/MusicHackathon
先来看看比赛提供了哪些数据呢?
train:
训练集有6个特征,如下:
需要预测的就是Rating。(test就少了个rating)
words(包含的是user对每个artist的评价),特征有artist、user、heard_of、own_aritist_music、Like_Aritist、words_discription(最后一个特征是一个很长的向量word vector)
剩下的还有User和UserKey 都是对User的特征。
最后的评判标准是rating的RMSE。
先分析思路。
如果只看train这个数据集的话,就是一个推荐的问题(Collaborative Filtering,想想Netflix)。 一般的话可以用相似性(user-based、item-based)也可以用隐模型(latent model、SVD、Factorial Machine)。
如果加入了words和User的信息,那么会增加很多的特征。这个时候,如通过以rating为目标变量,讲train中(user,artist)对用words和User中的特征代替,那么又可以变成一个回归问题。
虽然我没有完全看过数据集,但是一般来说,在train/test中,并不是每一个(user,artist)都会在words中出现,因此,我们可以把出现的部分做成回归模型,而把整个train做一个CF模型(SVD、FM等)。
说完基本思路,先看看参赛者主要用到哪些方法,然后详细分析3rd的做法(http://mewo2.com/kaggle/2012/07/29/emi-music-hackathon---how-i-did-it/)
1. 回归模型。 看成回归模型的时候,有些人先做了特征选择(lasso), 有些则是针对每一个artist构建一个回归模型(artist较少,这一步据说对结果有一定帮助)。模型的话,包括gbm、Random Forest
2. Collaborative Filtering: 大部分人用的是latent factor model(也有item-based,效果一般)。主要用到SVD++(Netflix)和BiasdMatrixFactorization来做,工具用的是libFM。需要说的是,训练SVD的时候,貌似是用MCMC效果比较好。(大家可以思考下为什么?)
3. 取得比较好的结果是把上面两者结合起来。 就直接average。
最后看看3rd大神的做法。基本逃不出上面的套路。不过可以看得更具体些,从特征建立到模型探索。
由于words包含大量的NA数据,他的做法是一部分用mean/media填充,一部分是干脆自己把NA作为一个新的变量值(适用于categorical的特征)。
1. 把这些得到的特征,和train做融合后,直接放进RF/GBM/Linear Regression。 效果比较好的是RF。
2. 对每个artiest分别建立一个regression model。上面提到过。
3. SVD。 自己动手写了C版本,并且取了2个svd model - 一个latent factor多 一个latent fator少。
4. Nearest Neighbor: 就是上面提到的user-based。
5. blending model: 用的神经网络做融合,输入是上面这些model,一层隐藏层(5个单元),输出层是skip-layer connections(就是和输入层和隐含层都有连接)