RUCAIBox / RecBole

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

如何根据已经划分好的数据生成训练、验证、测试数据集呢? #1624

Open Tonyboy999 opened 1 year ago

Tonyboy999 commented 1 year ago

官方demo是通过对一个数据集文件按照一定划分出训练、验证、测试集。但是我的训练,验证和测试集是划分好的。已经单独保存了三个.inter文件。这种情况下如何生成训练、验证和测试的dataset以及dataloader呢?实在是找不到相关的demo或者api

stellarkey commented 1 year ago

可以魔改一下:

Tonyboy999 commented 1 year ago

@stellarkey 谢谢,官方真没有相关的API吗,有点奇怪😂

Sherry-XLL commented 1 year ago

@Furyboyy 您好,我们提供了参数 benchmark_filename 来传入划分好的数据集,详情可以参考使用文档

Tonyboy999 commented 1 year ago

@Sherry-XLL 您好,我试试,感谢!

Tonyboy999 commented 1 year ago

@Sherry-XLL 您好,我在实例化dataset的时候出现了error 完整错误信息

AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_23/1364988129.py in <module>
----> 1 dataset = create_dataset(config)
      2 logger.info(dataset)

/opt/conda/lib/python3.7/site-packages/recbole/data/utils.py in create_dataset(config)
     68             return dataset
     69 
---> 70     dataset = dataset_class(config)
     71     if config["save_dataset"]:
     72         dataset.save()

/opt/conda/lib/python3.7/site-packages/recbole/data/dataset/sequential_dataset.py in __init__(self, config)
     36         super().__init__(config)
     37         if config["benchmark_filename"] is not None:
---> 38             self._benchmark_presets()
     39 
     40     def _change_feat_format(self):

/opt/conda/lib/python3.7/site-packages/recbole/data/dataset/sequential_dataset.py in _benchmark_presets(self)
    162         )
    163         self.inter_feat[self.item_list_length_field] = self.inter_feat[
--> 164             self.item_id_list_field
    165         ].agg(len)
    166 

AttributeError: 'SequentialDataset' object has no attribute 'item_id_list_field'

不知道我的Config设置是否有问题,以下是我的config

parameter_dict = {
    'data_path': './',
    'benchmark_filename': ['train', 'test', 'test'],
    'USER_ID_FIELD': 'session',
    'ITEM_ID_FIELD': 'aid',
    'TIME_FIELD': 'ts',
    'user_inter_num_interval': "[5,Inf)",
    'item_inter_num_interval': "[5,Inf)",
    'load_col': {'inter': ['session', 'aid', 'ts']},
    'train_neg_sample_args': None,
    'epochs': 10,
    'stopping_step':3,

    'eval_batch_size': 1024,
    #'train_batch_size': 1024,
#    'enable_amp':True,
    'MAX_ITEM_LIST_LENGTH': MAX_ITEM,
    'eval_args': {
        'group_by': 'user',
        'order': 'TO',
        'mode': 'full'},
    'topk': [20, 200],
    'valid_metric': 'Recall@200'
}

config = Config(model='GRU4Rec', dataset='recbox_data', config_dict=parameter_dict)

目录结构 --Root ----训练脚本 ----recbox_data -------recbox_data.train.inter -------recbox_data.test.inter

补充一点,这个error是在dataset = create_dataset(config)这行代码执行了几分钟后才出现的

Sherry-XLL commented 1 year ago

@Furyboyy 您好,对于序列推荐模型,推荐中需要根据时间顺序给定用户的历史物品序列作为输入,即 item_id_list_field。RecBole 中默认的 benchmark_filename 参数的适用情况是,数据集已经处理好了对应用户在目标物品交互前的历史物品序列。如果您的 .inter 中只有用户和物品的信息,是无法直接调用现成 API 的。这种情况只能修改数据预处理的代码,根据实际的数据划分标准提供所需的数据格式。

Gloria-LIU commented 1 year ago

@Furyboyy 您好,对于序列推荐模型,推荐中需要根据时间顺序给定用户的历史物品序列作为输入,即 item_id_list_field。RecBole 中默认的 benchmark_filename 参数的适用情况是,数据集已经处理好了对应用户在目标物品交互前的历史物品序列。如果您的 .inter 中只有用户和物品的信息,是无法直接调用现成 API 的。这种情况只能修改数据预处理的代码,根据实际的数据划分标准提供所需的数据格式。

你好,我已经按照文档要求更改了config file,但是仍然出现上述错误

我的.inter 如下,是包含timestamp的:

user_id:token   item_id:token   rating:float    timestamp:float
104568  660597  1   0
104568  652815  1   1
104568  539097  1   2
104568  660597  1   3
104568  652815  1   4

我的config yaml 如下:

# dataset config : Sequential Recommendation
data_path: .
dataset: dset
benchmark_filename: ['part1', 'part2', 'part3']

USER_ID_FIELD: user_id
ITEM_ID_FIELD: item_id
TIME_FIELD: timestamp
load_col:
    inter: [user_id, item_id, timestamp]
ITEM_LIST_LENGTH_FIELD: item_length
LIST_SUFFIX: _list
MAX_ITEM_LIST_LENGTH: 50

数据集文件夹中也按照benchmark_filename这三个名字命名好了。

可以请问一下如何解决这个issue吗? AttributeError: 'SequentialDataset' object has no attribute 'item_id_list_field' 最奇怪的事情是,如果我们不使用自己的split而是用recbole里面提供的split方法的话,是可以跑通的。

Sherry-XLL commented 1 year ago

@Gloria-LIU 您好,对于序列推荐的数据集我们会对其进行数据增强的处理,训练的数据不是 u-i 的交互而是给定历史交互列表 item_id_list_field 预测下一个物品。在 RecBole 的内置数据处理模块中,我们会根据划分的策略将用户和物品的交互处理成 item_id_list。也就是说,如果想使用预先划分的序列数据,需要先将数据集处理成如下的格式:

session_id:token    item_id_list:token_seq  item_id:token
1   21553 20071 8762 21566 6381 21566
2   21553 20071 8762 21566  6381
3   21553 20071 8762    21566
4   21553 20071 8762
5   21553   20071

您可以参考 diginetica-session 等预处理好的时序数据集,按照您的需求修改 benchmark_filename 中的文件。

# session-based recommendation benchmarks
diginetica-session: https://recbole.s3-accelerate.amazonaws.com/ProcessedDatasets/DIGINETICA/session/diginetica_session.zip
tmall-session: https://recbole.s3-accelerate.amazonaws.com/ProcessedDatasets/Tmall/session/tmall_session.zip
nowplaying-session: https://recbole.s3-accelerate.amazonaws.com/ProcessedDatasets/Nowplaying/session/nowplaying_session.zip

同时,若您有后续的问题,建议新开一个 issue,同样可以链接到这个 issue (#1624) 来补充说明您的需求,以便我们更好地解答您的问题。

感谢您对 RecBole 的关注!

Xue-ying99 commented 2 months ago

@Furyboyy 您好,我们提供了参数 来传入划分好的数据集,详情可以参考使用文档benchmark_filename

  • benchmark_filename (list):预拆分用户-项目交互后缀列表。我们只会应用 normalize、remap-id,它不会删除 inter_feat 中的交互。然后将inter_feat除以 。例如,让我们假设数据集名为 ,并且等于 。我们将加载 、 、 并将它们视为训练的、有效的、测试的数据集。缺省值为 .benchmark_filename``click``benchmark_filename``['part1', 'part2', 'part3']``click.part1.inter``click.part2.inter``click.part3.inter``None

您好,我在修改了对应的benchmark后,是否还需要修改Evaluation Settings中的eval_args: split: {'RS':[0.8,0.1,0.1]},因为在我修改了benchmark后,在log文件中的Evaluation Hyper Parameters仍然是: eval_args = {'split': {'RS': [0.8, 0.1, 0.1]}, 'order': 'RO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}} 如果需要修改的话,请问要如何修改?

tiebreaker4869 commented 2 months ago

@Furyboyy 您好,我们提供了参数 来传入划分好的数据集,详情可以参考使用文档benchmark_filename

  • benchmark_filename (list):预拆分用户-项目交互后缀列表。我们只会应用 normalize、remap-id,它不会删除 inter_feat 中的交互。然后将inter_feat除以 。例如,让我们假设数据集名为 ,并且等于 。我们将加载 、 、 并将它们视为训练的、有效的、测试的数据集。缺省值为 .benchmark_filenameclickbenchmark_filename['part1', 'part2', 'part3']click.part1.interclick.part2.interclick.part3.interNone ``

您好,我在修改了对应的benchmark后,是否还需要修改Evaluation Settings中的eval_args: split: {'RS':[0.8,0.1,0.1]},因为在我修改了benchmark后,在log文件中的Evaluation Hyper Parameters仍然是: eval_args = {'split': {'RS': [0.8, 0.1, 0.1]}, 'order': 'RO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}} 如果需要修改的话,请问要如何修改?

请问这个问题您解决了吗,这个设置需要修改吗

Xue-ying99 commented 2 months ago

不好意思,我也没有解决

发件人: @. @.> 代表 Lifan Sun 发送时间: 2024年8月31日 9:58 收件人: RUCAIBox/RecBole @.> 抄送: Xue Ying @.>; Comment @.***> 主题: Re: [RUCAIBox/RecBole] 如何根据已经划分好的数据生成训练、验证、测试数据集呢? (Issue #1624)

@Furyboyy 您好,我们提供了参数 来传入划分好的数据集,详情可以参考 https://recbole.io/docs/user_guide/config/data_settings.html 使用文档。benchmark_filename

您好,我在修改了对应的benchmark后,是否还需要修改Evaluation Settings中的eval_args: split: {'RS':[0.8,0.1,0.1]},因为在我修改了benchmark后,在log文件中的Evaluation Hyper Parameters仍然是: eval_args = {'split': {'RS': [0.8, 0.1, 0.1]}, 'order': 'RO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}} 如果需要修改的话,请问要如何修改?

请问这个问题您解决了吗,这个设置需要修改吗

— Reply to this email directly, view it on GitHub https://github.com/RUCAIBox/RecBole/issues/1624#issuecomment-2322726827 , or unsubscribe https://github.com/notifications/unsubscribe-auth/BIUV2UCGI7HECJJZTW34CD3ZUEPMJAVCNFSM6AAAAABMN2IXI6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMRSG4ZDMOBSG4 . You are receiving this because you commented. https://github.com/notifications/beacon/BIUV2UF4RLYGJT2DDIX4JYLZUEPMJA5CNFSM6AAAAABMN2IXI6WGG33NNVSW45C7OR4XAZNMJFZXG5LFINXW23LFNZ2KUY3PNVWWK3TUL5UWJTUKOH72W.gif Message ID: @. @.> >