在线推荐系统课期末项目解法和分析


一、项目分析
竞赛主题是音乐系统设计和实现。问题定义为: 在某一个给定时间段内,已知某个user听了一首歌song,然后预测在一个月之内该user是否会再次听这首song的概率。与一般的推荐不同的是,这里并不是向用户推荐新歌,而是预测用户是否会重复听某一首歌。所以,这个问题类似于CVR预估(听了一次类似于CTR预估,而再次听则类似于CVR预估),可以用LTR的框架来解决问题。
题目给出的数据主要有:
• Train: user-song pairs 以及相应的context信息,比如source type/screen name/system。每个pair都有一个标签:1表示再次听过,0表示没有。
• Test: 跟Train完全类似,只是没有标签。
• Song: 所有song的相关信息,如演唱者,词/曲作者,语言等等。
• Member: 所有user的相关信息,如出生年月,性别,城市等等。

二、总体框架:特征和模型
整个解决方案基本是照搬了冠军(链接见结尾)的模板,因此这个总结可以理解为对冠军思路的一个复现和解析。对源代码进行了一些修改,因为(1) 源代码是在旧的python和一些相关库的版本上运行的,有一些bug;(2) 源代码给出了核心代码,但是不是完整的,比如后面的模型融合,需要自己添加。整个问题基本的解决思路可以用以下slide很好概括:

项目概述.png


主要用到的features包括以下几类:
1. 全局统计特征:
a. 用户,歌曲,演唱者,词作者,类别等总数
b. 概率特征:比如用户喜欢收听的演唱者概率P(artist|user), 歌曲播放的来源概率 P(sourcetype|song)等等。
2. Embedding特征:
a. SVD of user-song 共现矩阵
b. SVD of user-artist共现矩阵
3. 时序类统计特征:
a. 某一时刻变长size的时间窗口内出现的用户和歌曲的总数
b. 用户和歌曲出现时刻的平均值和方差
4. 上下文特征:
a. 每个用户上一时刻和下一时刻听的歌曲
b. 每个用户上一时刻和下一时刻使用的歌曲来源

采用了两个模型:LightGBM和DNN。其中DNN模型的示意图原作者已经给出,有以下几个特点:
1. 特征输入部分分为三块:user field, song field 和 context field
2. 对categorical feature添加了L2正则项防止过拟合
3. 设置了一个dot product层处理user和song的 embedding来增加抽象交叉特征

三、结果分析
由于时间原因没有进行cross-validation和调参,而是直接拿原作者的参数用于模型。其中LGB训练了一个模型,作为树模型输出;而DNN训练了40个模型,每个模型结构一样,但是重要参数都在一个原作者建议的范围内随机取值。将这40个模型的平均输出作为神经网络模型输出。最终的结果采用了0.6 * LGB + 0.4 * DNN,Public Score的分数截图如下和排名如下:
可以看出最后的结果甚至好于冠军。原因可能有两点:(1)我对于一些缺省值进行了填充处理,而原作者没有(2)我采用了40个NN模型作为ensemble,而原作者只用了30个。


成绩排名.png


冠军solution github链接:https://github.com/lystdo/Code ... ution
我的solution github链接:https://github.com/july-ML6-fi ... ation
已邀请:

要回复问题请先登录注册

返回顶部