Librec 学习笔记(五):使用 Librec 快速复现 BPR 算法以及对比它的改进算法
这是目录
一、BPR 的介绍
BPR,UAI,2009,来自 Rendle 的论文 BPR: Bayesian Personalized Ranking from Implicit Feedback。
BPR 的提出旨在解决物品之间的顺序问题,提出了一个可以应用于各个已有的推荐算法的算法框架,这个算法框架的建模目标是优化物品之间的顺序,解决推荐的物品之间的排序问题。
提出的基本假设是,对于一个观察的交易 (u,i) 和一个未观察到的交易 (u,j),BPR 倾向于认为用户相对于物品 j 来说更加喜欢物品 i。
二、近年来在 BPR 上的经典改进算法
1、WBPR
WBPR,JMLR,2012,来自 Gantner 的论文Bayesian Personalized Ranking for Non-Uniformly Sampled Items。
针对 BPR 中的 negative sampling 进行改进,认为不应该只简单的 uniform sampling 而应该对 negative item 赋予相应的权重。
2、GBPR
GBPR,IJCAI,2013,来自 Pan and Chen 的论文GBPR: Group Preference Based Bayesian Personalized Ranking for One-Class Collaborative Filtering。
在 BPR 方法中有两个基本假设可能不总是成立的:
(1)两个用户之间彼此独立(2)对个体而言,两个产品的成对偏好。基于此,该论文提出一种新的改进的假设:引入用户之间丰富的交互作用。作者引入了“群偏好”的概念,来 relax 之前提到的个体性假设和独立性假设。作者认为即使用户对产品 i 表达过偏好,而对产品 j 没有表达过偏好;但是用户 u 可能相比于产品 i 更偏好产品 j 。此外,两个用户 u 和 w 可能是相关的,因此他们的联合似然函数不能分解为两个独立的似然函数。参考链接。
3、SBPR
SBPR,CIKM,2014来自 Zhao 的论文Leveraging Social Connections to Improve Personalized Ranking for Collaborative Filtering,提出假设用户更加倾向于喜欢用户朋友喜欢的东西。
4、AoBPR
AoBPR,WSDM,2014来自 Rendle and Freudenthaler 的论文Improving pairwise learning for item recommendation from implicit feedback 。
BPR 的目的是加大观察到的物品和未观察到的物品之间的差距,但 uniform sampling 似乎不能够明显加大这一点,尤其是当物品有长尾分布现象的时候。因此作者提出了 static sampling 和 Adaptive sampling 两种策略来进行改进。librec 中实现的是第二种算法。
5、MBPR
MBPR,CIKM,2018来自 Runlong Yu 的短论文Multiple Pairwise Ranking with Implicit Feedback。
BPR将物品分为观察到的物品和没有观察到的物品,MBPR把物品分为 positive item、negative item 以及uncertainty negative item,并且提出了下图的假设。
三、实验比较BPR算法以及它的改进算法
下面直接使用东北大学郭贵冰老师提出的Librec开源算法库来比较这些算法的实际效果,对于每一个方法的实现,我们都使用公布在 Librec 上的最佳参数。
这里使用 Librec 自带的 Filmtrust 和 Epinions 数据集进行实验,评价指标使用的是 Librec 中自带的排序任务常用的指标:Precision、Recall、AUC、NDCG、Novelty、RR、AP。
下面分别按不同的数据集来进行实验。
1、使用数据集 Filmtrust 进行实验
FilmTrust 为2011年从网站 FilmTrust 完整抓取下来的数据集,由 1508 个用户以及 2071 个物品组成,共包含 35497 条数据, 保存形式为 userid, movieid, movieRating。
适用于社会化推荐任务,规模较小,包含用户对电影的评分信息,同时包含用户间的信任社交信息。 下面给出的是在 liberc 命令行上运行的相关算法的命令以及最终的结果:
(1) 几个算法在 librec 上运行的相关命令
BPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/bpr-test.properties
,运行时间<1min
WBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/wbpr-test.properties
,运行时间1min
GBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/gbpr-test.properties
,运行时间<1min
SBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/context/ranking/sbpr-test.properties
,运行时间<1min
AoBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/aobpr-test.properties
,运行时间<1min
(2)几个算法在 filmtrust 数据集上运行的结果
Method | Precision | Recall | NDCG | AUC | Novelty | AP | RR |
BPR | 0.3410 | 0.6154 | 0.6349 | 0.9197 | 14.2979 | 0.4356 | 0.5878 |
WBPR | 0.3045 | 0.4625 | 0.4610 | 0.8458 | 13.2545 | 0.3227 | 0.4189 |
GBPR | 0.3471 | 0.6361 | 0.6166 | 0.9291 | 11.3029 | 0.4432 | 0.5898 |
SBPR | 0.3298 | 0.5875 | 0.5900 | 0.9068 | 15.7255 | 0.4255 | 0.5630 |
AoBPR | 0.3425 | 0.6127 | 0.6073 | 0.9155 | 13.7258 | 0.4391 | 0.5877 |
结果分析:
从实验结果的 Precision 和 Recall 以及 AUC 来看,这些算法在 Filmtrust 数据集上的效果真的是非常好的,当然这也不排除 Filmtrust 数据集本身很小的原因。
以上的 5 个算法中,GBPR 在 5 个指标上都取得了最好的实验结果。(为什么?我也不知道怎么分析这个结果)
2、使用数据集 Epinions 进行实验
此为Epinions数据集下载地址,由 Paolo Massa在Epinions.com 网站上进行了为期5周的爬行(2003年11月/ 12月),数据集包含 49,290 位用户,至少评价过 139,738 件不同商品,撰写 664,824 条评论和 487,181 条已发布的信托声明。 用户和项目由匿名数字标识符表示。
该数据集一般适用于社会化推荐任务,规模较大,包含用户对电影的评分信息,同时包含用户间的信任社交信息。
在 librec 中默认运行的数据集是 Filmtrust,所以需要另外指定运行 epinions 数据集的命令,具体操作是在命令行加入以下配置参数即可:-D data.input.path=epinions/rating/ratings_data.txt
,另,SBPR 除了使用到评分数据外,还用到了用户的社交网络数据,在命令行另加上以下参数配置:-D data.appender.path=epinions/trust/trust_data.txt
。
下面给出的是在 liberc 命令行上运行的相关算法的命令以及最终的结果:
(1) 几个算法在 librec 上运行的相关命令
BPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/bpr-test.properties -D data.input.path=epinions/rating/ratings_data.txt
,运行时间8min
WBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/wbpr-test.properties -D data.input.path=epinions/rating/ratings_data.txt
,运行时间大于12h,没有等下去…
GBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/gbpr-test.properties -D data.input.path=epinions/rating/ratings_data.txt
,运行时间15min
SBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/context/ranking/sbpr-test.properties -D data.input.path=epinions/rating/ratings_data.txt -D data.appender.path=epinions/trust/trust_data.txt
,运行时间52min
AoBPR 运行命令:librec rec -exec -conf ../core/src/main/resources/rec/cf/ranking/aobpr-test.properties -D data.input.path=epinions/rating/ratings_data.txt
,运行时间6h
(2)几个算法在 Epinions 数据集上运行的结果
Method | Precision | Recall | NDCG | AUC | Novelty | AP | RR |
BPR | 0.0069 | 0.0140 | 0.0302 | 0.5306 | 67.2000 | 0.0050 | 0.0210 |
GBPR | 0.0062 | 0.0175 | 0.0263 | 0.5287 | 58.8410 | 0.0051 | 0.0173 |
SBPR | 0.0095 | 0.0219 | 0.0433 | 0.5397 | 86.9967 | 0.0098 | 0.0333 |
AoBPR | 0.0068 | 0.0172 | 0.0284 | 0.5307 | 66.9630 | 0.0056 | 0.0184 |
结果分析:
Epinions 数据集相比较于 Filmtrust 数据集大了非常多,所以这些算法运行的时间也都延长了很多,尤其是 WBPR 算法,运行了12个小时,才进行到第10次的迭代更新参数,这里时间花费最短的是 BPR,值得夸奖!
SBPR 算法在 6 个指标中都拿到了最好的效果,可见“用户会被朋友影响”这种因素在推荐场景中着实是需要去考虑的。
读完以上内容,不出意外,您大概已经知道如何使用 librec 库快速对比 BPR 算法以及它的改进算法了!ヾ(◍°∇°◍)ノ゙
本人目前刚开始学习使用 librec,欢迎同伴一起交流进步,哪里有写的不对的地方,欢迎评论指正呀!ヾ(◍°∇°◍)ノ゙
如果这篇博客帮助了您,可以请我吃包5毛钱的辣条吗?(下面为微信收款码)或者点个赞也行呀!您小小的鼓励会是我持续更新的动力!ヾ(◍°∇°◍)ノ゙