RUCAIBox / RecBole

A unified, comprehensive and efficient recommendation library
https://recbole.io/
MIT License
3.35k stars 603 forks source link

rating_field和label_field的定义 #975

Closed miloooooz closed 2 years ago

miloooooz commented 3 years ago

您好,我想确认一下rating和label在RecBole中的定义是什么? 从这个问题我了解到如果想要分析某个值,比如在这里是我的商品评分,那就将它列为label #817 ,可是这样的话rating_field的含义是什么呢?并且这位提问者最终在 #819 训练context-aware的时候.inter文件并没有定义任何除了user_id和item_id以外的feature,config如下:

field_separator: ','
seq_separator: '|'
load_col:
    inter: [user_id, item_id]
    item: [item_id,feat1,feat2,feat3,feat4,feat5,feat6,feat7,feat8,feat9,feat10,feat11]
    user: [user_id,ufeat1,ufeat2,ufeat3,ufeat4,ufeat5,ufeat6]
eval_step: 5
learner: adagrad
eval_setting: RO_RS,pop100
group_by_user: False
training_neg_sample_num: 1
metrics: ["Recall","MRR","NDCG","Hit","Precision"]
valid_metric: MRR@10
threshold: ~

这种情况下模型是根据什么来给user和item的pair打分的呢?这里困扰了我很久。 我们需要预测的标准是rating吗?这个label的设置是作为feature来告诉模型正负样本的定义还是作为模型的预测根据,最终输出一个概率来表示预测为1的可能性? 非常感谢。

Sherry-XLL commented 3 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 设计了三种方法来设置数据标签:

对于 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 的关注。

miloooooz commented 3 years ago

@Sherry-XLL 您的回答非常详细,这篇回答也很全面得解决了我的疑问,太感谢了!

miloooooz commented 2 years ago

@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_argsmodel的设置而预测不同的true value,比如我没有设置的时候预测值为打分,我设置modellabeled后预测值为某个item标签为1的概率等等。我个人在学习的时候产生了不少疑问,深感愚钝,非常抱歉

Sherry-XLL commented 2 years ago

@miloooooz 您好,中秋快乐🎑。CTR (Click-Through-Rate) 即点击通过率预估就是一个二分类问题,当设置 modelabeled 时您就可以将任务当作二分类问题来看待。

miloooooz commented 2 years ago

@miloooooz 您好,中秋快乐🎑。CTR (Click-Through-Rate) 即点击通过率预估就是一个二分类问题,当设置 modelabeled 时您就可以将任务当作二分类问题来看待。

谢谢,学到了!辛苦啦

luoluo1997a commented 2 years ago

您好,请问如果我想模型输出的是真实的评分数据,该怎么做呢?比如我的评分是1-5分,我希望能够输出真实的分数,而不是0-1的值。