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,并且提出了下图的假设。
Librec 学习笔记(五):使用 Librec 快速复现 BPR 算法以及对比它的改进算法

三、实验比较BPR算法以及它的改进算法

下面直接使用东北大学郭贵冰老师提出的Librec开源算法库来比较这些算法的实际效果,对于每一个方法的实现,我们都使用公布在 Librec 上的最佳参数。

这里使用 Librec 自带的 FilmtrustEpinions 数据集进行实验,评价指标使用的是 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毛钱的辣条吗?(下面为微信收款码)或者点个赞也行呀!您小小的鼓励会是我持续更新的动力!ヾ(◍°∇°◍)ノ゙
Librec 学习笔记(五):使用 Librec 快速复现 BPR 算法以及对比它的改进算法