推荐系统开源工具 – SVDFeature
SVDFeature是我们(上海交大Apex实验室)在参加KDDCUP 2011期间开发的。通过这个工具,我们和港科大(HKUST)的联合小组InnerPeace在KDDCUP 2011中获得Track 1第三名,并创造单模型最好成绩。在此分享给大家,并希望和大家有更多的交流。工具总体感觉是:
(1)基于feature的可扩展性 —— SVDFeature实现了我们的基础模型feature-based matrix factorization。有了这个工具之后,CF算法部分被封装,设计新模型只需要关注如何生成特征,不需要修改任何训练代码。团队成员能够集中精力在各种信息的利用上面。
(2)大规模数据的可适应性 —— SVDFeature可以使用较少的内存去做大规模的实验。这主要是我们不需要将所有训练数据都读入内存。同时为了提高效率,我们使用了两个独立线程分别负责从硬盘读取训练数据和更新权重。最终我们能用2G内存花一天不到的时间在KDDCUP 2011 Track 1上跑出RMSE=22.16的单模型结果。
推荐系统不需要用户输入查询词,而是根据用户的历史行为判断用户的喜好,进而推荐出用户可能喜欢的物品。这是它和和搜索引擎的一大区别。那么既然没有明确的用户喜好,推荐系统就需要抓取尽可能多的,有价值的信息来捕捉用户的喜好。
近年来,一些推荐系统的比赛开始将重点转至信息的挖掘与利用上面。Yahoo! Music Recommendation (KDDCUP 2011)包括了用户收听音乐的时间,音乐的专辑,艺术家,类别。Context-aware Movie Recommendation (CAMRa 2010-2011)在此基础之上更强调了context信息,例如用户所在的家庭,收看电影时的心情。从比赛的结果来看,充分利用这些信息能使推荐系统的效果得到很大的提高。
这里就会有一个问题了:面对不同的Task,不同的数据集,我们需要抽取不同的信息将其加入到推荐系统之中。例如Yahoo! Music Recommendation可以加入音乐的专辑,艺术家,类别;Context-aware Movie Recommendation可以加入用户的家庭,心情等。相信实现过多个推荐系统的朋友都知道这是一件麻烦的事情。有没有一个很好的框架能概括这种信息融入的形式呢?
我们找到了feature-based matrix factorization这个模型。它在经典的matrix factorization的基础之上,融入了feature的概念。预测公式可以写成如下形式:
简单地解释下,等式右边前两项就是feature产生的bias,其中包括了global features (g), user featuers (u)和item features (i)。最后一项是矩阵分解项,不过user/item latent factor也是通过user/item feature进行选取并合成的。这样,share相同user/item feature的users/items就会share对应的user/item latent factor以及feature bias。为了更好的解释,这里加一幅示意图:
通过feature-based matrix factorization,我们就能通过将我们需要的信息转化成feature的形式加入到推荐系统中,去帮助系统更好的学习出用户的喜好。我们写了SVDFeature这样一个toolkit来专门做feature-based matrix factorization。这样一来,开发人员只需要将手里拥有的数据转化成预先定好的格式,其他的事情就是Feature-based matrix factorization了。这就好比用 做文本分类一样。
通过设置user/item/global features,SVDFeature可以实现当今CF领域的大多数有名的算法:temporal dynamics,neighborhood,hierarchy information,implicit/explicit feedback (SVD++)。另外,值得一提的是SVDFeature能够很方便的做pairwise ranking,即是以排序为目标进行的训练,最终推荐给每个user一个list的item。由于有了这一点,我们可以算是没有改一行代码,就又参加了CAMRa 2011 (推荐一个list的movie给每个家庭)。更多详细的信息请见我们的technical report以及toolkit manual。http://apex.sjtu.edu.cn/apex_wiki/svdfeature
希望这个开源工具能对大家的研究有所帮助。欢迎大家提供宝贵的意见。我们会继续将SVDFeature做的更好:)