Closed miloooooz closed 2 years ago
@miloooooz 您好,一般在学术研究领域,我们目的往往不是让模型对 user-item 的评分和原始的评分越接近越好,而是通过用户的历史交互记录 (.inter, 可能包含评分等)、用户属性 (.user) 、商品属性 (.item) 、时间戳 (TIME_FIELD)、KG information(.kg) 等信息挖掘出用户的喜好,具体使用的信息与模型类别有关。
在推荐系统领域有两种数据场景:显式反馈场景 (explicit feedback scene) 和隐式反馈场景 (implicit feedback scene)。
显示反馈,就像评分 (rating) ,我们可以很容易地通过评分看出用户对商品的喜好,比如豆瓣电影的评分,打 5 星表示用户非常喜欢这部电影,而打 1 星表示不喜欢。这种情况下,我们可以设置一个阈值 threshold
,不低于阈值评分的 user-item 为正例,低于阈值评分的 user-item 为负例。可想而知,通过这种方式划分的正负例置信度较高。
然而,显示反馈信息的获取成本高,数据量少,我们可能在豆瓣浏览很多电影的主页,但只对极少数电影评分,这种情况下,如果能充分利用点击 (click) 等隐式反馈信息,便能大幅度地提升推荐的质量。在隐式反馈的情景下,没有 rating
,只有 user 和 item 的交互对,即 inter: [user_id, item_id]
,此时我们难以确定交互的正负样本属性,数据的标签是模糊的。通常我们将所有观察到的交互视为正样本,并从未观察到的交互中选择负样本,称为负采样。
RATING_FIELD
是数据集中表示评分的一列,这是数据集的原始信息。一般情况下我们并不是直接使用评分,而是利用评分信息划分正负例,即构造 0/1 标签列的 label
。为了同时支持显式反馈场景和隐式反馈场景,RecBole 设计了三种方法来设置数据标签:
LABEL_FIELD
告知模型哪个列表示数据的标签;rating
),则为其添加标签的一般方法是设置阈值 threshold
;对于 RecBole 的标签设置,可以参考 Label of data 中的示例。
推荐系统有两种推荐任务:评分预测和项目排序,RecBole 支持基于值 (value-based) 和基于排名 (ranking-based) 的评估指标。
对于评测指标的定义和计算,可以参考 recbole.evaluator.metrics 的相关内容。
Context-aware 模型利用用户、项目和交互的特征 (feature) 进行 CTR 预测,因此模型需要加载所使用的特征。Context-aware 推荐模型主要用于显式反馈场景,因此数据应该具有显式反馈信息,并且需要为它们设置标签。此时 eval_args
中的 model
设置为 labeled
,它默认是对交互记录对应的 label 做预测,因此相当于你的测试集是 10% 的交互记录,真实值是设置的标签,此时模型使用 AUC 等评分预测的 value-based metrics 作为评测指标。您所提到的 issue 是 RecBole 支持的另一种情况,RecBole 支持通过与一般推荐模型一样的完整排名 (full sort) 来评估 context-aware 推荐模型,但此时需要确保 .inter
文件不能加载任何其他上下文信息列,这种情况下模型用 Recall 等 ranking-based evaluation metrics 作为评测指标。
对于 RecBole 的模型用法,可以参考 Running Different Models 中的示例。
RecBole 是面向学术研究者的推荐系统,如果您对这个领域感兴趣,非常推荐您阅读推荐系统的综述论文来系统性地梳理相关知识,感谢您对 RecBole 的关注。
@Sherry-XLL 您的回答非常详细,这篇回答也很全面得解决了我的疑问,太感谢了!
@Sherry-XLL 您好,中秋快乐。您的解答给我非常多的启发,我在学习的过程中产生了另一个疑问。
您这里说到
一般情况下我们并不是直接使用评分,而是利用评分信息划分正负例,即构造 0/1 标签列的
label
。
我的理解是这里是个二分类问题,我们要用'label'作为标签去预测user选择这个item的概率。但是我在看RecBole文档的时候看到的predict
方法返回的都是score for given users and items
,这里我就有点不大理解了。
Context-aware 模型利用用户、项目和交互的特征 (feature) 进行 CTR 预测,因此模型需要加载所使用的特征。Context-aware 推荐模型主要用于显式反馈场景,因此数据应该具有显式反馈信息,并且需要为它们设置标签。此时
eval_args
中的model
设置为labeled
,它默认是对交互记录对应的 label 做预测,因此相当于你的测试集是 10% 的交互记录,真实值是设置的标签,此时模型使用 AUC 等评分预测的 value-based metrics 作为评测指标。
您在这里提到context-aware在我设置标签和eval_args
后可以预测label,我是否可以理解为这个不同模型的predict
方法会根据我eval_args
中model
的设置而预测不同的true value,比如我没有设置的时候预测值为打分,我设置model
为labeled
后预测值为某个item标签为1的概率等等。我个人在学习的时候产生了不少疑问,深感愚钝,非常抱歉
@miloooooz 您好,中秋快乐🎑。CTR (Click-Through-Rate) 即点击通过率预估就是一个二分类问题,当设置 mode
为 labeled
时您就可以将任务当作二分类问题来看待。
@miloooooz 您好,中秋快乐🎑。CTR (Click-Through-Rate) 即点击通过率预估就是一个二分类问题,当设置
mode
为labeled
时您就可以将任务当作二分类问题来看待。
谢谢,学到了!辛苦啦
您好,请问如果我想模型输出的是真实的评分数据,该怎么做呢?比如我的评分是1-5分,我希望能够输出真实的分数,而不是0-1的值。
您好,我想确认一下rating和label在RecBole中的定义是什么? 从这个问题我了解到如果想要分析某个值,比如在这里是我的商品评分,那就将它列为label #817 ,可是这样的话rating_field的含义是什么呢?并且这位提问者最终在 #819 训练context-aware的时候
.inter
文件并没有定义任何除了user_id和item_id以外的feature,config如下:这种情况下模型是根据什么来给user和item的pair打分的呢?这里困扰了我很久。 我们需要预测的标准是rating吗?这个label的设置是作为feature来告诉模型正负样本的定义还是作为模型的预测根据,最终输出一个概率来表示预测为1的可能性? 非常感谢。