如何处理推荐中的隐含数据

数据挖掘 推荐系统
2021-09-28 07:36:34

推荐系统会记录向特定用户提出的推荐以及该用户是否接受推荐的日志。就像是

user_id item_id result
1       4       1
1       7       -1
5       19      1
5       80      1

其中 1 表示用户接受了推荐,而 -1 表示用户没有响应推荐。

问题:如果我要根据上面描述的那种日志向一堆用户推荐,并且我想最大化 MAP@3 分数,我应该如何处理隐式数据(1 或 -1)?

我的想法是将 1 和 -1 视为评级,并使用分解机器类型的算法预测评级。但这似乎并不正确,因为隐含数据的不对称性(-1 并不意味着用户不喜欢推荐)。

编辑 1 让我们在矩阵分解方法的背景下考虑它。如果我们将 -1 和 1 视为评级,则会出现一些问题。例如,用户1喜欢在潜在因素空间中在一个因素(例如,具有优美的背景音乐)中得分高的电影A。系统推荐了在“华丽背景音乐”中也得分很高的电影 B,但由于某种原因用户 1 太忙而无法查看推荐,我们给电影 B 评分为 -1。如果我们只是平等对待 1 或 -1 , 则系统可能不鼓励向用户 1 推荐 BGM 优美的电影,而用户 1 仍然喜欢 BGM 优美的电影。我认为这种情况是应该避免的。

1个回答

您的系统不仅接受了推荐项目的培训,对吗?如果是这样,您在这里有一个很大的反馈循环。我希望你想从所有点击/浏览中学习。

你认为不看某个项目是一个负面信号。我强烈建议你不要那样对待它。不与某物互动几乎总是最好被视为没有信息。如果您有一个明确的信号表明不喜欢,例如反对票(或者,可能观看了 10 秒的视频并停止),那么这可能是有效的。

我不会将此输入解释为类似评级的数据。(尽管在您的情况下,您可能会侥幸逃脱。)而是将它们视为权重,这正是 @Trey 在评论中提到的关于 ALS 的 Hu Koren Volinsky 论文中的处理方法。这使您可以记录正/负交互的相对强度。

最后我要指出的是,这篇论文虽然很可能是你要找的,但没有提供负权重。以这种方式扩展很简单。如果你走得那么远,我可以为你指出简单的扩展,它已经存在于我所知道的两个实现中,在SparkOryx中。