From b10759c0275adebaa65ae1f627f0b148705d08c7 Mon Sep 17 00:00:00 2001 From: 2017pxy <2017202006@ruc.edu.cn> Date: Mon, 23 Aug 2021 14:45:08 +0000 Subject: [PATCH 1/8] FIX: merge for model_intro --- docs/source/get_started/install.rst | 61 ++++- docs/source/get_started/introduction.rst | 4 + docs/source/get_started/quick_start.rst | 227 ++++++++++------ docs/source/index.rst | 15 +- docs/source/user_guide/config_settings.rst | 253 ------------------ docs/source/user_guide/data/data_args.rst | 102 ------- docs/source/user_guide/data_intro.rst | 21 +- docs/source/user_guide/model_intro.rst | 1 - recbole/config/configurator.py | 2 +- recbole/data/dataloader/general_dataloader.py | 6 +- recbole/data/utils.py | 12 +- recbole/trainer/trainer.py | 6 +- 12 files changed, 258 insertions(+), 452 deletions(-) delete mode 100644 docs/source/user_guide/config_settings.rst delete mode 100644 docs/source/user_guide/data/data_args.rst diff --git a/docs/source/get_started/install.rst b/docs/source/get_started/install.rst index b798defcc..f2a8bcdeb 100644 --- a/docs/source/get_started/install.rst +++ b/docs/source/get_started/install.rst @@ -11,7 +11,7 @@ RecBole is compatible with the following operating systems: * Windows 10 * macOS X -Python 3.6 (or later), torch 1.6.0 (or later) are required to install our library. If you want to use RecBole with GPU, +Python 3.6 (or later), torch 1.7.0 (or later) are required to install our library. If you want to use RecBole with GPU, please ensure that CUDA or CUDAToolkit version is 9.2 or later. This requires NVIDIA driver version >= 396.26 (for Linux) or >= 397.44 (for Windows10). @@ -54,3 +54,62 @@ Run the following command to install: .. code:: bash pip install -e . --verbose + +Try to run: +------------------------- +To check if you have successfully installed the RecBole, you can create a new python file (e.g., `run.py`), +and write the following code: + +.. code:: python + + from recbole.quick_start import run_recbole + + run_recbole(model='BPR', dataset='ml-100k') + + +Then run the following command: + +.. code:: bash + + python run.py + +This will perform the training and test of the BPR model on the ml-100k dataset, and you will obtain some output like: + +.. code:: none + + 05 Aug 02:16 INFO ml-100k + The number of users: 944 + Average actions of users: 106.04453870625663 + The number of items: 1683 + Average actions of items: 59.45303210463734 + The number of inters: 100000 + The sparsity of the dataset: 93.70575143257098% + Remain Fields: ['user_id', 'item_id', 'rating', 'timestamp'] + 05 Aug 02:16 INFO [Training]: train_batch_size = [2048] negative sampling: [{'uniform': 1}] + 05 Aug 02:16 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [0.8, 0.1, 0.1]}, 'group_by': 'user', 'order': 'RO', 'mode': 'full'}] + 05 Aug 02:16 INFO BPR( + (user_embedding): Embedding(944, 64) + (item_embedding): Embedding(1683, 64) + (loss): BPRLoss() + ) + Trainable parameters: 168128 + Train 0: 100%|████████████████████████| 40/40 [00:00<00:00, 219.54it/s, GPU RAM: 0.01 G/11.91 G] + 05 Aug 02:16 INFO epoch 0 training [time: 0.19s, train loss: 27.7228] + Evaluate : 100%|██████████████████████| 472/472 [00:00<00:00, 506.11it/s, GPU RAM: 0.01 G/11.91 G] + 05 Aug 02:16 INFO epoch 0 evaluating [time: 0.94s, valid_score: 0.020500] + 05 Aug 02:16 INFO valid result: + recall@10 : 0.0067 mrr@10 : 0.0205 ndcg@10 : 0.0086 hit@10 : 0.0732 precision@10 : 0.0081 + + ... + + Train 96: 100%|████████████████████████| 40/40 [00:00<00:00, 230.65it/s, GPU RAM: 0.01 G/11.91 G] + 05 Aug 02:19 INFO epoch 96 training [time: 0.18s, train loss: 3.7170] + Evaluate : 100%|██████████████████████| 472/472 [00:00<00:00, 800.46it/s, GPU RAM: 0.01 G/11.91 G] + 05 Aug 02:19 INFO epoch 96 evaluating [time: 0.60s, valid_score: 0.375200] + 05 Aug 02:19 INFO valid result: + recall@10 : 0.2162 mrr@10 : 0.3752 ndcg@10 : 0.2284 hit@10 : 0.7508 precision@10 : 0.1602 + 05 Aug 02:19 INFO Finished training, best eval result in epoch 85 + 05 Aug 02:19 INFO Loading model structure and parameters from saved/BPR-Aug-05-2021_02-17-51.pth + Evaluate : 100%|██████████████████████| 472/472 [00:00<00:00, 832.85it/s, GPU RAM: 0.01 G/11.91 G] + 05 Aug 02:19 INFO best valid : {'recall@10': 0.2195, 'mrr@10': 0.3871, 'ndcg@10': 0.2344, 'hit@10': 0.7582, 'precision@10': 0.1627} + 05 Aug 02:19 INFO test result: {'recall@10': 0.2523, 'mrr@10': 0.4855, 'ndcg@10': 0.292, 'hit@10': 0.7953, 'precision@10': 0.1962} \ No newline at end of file diff --git a/docs/source/get_started/introduction.rst b/docs/source/get_started/introduction.rst index d17c56e20..06e86baaa 100644 --- a/docs/source/get_started/introduction.rst +++ b/docs/source/get_started/introduction.rst @@ -13,6 +13,10 @@ In the first release, our library includes 73 recommendation algorithms `[Model We design a unified and flexible data file format, and provide the support for 28 benchmark recommendation datasets `[Collected Datasets]`_. A user can apply the provided script to process the original data copy, or simply download the processed datasets by our team. +.. image:: ../../../asset/framework.png + :width: 600 + :align: center + Features: - General and extensible data structure diff --git a/docs/source/get_started/quick_start.rst b/docs/source/get_started/quick_start.rst index 9a97a8a15..cf12d3af9 100644 --- a/docs/source/get_started/quick_start.rst +++ b/docs/source/get_started/quick_start.rst @@ -1,119 +1,184 @@ Quick Start =============== -Here is a quick-start example for using RecBole. +Here is a quick-start example for using RecBole. We will show you how to train and test **BPR** model on the **ml-1m** dataset from API +and source code. -Quick-start From Source --------------------------- -With the source code of `RecBole `_, -the following script can be used to run a toy example of our library. - -.. code:: bash - - python run_recbole.py - -This script will run the BPR model on the ml-100k dataset. - -Typically, this example takes less than one minute. We will obtain some output like: - -.. code:: none - INFO ml-100k - The number of users: 944 - Average actions of users: 106.04453870625663 - The number of items: 1683 - Average actions of items: 59.45303210463734 - The number of inters: 100000 - The sparsity of the dataset: 93.70575143257098% - - INFO Evaluation Settings: - Group by user_id - Ordering: {'strategy': 'shuffle'} - Splitting: {'strategy': 'by_ratio', 'ratios': [0.8, 0.1, 0.1]} - Negative Sampling: {'strategy': 'full', 'distribution': 'uniform'} - - INFO BPRMF( - (user_embedding): Embedding(944, 64) - (item_embedding): Embedding(1683, 64) - (loss): BPRLoss() - ) - Trainable parameters: 168128 +Quick-start From API +-------------------------- - INFO epoch 0 training [time: 0.27s, train loss: 27.7231] - INFO epoch 0 evaluating [time: 0.12s, valid_score: 0.021900] - INFO valid result: - recall@10: 0.0073 mrr@10: 0.0219 ndcg@10: 0.0093 hit@10: 0.0795 precision@10: 0.0088 +1. Prepare data: +>>>>>>>>>>>>>> +Before running a model, firstly you need to prepare and load data. In order to characterize most forms of the input data +required by different recommendation tasks, RecBole designs an input data format called :doc:`../user_guide/data/atomic_files` and +you need to convert your raw data into Atomic Files before data loading. For the convenience of users, we have collected more than +28 commonly used datasets (detailed as `Dataset List `_.) and released their Atomic Files format +for users to download them freely. + +Then, you need to set data config for data loading. You can create a `yaml` file called `test.yaml` and write the following settings: + +.. code:: yaml + + # dataset config + data_path: # YOUR_DATA_FILE_PATH + USER_ID_FIELD: user_id + ITEM_ID_FIELD: item_id + load_col: + inter: [user_id, item_id] + +For more details of data config, please refer to :doc:`../user_guide/data/data_settings`. + +2. Choose a model: +>>>>>>>>>>>>>> +In RecBole, we implement 72 recommendation models covering general recommendation, sequential recommendation, +context-aware recommendation and knowledge-based recommendation. You can choose a model from our :doc:`../user_guide/model_intro`. +Here we choose BPR model to train and test. + +Then, you need to set the parameter for BPR model. You can check the :doc:`../user_guide/model/general/bpr` and add the model settings into the `test.yaml`, like: + +.. code:: yaml + + # model config + embedding_size: 64 + +3. Set training and evaluation config: +>>>>>>>>>>>>>> +In RecBole, we support multiple training and evaluation methods. You can choose how to train and test model by simply setting the config. +Here we want to train and test the BPR model in training-validation-test method (optimize model parameters on the training set, do parameter selection according to the results on the validation set, +and finally report the results on the test set) and evaluate the model performance by full ranking with all item candidates, +so we can add the following settings into the `test.yaml`. + +.. code:: yaml + + # Training and evaluation config + epochs: 500 + train_batch_size: 4096 + eval_batch_size: 4096 + neg_sampling: + uniform: 1 + eval_args: + group_by: user + order: RO + split: {'RS': [0.8,0.1,0.1]} + mode: full + metrics: ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision'] + topk: 10 + valid_metric: MRR@10 + metric_decimal_place: 4 + +For more details of training and evaluation config, please refer to :doc:`../user_guide/train_eval/training_settings` and :doc:`../user_guide/train_eval/eval_settings`. + +4. Run the model and collect the result +>>>>>>>>>>>>>> +Now you have finished all the preparations, it's time to run the model! +you can create a new python file (e.g., `run.py`), and write the following code: - ... +.. code:: python - INFO epoch 63 training [time: 0.19s, train loss: 4.7660] - INFO epoch 63 evaluating [time: 0.08s, valid_score: 0.394500] - INFO valid result: - recall@10: 0.2156 mrr@10: 0.3945 ndcg@10: 0.2332 hit@10: 0.7593 precision@10: 0.1591 + from recbole.quick_start import run_recbole - INFO Finished training, best eval result in epoch 52 - INFO Loading model structure and parameters from saved/***.pth - INFO best valid result: - recall@10: 0.2169 mrr@10: 0.4005 ndcg@10: 0.235 hit@10: 0.7582 precision@10: 0.1598 - INFO test result: - recall@10: 0.2368 mrr@10: 0.4519 ndcg@10: 0.2768 hit@10: 0.7614 precision@10: 0.1901 + run_recbole(model='BPR', dataset='ml-1m') -Note that using the quick start pipeline we provide, the original dataset will be divided into training set, validation set and test set by default. -We optimize model parameters on the training set, do parameter selection according to the results on the validation set, -and finally report the results on the test set. -If you want to change the parameters, such as ``learning_rate``, ``embedding_size``, -just set the additional command parameters as you need: +Then run the following command: .. code:: bash - python run_recbole.py --learning_rate=0.0001 --embedding_size=128 + python run.py --config_files=test.yaml +And you will obtain the output like: -If you want to change the models, just run the script by setting additional command parameters: - -.. code:: bash - - python run_recbole.py --model=[model_name] +.. code:: none -``model_name`` indicates the model to be initialized. -RecBole has implemented four categories of recommendation algorithms -including general recommendation, context-aware recommendation, -sequential recommendation and knowledge-based recommendation. -More details can be found in :doc:`../user_guide/model_intro`. + 09 Aug 03:44 INFO ml-1m + The number of users: 6041 + Average actions of users: 165.5975165562914 + The number of items: 3707 + Average actions of items: 269.88909875876953 + The number of inters: 1000209 + The sparsity of the dataset: 95.53358229599758% + Remain Fields: ['user_id', 'item_id'] + 09 Aug 03:44 INFO [Training]: train_batch_size = [2048] negative sampling: [{'uniform': 1}] + 09 Aug 03:44 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [0.8, 0.1, 0.1]}, 'group_by': 'user', 'order': 'RO', 'mode': 'full'}] + 09 Aug 03:44 INFO BPR( + (user_embedding): Embedding(6041, 64) + (item_embedding): Embedding(3707, 64) + (loss): BPRLoss() + ) + Trainable parameters: 623872 + Train 0: 100%|██████████████████████| 394/394 [00:01<00:00, 220.17it/s, GPU RAM: 0.03 G/11.91 G] + 09 Aug 03:44 INFO epoch 0 training [time: 1.82s, train loss: 232.5692] + Evaluate : 100%|████████████████████| 6040/6040 [00:08<00:00, 672.60it/s, GPU RAM: 0.03 G/11.91 G] + 09 Aug 03:44 INFO epoch 0 evaluating [time: 9.05s, valid_score: 0.225600] + ...... + 09 Aug 03:51 INFO Finished training, best eval result in epoch 30 + 09 Aug 03:51 INFO Loading model structure and parameters from saved/BPR-Aug-09-2021_03-44-12.pth + Evaluate : 100%|████████████████████| 6040/6040 [00:08<00:00, 718.04it/s, GPU RAM: 0.03 G/11.91 G] + 09 Aug 03:51 INFO best valid : {'recall@10': 0.1466, 'mrr@10': 0.378, 'ndcg@10': 0.2067, 'hit@10': 0.7278, 'precision@10': 0.1625} + 09 Aug 03:51 INFO test result: {'recall@10': 0.1614, 'mrr@10': 0.4432, 'ndcg@10': 0.2558, 'hit@10': 0.7422, 'precision@10': 0.201} +Finally you will get the model's performance on the test set and the model file will be saved under the `/save`. Besides, +RecBole allows tracking and visualizing train loss and valid score with TensorBoard, please read the xxx for more details. -The datasets can be changed according to :doc:`../user_guide/data_intro`. +The above is the whole process of running a model in RecBole, and you can read other docs for depth usage. -Quick-start From API -------------------------- -If RecBole is installed from ``pip`` or ``conda``, you can create a new python file (e.g., `run.py`), -and write the following code: +Quick-start From Source +-------------------------- +Besides using API, you can also directly run the source code of `RecBole `_. +The whole process is similar to Quick-start From API. +You can create a `yaml` file called `test.yaml` and set all the config as follow: + +.. code:: yaml + + # dataset config + data_path: # YOUR_DATA_FILE_PATH + USER_ID_FIELD: user_id + ITEM_ID_FIELD: item_id + load_col: + inter: [user_id, item_id] + + # model config + embedding_size: 64 + + # Training and evaluation config + epochs: 500 + train_batch_size: 4096 + eval_batch_size: 4096 + neg_sampling: + uniform: 1 + eval_args: + group_by: user + order: RO + split: {'RS': [0.8,0.1,0.1]} + mode: full + metrics: ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision'] + topk: 10 + valid_metric: MRR@10 + metric_decimal_place: 4 -.. code:: python +Then run the following command: - from recbole.quick_start import run_recbole +.. code:: bash - run_recbole() + python run_recbole.py --model=BPR --dataset=ml-1m --config_files=test.yaml +And you will get the output of running the BPR model on the ml-1m dataset. -Then run the following command: +If you want to change the parameters, such as ``embedding_size``, +just set the additional command parameters as you need: .. code:: bash - python run.py --dataset=ml-100k --model=BPR - -This will perform the training and test of the BPR model on the ml-100k dataset. + python run_recbole.py --model=BPR --dataset=ml-1m --config_files=test.yaml --embedding_size=0.0001 -One can also use similar methods as mentioned above to run different models, parameters or datasets, -the operations are same with `Quick-start From Source`_. In-depth Usage ------------------- For a more in-depth usage about RecBole, take a look at -- :doc:`../user_guide/config_settings` +- :doc:`../user_guide/config_setting` - :doc:`../user_guide/data_intro` - :doc:`../user_guide/model_intro` - :doc:`../user_guide/evaluation_support` diff --git a/docs/source/index.rst b/docs/source/index.rst index 4a41dfe09..23546ebbc 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -5,6 +5,13 @@ RecBole v0.2.0 `HomePage `_ | `Docs `_ | `GitHub `_ | `Datasets `_ | `v0.1.2 `_ +RecBole is a unified, comprehensive and efficient framework developed based on PyTorch. +It aims to help the researchers to reproduce and develop recommendation models. + +.. image:: ../../../asset/logo.png + :width: 600 + :align: center + .. toctree:: :maxdepth: 1 :caption: Get Started @@ -47,13 +54,5 @@ RecBole v0.2.0 recbole/recbole.trainer.hyper_tuning recbole/recbole.trainer.trainer recbole/recbole.utils.case_study - recbole/recbole.utils.enum_type - recbole/recbole.utils.logger recbole/recbole.utils.utils - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`search` diff --git a/docs/source/user_guide/config_settings.rst b/docs/source/user_guide/config_settings.rst deleted file mode 100644 index 52d8a135e..000000000 --- a/docs/source/user_guide/config_settings.rst +++ /dev/null @@ -1,253 +0,0 @@ -Config Settings -=================== -RecBole is able to config different parameters for controlling the experiment -setup (e.g., data processing, data splitting, training and evaluation). -The users can select the settings according to their own requirements. - -The introduction of different parameter configurations are presented as follows: - -Parameters Introduction ------------------------------ -The parameters in RecBole can be divided into three categories: -Basic Parameters, Dataset Parameters and Model Parameters. - -Basic Parameters -^^^^^^^^^^^^^^^^^^^^^^ -Basic parameters are used to build the general environment including the settings for -model training and evaluation. - -**Environment Setting** - -- ``gpu_id (int or str)`` : The id of GPU device. Defaults to ``0``. -- ``use_gpu (bool)`` : Whether or not to use GPU. If True, using GPU, else using CPU. - Defaults to ``True``. -- ``seed (int)`` : Random seed. Defaults to ``2020``. -- ``state (str)`` : Logging level. Defaults to ``'INFO'``. - Range in ``['INFO', 'DEBUG', 'WARNING', 'ERROR', 'CRITICAL']``. -- ``reproducibility (bool)`` : If True, the tool will use deterministic - convolution algorithms, which makes the result reproducible. If False, - the tool will benchmark multiple convolution algorithms and select the fastest one, - which makes the result not reproducible but can speed up model training in - some case. Defaults to ``True``. -- ``data_path (str)`` : The path of input dataset. Defaults to ``'dataset/'``. -- ``checkpoint_dir (str)`` : The path to save checkpoint file. - Defaults to ``'saved/'``. -- ``show_progress (bool)`` : Show the progress of training epoch and evaluate epoch. - Defaults to ``True``. - -**Training Setting** - -- ``epochs (int)`` : The number of training epochs. Defaults to ``300``. -- ``train_batch_size (int)`` : The training batch size. Defaults to ``2048``. -- ``learner (str)`` : The name of used optimizer. Defaults to ``'adam'``. - Range in ``['adam', 'sgd', 'adagrad', 'rmsprop', 'sparse_adam']``. -- ``learning_rate (float)`` : Learning rate. Defaults to ``0.001``. -- ``training_neg_sample_num (int)`` : The number of negative samples during - training. If it is set to 0, the negative sampling operation will not be - performed. Defaults to ``1``. -- ``training_neg_sample_distribution(str)`` : Distribution of the negative items - in training phase. Default to ``uniform``. Range in ``['uniform', 'popularity']``. -- ``eval_step (int)`` : The number of training epochs before a evaluation - on the valid dataset. If it is less than 1, the model will not be - evaluated on the valid dataset. Defaults to ``1``. -- ``stopping_step (int)`` : The threshold for validation-based early stopping. - Defaults to ``10``. -- ``clip_grad_norm (dict)`` : The args of `clip_grad_norm_ `_ - which will clips gradient norm of model. Defaults to ``None``. -- ``loss_decimal_place(int)``: The decimal place of training loss. Defaults to ``4``. -- ``weight_decay (float)`` : Weight decay (L2 penalty), used for `optimizer `_. Default to ``0.0``. - - - -**Evaluation Setting** - -- ``eval_setting (str)``: The evaluation settings. Defaults to ``'RO_RS,full'``. - The parameter has two parts. The first part control the splitting methods, - the range is ``['RO_RS','TO_LS','RO_LS','TO_RS']``. The second part(optional) - control the ranking mechanism, the range is ``['full','uni100','uni1000','pop100','pop1000']``. -- ``group_by_user (bool)``: Whether or not to group the users. - It must be ``True`` when ``eval_setting`` is in ``['RO_LS', 'TO_LS']``. - Defaults to ``True``. -- ``split_ratio (list)``: The split ratio between train data, valid data and - test data. It only take effects when the first part of ``eval_setting`` - is in ``['RO_RS', 'TO_RS']``. Defaults to ``[0.8, 0.1, 0.1]``. -- ``leave_one_num (int)``: It only take effects when the first part of - ``eval_setting`` is in ``['RO_LS', 'TO_LS']``. Defaults to ``2``. - -- ``metrics (list or str)``: Evaluation metrics. Defaults to - ``['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']``. Range in - ``['Recall', 'MRR', 'NDCG', 'Hit', 'MAP', 'Precision', 'AUC', 'GAUC', - 'MAE', 'RMSE', 'LogLoss']``. -- ``topk (list or int or None)``: The value of k for topk evaluation metrics. - Defaults to ``10``. -- ``valid_metric (str)``: The evaluation metrics for early stopping. - It must be one of used ``metrics``. Defaults to ``'MRR@10'``. -- ``eval_batch_size (int)``: The evaluation batch size. Defaults to ``4096``. -- ``metric_decimal_place(int)``: The decimal place of metric score. Defaults to ``4``. - -Pleaser refer to :doc:`evaluation_support` for more details about the parameters -in Evaluation Setting. - -Dataset Parameters -^^^^^^^^^^^^^^^^^^^^^^^ -Dataset Parameters are used to describe the dataset information and control -the dataset loading and filtering. - -Please refer to :doc:`data/data_args` for more details. - -Model Parameters -^^^^^^^^^^^^^^^^^^^^^ -Model Parameters are used to describe the model structures. - -Please refer to :doc:`model_intro` for more details. - - -Parameters Configuration ------------------------------- -RecBole supports three types of parameter configurations: Config files, -Parameter Dicts and Command Line. The parameters are assigned via the -Configuration module. - -Config Files -^^^^^^^^^^^^^^^^ -Config Files should be organized in the format of yaml. -The users should write their parameters according to the rules aligned with -yaml, and the final config files are processed by the configuration module -to complete the parameter settings. - -To begin with, we write the parameters into the yaml files (e.g. `example.yaml`). - -.. code:: yaml - - gpu_id: 1 - training_batch_size: 1024 - -Then, the yaml files are conveyed to the configuration module to finish the -parameter settings. - -.. code:: python - - from recbole.config import Config - - config = Config(model='BPR', dataset='ml-100k', config_file_list=['example.yaml']) - print('gpu_id: ', config['gpu_id']) - print('training_batch_size: ', config['training_batch_size']) - - -output: - -.. code:: bash - - gpu_id: 1 - training_batch_size: 1024 - -The parameter ``config_file_list`` supports multiple yaml files. - -For more details on yaml, please refer to YAML_. - -.. _YAML: https://yaml.org/ - -When using our toolkit, the parameters belonging to **Dataset parameters** and -Evaluation Settings of **Basic Parameters** are recommended to be written into -the config files, which may be convenient for reusing the configurations. - -Parameter Dicts -^^^^^^^^^^^^^^^^^^ -Parameter Dict is realized by the dict data structure in python, where the key -is the parameter name, and the value is the parameter value. The users can write their -parameters into a dict, and input it into the configuration module. - -An example is as follows: - -.. code:: python - - from recbole.config import Config - - parameter_dict = { - 'gpu_id': 2, - 'training_batch_size': 512 - } - config = Config(model='BPR', dataset='ml-100k', config_dict=parameter_dict) - print('gpu_id: ', config['gpu_id']) - print('training_batch_size: ', config['training_batch_size']) - -output: - -.. code:: bash - - gpu_id: 2 - training_batch_size: 512 - - -Command Line -^^^^^^^^^^^^^^^^^^^^^^^^ -We can also assign parameters based on the command line. -The parameters in the command line can be read from the configuration module. -The format is: `-–parameter_name=[parameter_value]`. - -Write the following code to the python file (e.g. `run.py`): - -.. code:: python - - from recbole.config import Config - - config = Config(model='BPR', dataset='ml-100k') - print('gpu_id: ', config['gpu_id']) - print('training_batch_size: ', config['training_batch_size']) - -Running: - -.. code:: bash - - python run.py --gpu_id=3 --training_batch_size=256 - -output: - -.. code:: bash - - gpu_id: 3 - training_batch_size: 256 - - -Priority -^^^^^^^^^^^^^^^^^ -RecBole supports the combination of three types of parameter configurations. - -The priority of the configuration methods is: Command Line > Parameter Dicts -> Config Files > Default Settings - -A example is as follows: - -`example.yaml`: - -.. code:: yaml - - gpu_id: 1 - training_batch_size: 1024 - -`run.py`: - -.. code:: python - - from recbole.config import Config - - parameter_dict = { - 'gpu_id': 2, - 'training_batch_size': 512 - } - config = Config(model='BPR', dataset='ml-100k', config_file_list=['example.yaml'], config_dict=parameter_dict) - print('gpu_id: ', config['gpu_id']) - print('training_batch_size: ', config['training_batch_size']) - -Running: - -.. code:: bash - - python run.py --gpu_id=3 --training_batch_size=256 - -output: - -.. code:: bash - - gpu_id: 3 - training_batch_size: 256 diff --git a/docs/source/user_guide/data/data_args.rst b/docs/source/user_guide/data/data_args.rst deleted file mode 100644 index 97ce58835..000000000 --- a/docs/source/user_guide/data/data_args.rst +++ /dev/null @@ -1,102 +0,0 @@ -Args for Data -========================= - -RecBole provides several arguments for describing: - -- Basic information of the dataset -- Operations of dataset preprocessing - -See below for the details: - -Atomic File Format ----------------------- - -- ``field_separator (str)`` : Separator of different columns in atomic files. Defaults to ``"\t"``. -- ``seq_separator (str)`` : Separator inside the sequence features. Defaults to ``" "``. - -Basic Information ----------------------- - -Common Features -'''''''''''''''''' - -- ``USER_ID_FIELD (str)`` : Field name of user ID feature. Defaults to ``user_id``. -- ``ITEM_ID_FIELD (str)`` : Field name of item ID feature. Defaults to ``item_id``. -- ``RATING_FIELD (str)`` : Field name of rating feature. Defaults to ``rating``. -- ``TIME_FIELD (str)`` : Field name of timestamp feature. Defaults to ``timestamp``. -- ``seq_len (dict)`` : Keys are field names of sequence features, values are maximum length of each sequence (which means sequences too long will be cut off). If not set, the sequences will not be cut off. Defaults to ``None``. - -Label for Point-wise DataLoader -''''''''''''''''''''''''''''''''''' - -- ``LABEL_FIELD (str)`` : Expected field name of the generated labels. Defaults to ``label``. -- ``threshold (dict)`` : The format is ``{k (str): v (float)}``. 0/1 labels will be generated according to the value of ``inter_feat[k]`` and ``v``. The rows with ``inter_feat[k] >= v`` will be labeled as positive, otherwise the label is negative. Note that at most one pair of ``k`` and ``v`` can exist in ``threshold``. Defaults to ``None``. - -NegSample Prefix for Pair-wise DataLoader -'''''''''''''''''''''''''''''''''''''''''''''''''' - -- ``NEG_PREFIX (str)`` : Prefix of field names which are generated as negative cases. E.g. if we have positive item ID named ``item_id``, then those item ID in negative samples will be called ``NEG_PREFIX + item_id``. Defaults to ``neg_``. - -Sequential Model Needed -''''''''''''''''''''''''''''''''''' - -- ``ITEM_LIST_LENGTH_FIELD (str)`` : Field name of the feature representing item sequences' length. Defaults to ``item_length``. -- ``LIST_SUFFIX (str)`` : Suffix of field names which are generated as sequences. E.g. if we have item ID named ``item_id``, then those item ID sequences will be called ``item_id + LIST_SUFFIX``. Defaults to ``_list``. -- ``MAX_ITEM_LIST_LENGTH (int)``: Maximum length of each generated sequence. Defaults to ``50``. -- ``POSITION_FIELD (str)`` : Field name of the generated position sequence. For sequence of length ``k``, its position sequence is ``range(k)``. Note that this field will only be generated if this arg is not ``None``. Defaults to ``position_id``. - -Knowledge-based Model Needed -''''''''''''''''''''''''''''''''''' - -- ``HEAD_ENTITY_ID_FIELD (str)`` : Field name of the head entity ID feature. Defaults to ``head_id``. -- ``TAIL_ENTITY_ID_FIELD (str)`` : Field name of the tail entity ID feature. Defaults to ``tail_id``. -- ``RELATION_ID_FIELD (str)`` : Field name of the relation ID feature. Defaults to ``relation_id``. -- ``ENTITY_ID_FIELD (str)`` : Field name of the entity ID. Note that it's only a symbol of entities, not real feature of one of the ``xxx_feat``. Defaults to ``entity_id``. - -Selectively Loading ------------------------------- - -- ``load_col (dict)`` : Keys are the suffix of loaded atomic files, values are the list of field names to be loaded. If a suffix doesn't exist in ``load_col``, the corresponding atomic file will not be loaded. Note that if ``load_col`` is ``None``, then all the existed atomic files will be loaded. Defaults to ``{inter: [user_id, item_id]}``. -- ``unload_col (dict)`` : Keys are suffix of loaded atomic files, values are list of field names NOT to be loaded. Note that ``load_col`` and ``unload_col`` can not be set at the same time. Defaults to ``None``. -- ``unused_col (dict)`` : Keys are suffix of loaded atomic files, values are list of field names which is loaded for data processing but will not used in model. E.g. the ``time_field`` may used for time ordering but model does not use this field. Defaults to ``None``. -- ``additional_feat_suffix (list)``: Control loading additional atomic files. E.g. if you want to load features from ``ml-100k.hello``, just set this arg as ``additional_feat_suffix: [hello]``. Features of additional features will be stored in ``Dataset.feat_list``. Defaults to ``None``. - -Filtering ------------ - -Remove duplicated user-item interactions -'''''''''''''''''''''''''''''''''''''''' - -- ``rm_dup_inter (str)`` : Whether to remove duplicated user-item interactions. If ``time_field`` exists, ``inter_feat`` will be sorted by ``time_field`` in ascending order. Otherwise it will remain unchanged. After that, if ``rm_dup_inter == first``, we will keep the first user-item interaction in duplicates; if ``rm_dup_inter == last``, we will keep the last user-item interaction in duplicates. Defaults to ``None``. - -Filter by value -'''''''''''''''''' - -- ``val_interval (dict)``: Has the format ``{k (str): interval (str), ...}``, where ``interval `` can be set as ``[A,B]`` / ``[A,B)`` / ``(A,B)`` / ``(A,B]``. The rows whose ``feat[k]`` is in the interval ``interval`` will be retained. If you want to specify more than one interval, separate them with semicolon(s). For instance, ``{k: "[A,B);(C,D]"}`` can be adopted and rows whose ``feat[k]`` is in any specified interval will be retained. Defaults to ``None``, which means all rows will be retained. - -Remove interation by user or item -''''''''''''''''''''''''''''''''''' - -- ``filter_inter_by_user_or_item (bool)`` : If ``True``, we will remove the interaction in ``inter_feat`` which user or item is not in ``user_feat`` or ``item_feat``. Defaults to ``True``. - -Filter by number of interactions -'''''''''''''''''''''''''''''''''''' - -- ``user_inter_num_interval (str)`` : Has the interval format, such as ``[A,B]`` / ``[A,B)`` / ``(A,B)`` / ``(A,B]``, where ``A`` and ``B`` are the endpoints of the interval and ``A <= B``. Users whose number of interactions is in the interval will be retained. Defaults to ``[0,inf)``. -- ``item_inter_num_interval (str)`` : Has the interval format, such as ``[A,B]`` / ``[A,B)`` / ``(A,B)`` / ``(A,B]``, where ``A`` and ``B`` are the endpoints of the interval and ``A <= B``. Items whose number of interactions is in the interval will be retained. Defaults to ``[0,inf)``. - -Preprocessing ------------------ - -- ``alias_of_user_id (list)``: List of fields' names, which will be remapped into the same index system with ``USER_ID_FIELD``. Defaults to ``None``. -- ``alias_of_item_id (list)``: List of fields' names, which will be remapped into the same index system with ``ITEM_ID_FIELD``. Defaults to ``None``. -- ``alias_of_entity_id (list)``: List of fields' names, which will be remapped into the same index system with ``ENTITY_ID_FIELD``, ``HEAD_ENTITY_ID_FIELD`` and ``TAIL_ENTITY_ID_FIELD``. Defaults to ``None``. -- ``alias_of_relation_id (list)``: List of fields' names, which will be remapped into the same index system with ``RELATION_ID_FIELD``. Defaults to ``None``. -- ``preload_weight (dict)`` : Has the format ``{k (str): v (float)}, ...``. ``k`` if a token field, representing the IDs of each row of preloaded weight matrix. ``v`` is a float like fields. Each pair of ``u`` and ``v`` should be from the same atomic file. This arg can be used to load pretrained vectors. Defaults to ``None``. -- ``normalize_field (list)`` : List of filed names to be normalized. Note that only float like fields can be normalized. Defaults to ``None``. -- ``normalize_all (bool)`` : Normalize all the float like fields if ``True``. Defaults to ``True``. - -Benchmark file -------------------- - -- ``benchmark_filename (list)`` : List of pre-split user-item interaction suffix. We will only apply normalize, remap-id, which will not delete the interaction in inter_feat. And then split the inter_feat by ``benchmark_filename``. E.g. Let's assume that the dataset is called ``click``, and ``benchmark_filename`` equals to ``['part1', 'part2', 'part3']``. That we will load ``click.part1.inter``, ``click.part2.inter``, ``click.part3.inter``, and treat them as train, valid, test dataset. Defaults to ``None``. diff --git a/docs/source/user_guide/data_intro.rst b/docs/source/user_guide/data_intro.rst index f84d2c04e..64ddad537 100644 --- a/docs/source/user_guide/data_intro.rst +++ b/docs/source/user_guide/data_intro.rst @@ -1,7 +1,23 @@ Data Introduction =================== -Here we introduce the whole dataflow and highlight its key features. +RecBole has a flexible and extensible data module. + +For extensibility and reusability, our data module designs an elegant data flow that transforms raw data +into the model input. Detailed as :doc:`data/data_flow`. + +In order to characterize most forms of the input data +required by different recommendation tasks, RecBole designs an input data format called :doc:`data/atomic_files`. +Besides, we design a data structure called :doc:`data/interaction` to provides a unified internal data representation for different +recommendation algorithms. + +Plus, RecBole supports both explicit feedback (labeled data) scenes and implicit feedback (unlabeled data) scenes. For explicit feedback scenes, +users can set the `LABEL_FIELD` in the config and RecBole will train and test model based on the label. For implicit feedback scenes, RecBole will +regard all the observed interactions as positive samples and automatically select the negative samples from the unobserved interactions (which is known as negative sampling). +For more information about label setting in RecBole, +please read :doc:`data/label_of_data`. + +Here are the related docs for data module: .. toctree:: :maxdepth: 1 @@ -9,4 +25,5 @@ Here we introduce the whole dataflow and highlight its key features. data/data_flow data/atomic_files data/interaction - data/data_args + data/label_of_data + data/data_setttings \ No newline at end of file diff --git a/docs/source/user_guide/model_intro.rst b/docs/source/user_guide/model_intro.rst index 45cc8550d..dfe3ca5f9 100644 --- a/docs/source/user_guide/model_intro.rst +++ b/docs/source/user_guide/model_intro.rst @@ -107,7 +107,6 @@ Knowledge-based Recommendation --------------------------------- Knowledge-based recommendation introduce an external knowledge graph to enhance general or sequential recommendation. - .. toctree:: :maxdepth: 1 diff --git a/recbole/config/configurator.py b/recbole/config/configurator.py index fcaa23c4b..e23926342 100644 --- a/recbole/config/configurator.py +++ b/recbole/config/configurator.py @@ -277,7 +277,7 @@ def _set_default_parameters(self): if self.final_config_dict['loss_type'] in ['CE']: if self.final_config_dict['MODEL_TYPE'] == ModelType.SEQUENTIAL and \ self.final_config_dict['neg_sampling'] is not None: - raise ValueError(f"neg_sampling [{self.final_config_dict['neg_sampling']}] should be 0 " + raise ValueError(f"neg_sampling [{self.final_config_dict['neg_sampling']}] should be None " f"when the loss_type is CE.") self.final_config_dict['MODEL_INPUT_TYPE'] = InputType.POINTWISE elif self.final_config_dict['loss_type'] in ['BPR']: diff --git a/recbole/data/dataloader/general_dataloader.py b/recbole/data/dataloader/general_dataloader.py index 6fb064bbb..0b3fe8bf1 100644 --- a/recbole/data/dataloader/general_dataloader.py +++ b/recbole/data/dataloader/general_dataloader.py @@ -193,11 +193,14 @@ def __init__(self, config, dataset, sampler, shuffle=False): def _set_user_property(self, uid, used_item, positive_item): if uid is None: return + #print(used_item) history_item = used_item - positive_item + #print(history_item) self.uid2positive_item[uid] = torch.tensor(list(positive_item), dtype=torch.int64) self.uid2items_num[uid] = len(positive_item) self.uid2history_item[uid] = torch.tensor(list(history_item), dtype=torch.int64) - + #print(self.uid2history_item[uid]) + def _init_batch_size_and_step(self): batch_size = self.config['eval_batch_size'] if not self.is_sequential: @@ -234,6 +237,7 @@ def _next_batch_data(self): positive_i = torch.cat(list(positive_item)) self.pr += self.step + #print(history_u,history_i) return user_df, (history_u, history_i), positive_u, positive_i else: interaction = self.dataset[self.pr:self.pr + self.step] diff --git a/recbole/data/utils.py b/recbole/data/utils.py index 599fcba3a..4b98fb2c6 100644 --- a/recbole/data/utils.py +++ b/recbole/data/utils.py @@ -97,6 +97,7 @@ def data_preparation(config, dataset, save=False): """ model_type = config['MODEL_TYPE'] built_datasets = dataset.build() + logger = getLogger() train_dataset, valid_dataset, test_dataset = built_datasets train_sampler, valid_sampler, test_sampler = create_samplers(config, dataset, built_datasets) @@ -109,7 +110,16 @@ def data_preparation(config, dataset, save=False): valid_data = get_dataloader(config, 'evaluation')(config, valid_dataset, valid_sampler, shuffle=False) test_data = get_dataloader(config, 'evaluation')(config, test_dataset, test_sampler, shuffle=False) - + logger.info( + set_color('[Training]: ', 'pink') + set_color('train_batch_size', 'cyan') + ' = ' + + set_color(f'[{config["train_batch_size"]}]', 'yellow') + set_color(' negative sampling', 'cyan') + ': '+ + set_color(f'[{config["neg_sampling"]}]', 'yellow') + ) + logger.info( + set_color('[Evaluation]: ', 'pink') + set_color('eval_batch_size', 'cyan') + ' = ' + + set_color(f'[{config["eval_batch_size"]}]', 'yellow') + set_color(' eval_args', 'cyan') + ': '+ + set_color(f'[{config["eval_args"]}]', 'yellow') + ) if save: save_split_dataloaders(config, dataloaders=(train_data, valid_data, test_data)) diff --git a/recbole/trainer/trainer.py b/recbole/trainer/trainer.py index 6ad8ec986..46039d9ab 100644 --- a/recbole/trainer/trainer.py +++ b/recbole/trainer/trainer.py @@ -384,9 +384,13 @@ def _full_sort_batch_eval(self, batched_data): scores = scores.view(-1, self.tot_item_num) scores[:, 0] = -np.inf + ss = scores + # print(scores) if history_index is not None: scores[history_index] = -np.inf - + # print(scores) + # print(ss.equal(scores)) + # exit() return interaction, scores, positive_u, positive_i def _neg_sample_batch_eval(self, batched_data): From c2a0d5f9e4fea74768797715127bb40aab9fbbcf Mon Sep 17 00:00:00 2001 From: 2017pxy <2017202006@ruc.edu.cn> Date: Tue, 24 Aug 2021 05:19:54 +0000 Subject: [PATCH 2/8] FEA: update the docs --- docs/source/asset/framework.png | Bin 0 -> 128664 bytes docs/source/asset/logo.png | Bin 0 -> 34332 bytes docs/source/asset/tensorboard_1.png | Bin 0 -> 93968 bytes docs/source/asset/tensorboard_2.png | Bin 0 -> 49290 bytes .../developer_guide/customize_samplers.rst | 116 +++++++------- docs/source/get_started/introduction.rst | 35 ---- docs/source/get_started/quick_start.rst | 102 ++++++------ docs/source/index.rst | 40 ++++- .../user_guide/config/data_settings.rst | 102 ++++++++++++ .../config/environment_settings.rst | 26 +++ .../user_guide/config/evaluation_settings.rst | 34 ++++ .../config/parameters_configuration.rst | 149 ++++++++++++++++++ .../user_guide/config/training_settings.rst | 24 +++ docs/source/user_guide/config_settings.rst | 8 +- .../user_guide/data/dataset_download.rst | 39 +++++ docs/source/user_guide/data/label_of_data.rst | 90 +++++++++++ docs/source/user_guide/data_intro.rst | 16 +- docs/source/user_guide/evaluation_support.rst | 65 -------- docs/source/user_guide/train_eval_intro.rst | 97 ++++++++++++ docs/source/user_guide/usage.rst | 8 +- docs/source/user_guide/usage/qa.rst | 12 -- .../usage/running_different_models.rst | 79 +++------- .../user_guide/usage/running_new_dataset.rst | 51 +++--- .../user_guide/usage/use_tensorboard.rst | 21 +++ recbole/data/dataset/dataset.py | 2 +- recbole/sampler/sampler.py | 2 +- recbole/trainer/trainer.py | 4 - 27 files changed, 800 insertions(+), 322 deletions(-) create mode 100644 docs/source/asset/framework.png create mode 100644 docs/source/asset/logo.png create mode 100644 docs/source/asset/tensorboard_1.png create mode 100644 docs/source/asset/tensorboard_2.png delete mode 100644 docs/source/get_started/introduction.rst create mode 100644 docs/source/user_guide/config/data_settings.rst create mode 100644 docs/source/user_guide/config/environment_settings.rst create mode 100644 docs/source/user_guide/config/evaluation_settings.rst create mode 100644 docs/source/user_guide/config/parameters_configuration.rst create mode 100644 docs/source/user_guide/config/training_settings.rst create mode 100644 docs/source/user_guide/data/dataset_download.rst create mode 100644 docs/source/user_guide/data/label_of_data.rst delete mode 100644 docs/source/user_guide/evaluation_support.rst create mode 100644 docs/source/user_guide/train_eval_intro.rst create mode 100644 docs/source/user_guide/usage/use_tensorboard.rst diff --git a/docs/source/asset/framework.png b/docs/source/asset/framework.png new file mode 100644 index 0000000000000000000000000000000000000000..add0b80284e4e9b24689769286c2f5cf06105ab7 GIT binary patch literal 128664 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 literal 0 HcmV?d00001 diff --git a/docs/source/asset/tensorboard_1.png b/docs/source/asset/tensorboard_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1a48d6dcd502cfd46aeb6e3c1c2c6d0698fc2898 GIT binary patch literal 93968 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ξVooz7Sr#lTZp34t*^VK;deo8@aX2c~|qBo$Hp} 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 LD_SC~`~Cj_YrBAB literal 0 HcmV?d00001 diff --git a/docs/source/developer_guide/customize_samplers.rst b/docs/source/developer_guide/customize_samplers.rst index 3c37797cc..ebfa414bd 100644 --- a/docs/source/developer_guide/customize_samplers.rst +++ b/docs/source/developer_guide/customize_samplers.rst @@ -1,8 +1,22 @@ Customize Samplers ====================== +In RecBole, sampler module is designed to select negative items for training and evaluation. + Here we present how to develop a new sampler, and apply it into RecBole. The new sampler is used when we need complex sampling method. +In RecBole, we now only support two kinds of sampling strategies: **random negative sampling (RNS)** and **popularity-biased negative sampling (PNS)**. +RNS is to select the negative items in uniform distribution, and PNS is to select the negative item in a popularity-biased distribution. +For PNS, we set the popularity-biased distribution based on the total number of items' interactions. + +In our framework, if you want to create a new sampler, you need to inherit the :class:`~recbole.sampler.sampler.AbstractSampler`, implement +:obj:`__init__()`, , +:meth:`~recbole.sampler.sampler.KGSampler.__init__()`, +, rewrite three functions: :obj: `_uni_sampling()`, +:obj: `._get_candidates_list()`, :obj: `get_used_ids()` +and create a new sampling function. + + Here, we take the :class:`~recbole.sampler.sampler.KGSampler` as an example. @@ -37,35 +51,36 @@ where we only need to invoke :obj:`super.__init__(distribution)`. super().__init__(distribution=distribution) +Implement _uni_sampling() +------------------------------- +To implement the RNS for KGSampler, we need to rewrite the `:meth:`~recbole.sampler.sampler.AbstractSampler._uni_sampling`. +Here we use the :obj:`numpy.random.randint()` to help us randomly select the ``entity_id``. This function will return the +selected samples' id (here is ``entity_id``). -Implement get_random_list() ------------------------------- -We do not use the random function in python or numpy due to their lower efficiency. -Instead, we realize our own :meth:`~recbole.sampler.sampler.AbstractSampler.random` function, where the key method is to combine the random list with the pointer. -The pointer point to some element in the random list. When one calls :meth:`self.random`, the element is returned, and moves the pointer backward by one element. -If the pointer point to the last element, then it will return to the head of the element. +Example code: + +.. code:: python -In :class:`~recbole.sampler.sampler.AbstractSampler`, the :meth:`~recbole.sampler.sampler.AbstractSampler.__init__` will call :meth:`~recbole.sampler.sampler.AbstractSampler.get_random_list`, and shuffle the results. -We only need to return a list including all the elements. + def _uni_sampling(self, sample_num): + return np.random.randint(1, self.entity_num, sample_num) -It should be noted ``0`` can be the token used for padding, thus one should remain this value. +Implement _get_candidates_list() +------------------------------------- +To implement PNS for KGSampler, we need to rewrite the `:meth:`~recbole.sampler.sampler.AbstractSampler._get_candidates_list`. +This function is used to get a candidate list for PNS, and we will set the sampling distribution based on +:obj:`Counter(candidate_list)`. This function will return a list of candidates' id. Example code: -.. code:: python +..code:: python - def get_random_list(self): - if self.distribution == 'uniform': - return list(range(1, self.entity_num)) - elif self.distribution == 'popularity': - return list(self.hid_list) + list(self.tid_list) - else: - raise NotImplementedError('Distribution [{}] has not been implemented'.format(self.distribution)) + def _get_candidates_list(self): + return list(self.hid_list) + list(self.tid_list) Implement get_used_ids() ---------------------------- -For negative sampling, we do not want to sample positive instance, this function is used to compute the positive sample. +For negative sampling, we do not want to sample positive instance, this function is used to record the positive sample. The function will return numpy, and the index is the ID. The return value will be saved in :attr:`self.used_ids`. Example code: @@ -73,13 +88,20 @@ Example code: .. code:: python def get_used_ids(self): - used_tail_entity_id = np.array([set() for i in range(self.entity_num)]) + used_tail_entity_id = np.array([set() for _ in range(self.entity_num)]) for hid, tid in zip(self.hid_list, self.tid_list): used_tail_entity_id[hid].add(tid) + + for used_tail_set in used_tail_entity_id: + if len(used_tail_set) + 1 == self.entity_num: # [pad] is a entity. + raise ValueError( + 'Some head entities have relation with all entities, ' + 'which we can not sample negative entities for them.' + ) return used_tail_entity_id -Implementing the sampling function +Implement the sampling function ----------------------------------- In :class:`~recbole.sampler.sampler.AbstractSampler`, we have implemented :meth:`~recbole.sampler.sampler.AbstractSampler.sample_by_key_ids` function, where we have three parameters: :attr:`key_ids`, :attr:`num` and :attr:`used_ids`. @@ -109,12 +131,6 @@ Complete Code .. code:: python class KGSampler(AbstractSampler): - """:class:`KGSampler` is used to sample negative entities in a knowledge graph. - - Args: - dataset (Dataset): The knowledge graph dataset, which contains triplets in a knowledge graph. - distribution (str, optional): Distribution of the negative entities. Defaults to 'uniform'. - """ def __init__(self, dataset, distribution='uniform'): self.dataset = dataset @@ -128,47 +144,31 @@ Complete Code super().__init__(distribution=distribution) - def get_random_list(self): - """ - Returns: - np.ndarray or list: Random list of entity_id. - """ - if self.distribution == 'uniform': - return list(range(1, self.entity_num)) - elif self.distribution == 'popularity': - return list(self.hid_list) + list(self.tid_list) - else: - raise NotImplementedError('Distribution [{}] has not been implemented'.format(self.distribution)) + def _uni_sampling(self, sample_num): + return np.random.randint(1, self.entity_num, sample_num) + + def _get_candidates_list(self): + return list(self.hid_list) + list(self.tid_list) def get_used_ids(self): - """ - Returns: - np.ndarray: Used entity_ids is the same as tail_entity_ids in knowledge graph. - Index is head_entity_id, and element is a set of tail_entity_ids. - """ - used_tail_entity_id = np.array([set() for i in range(self.entity_num)]) + used_tail_entity_id = np.array([set() for _ in range(self.entity_num)]) for hid, tid in zip(self.hid_list, self.tid_list): used_tail_entity_id[hid].add(tid) + + for used_tail_set in used_tail_entity_id: + if len(used_tail_set) + 1 == self.entity_num: # [pad] is a entity. + raise ValueError( + 'Some head entities have relation with all entities, ' + 'which we can not sample negative entities for them.' + ) return used_tail_entity_id def sample_by_entity_ids(self, head_entity_ids, num=1): - """Sampling by head_entity_ids. - - Args: - head_entity_ids (np.ndarray or list): Input head_entity_ids. - num (int, optional): Number of sampled entity_ids for each head_entity_id. Defaults to ``1``. - - Returns: - np.ndarray: Sampled entity_ids. - entity_ids[0], entity_ids[len(head_entity_ids)], entity_ids[len(head_entity_ids) * 2], ..., - entity_id[len(head_entity_ids) * (num - 1)] is sampled for head_entity_ids[0]; - entity_ids[1], entity_ids[len(head_entity_ids) + 1], entity_ids[len(head_entity_ids) * 2 + 1], ..., - entity_id[len(head_entity_ids) * (num - 1) + 1] is sampled for head_entity_ids[1]; ...; and so on. - """ try: - return self.sample_by_key_ids(head_entity_ids, num, self.used_ids[head_entity_ids]) + return self.sample_by_key_ids(head_entity_ids, num) except IndexError: for head_entity_id in head_entity_ids: if head_entity_id not in self.head_entities: - raise ValueError('head_entity_id [{}] not exist'.format(head_entity_id)) + raise ValueError(f'head_entity_id [{head_entity_id}] not exist.') + diff --git a/docs/source/get_started/introduction.rst b/docs/source/get_started/introduction.rst deleted file mode 100644 index 06e86baaa..000000000 --- a/docs/source/get_started/introduction.rst +++ /dev/null @@ -1,35 +0,0 @@ -Introduction -============== - -RecBole is a unified, comprehensive and efficient framework developed based on PyTorch. -It aims to help the researchers to reproduce and develop recommendation models. - -In the first release, our library includes 73 recommendation algorithms `[Model List]`_, covering four major categories: - -- General Recommendation -- Sequential Recommendation -- Context-aware Recommendation -- Knowledge-based Recommendation - -We design a unified and flexible data file format, and provide the support for 28 benchmark recommendation datasets `[Collected Datasets]`_. A user can apply the provided script to process the original data copy, or simply download the processed datasets by our team. - -.. image:: ../../../asset/framework.png - :width: 600 - :align: center - -Features: - -- General and extensible data structure - We deign general and extensible data structures to unify the formatting and usage of various recommendation datasets. -- Comprehensive benchmark models and datasets - We implement 73 commonly used recommendation algorithms, and provide the formatted copies of 28 recommendation datasets. -- Efficient GPU-accelerated execution - We design many tailored strategies in the GPU environment to enhance the efficiency of our library. -- Extensive and standard evaluation protocols - We support a series of commonly used evaluation protocols or settings for testing and comparing recommendation algorithms. - -.. _[Collected Datasets]: - /dataset_list.html - -.. _[Model List]: - /model_list.html diff --git a/docs/source/get_started/quick_start.rst b/docs/source/get_started/quick_start.rst index cf12d3af9..d65466132 100644 --- a/docs/source/get_started/quick_start.rst +++ b/docs/source/get_started/quick_start.rst @@ -1,36 +1,33 @@ Quick Start =============== -Here is a quick-start example for using RecBole. We will show you how to train and test **BPR** model on the **ml-1m** dataset from API -and source code. +Here is a quick-start example for using RecBole. We will show you how to train and test **BPR** model on the **ml-100k** dataset from both **API** +and **source code**. Quick-start From API -------------------------- -1. Prepare data: ->>>>>>>>>>>>>> -Before running a model, firstly you need to prepare and load data. In order to characterize most forms of the input data -required by different recommendation tasks, RecBole designs an input data format called :doc:`../user_guide/data/atomic_files` and -you need to convert your raw data into Atomic Files before data loading. For the convenience of users, we have collected more than -28 commonly used datasets (detailed as `Dataset List `_.) and released their Atomic Files format -for users to download them freely. +1. Prepare your data: +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +Before running a model, firstly you need to prepare and load data. To help users quickly get start, +RecBole has a build-in dataset **ml-100k** and you can directly use it. However, if you want to use other datasets, you can read +.doc.`../usage/running_new_dataset` for more information. Then, you need to set data config for data loading. You can create a `yaml` file called `test.yaml` and write the following settings: .. code:: yaml # dataset config - data_path: # YOUR_DATA_FILE_PATH USER_ID_FIELD: user_id ITEM_ID_FIELD: item_id load_col: inter: [user_id, item_id] -For more details of data config, please refer to :doc:`../user_guide/data/data_settings`. +For more details of data config, please refer to :doc:`../user_guide/config/data_settings`. 2. Choose a model: ->>>>>>>>>>>>>> -In RecBole, we implement 72 recommendation models covering general recommendation, sequential recommendation, +>>>>>>>>>>>>>>>>>>>>>>>>> +In RecBole, we implement 73 recommendation models covering general recommendation, sequential recommendation, context-aware recommendation and knowledge-based recommendation. You can choose a model from our :doc:`../user_guide/model_intro`. Here we choose BPR model to train and test. @@ -41,9 +38,12 @@ Then, you need to set the parameter for BPR model. You can check the :doc:`../us # model config embedding_size: 64 +If you want to run different models, you can read :doc:`../user_guide/usage/running_different_models` for more information. + 3. Set training and evaluation config: ->>>>>>>>>>>>>> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In RecBole, we support multiple training and evaluation methods. You can choose how to train and test model by simply setting the config. + Here we want to train and test the BPR model in training-validation-test method (optimize model parameters on the training set, do parameter selection according to the results on the validation set, and finally report the results on the test set) and evaluate the model performance by full ranking with all item candidates, so we can add the following settings into the `test.yaml`. @@ -66,18 +66,19 @@ so we can add the following settings into the `test.yaml`. valid_metric: MRR@10 metric_decimal_place: 4 -For more details of training and evaluation config, please refer to :doc:`../user_guide/train_eval/training_settings` and :doc:`../user_guide/train_eval/eval_settings`. +For more details of training and evaluation config, please refer to :doc:`../user_guide/config/training_settings` and :doc:`../user_guide/config/evaluation_settings`. 4. Run the model and collect the result ->>>>>>>>>>>>>> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Now you have finished all the preparations, it's time to run the model! -you can create a new python file (e.g., `run.py`), and write the following code: + +You can create a new python file (e.g., `run.py`), and write the following code: .. code:: python from recbole.quick_start import run_recbole - run_recbole(model='BPR', dataset='ml-1m') + run_recbole(model='BPR', dataset='ml-100k') Then run the following command: @@ -90,35 +91,41 @@ And you will obtain the output like: .. code:: none - 09 Aug 03:44 INFO ml-1m - The number of users: 6041 - Average actions of users: 165.5975165562914 - The number of items: 3707 - Average actions of items: 269.88909875876953 - The number of inters: 1000209 - The sparsity of the dataset: 95.53358229599758% - Remain Fields: ['user_id', 'item_id'] - 09 Aug 03:44 INFO [Training]: train_batch_size = [2048] negative sampling: [{'uniform': 1}] - 09 Aug 03:44 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [0.8, 0.1, 0.1]}, 'group_by': 'user', 'order': 'RO', 'mode': 'full'}] - 09 Aug 03:44 INFO BPR( - (user_embedding): Embedding(6041, 64) - (item_embedding): Embedding(3707, 64) + 24 Aug 01:46 INFO ml-100k + The number of users: 944 + Average actions of users: 106.04453870625663 + The number of items: 1683 + Average actions of items: 59.45303210463734 + The number of inters: 100000 + The sparsity of the dataset: 93.70575143257098% + Remain Fields: ['user_id', 'item_id', 'rating', 'timestamp'] + 24 Aug 01:46 INFO [Training]: train_batch_size = [2048] negative sampling: [{'uniform': 1}] + 24 Aug 01:46 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [0.8, 0.1, 0.1]}, 'group_by': 'user', 'order': 'RO', 'mode': 'full'}] + 24 Aug 01:46 INFO BPR( + (user_embedding): Embedding(944, 64) + (item_embedding): Embedding(1683, 64) (loss): BPRLoss() ) - Trainable parameters: 623872 - Train 0: 100%|██████████████████████| 394/394 [00:01<00:00, 220.17it/s, GPU RAM: 0.03 G/11.91 G] - 09 Aug 03:44 INFO epoch 0 training [time: 1.82s, train loss: 232.5692] - Evaluate : 100%|████████████████████| 6040/6040 [00:08<00:00, 672.60it/s, GPU RAM: 0.03 G/11.91 G] - 09 Aug 03:44 INFO epoch 0 evaluating [time: 9.05s, valid_score: 0.225600] + Trainable parameters: 168128 + Train 0: 100%|████████████████████████| 40/40 [00:00<00:00, 200.47it/s, GPU RAM: 0.01 G/11.91 G] + 24 Aug 01:46 INFO epoch 0 training [time: 0.21s, train loss: 27.7228] + Evaluate : 100%|██████████████████████| 472/472 [00:00<00:00, 518.65it/s, GPU RAM: 0.01 G/11.91 G] + 24 Aug 01:46 INFO epoch 0 evaluating [time: 0.92s, valid_score: 0.020500] ...... - 09 Aug 03:51 INFO Finished training, best eval result in epoch 30 - 09 Aug 03:51 INFO Loading model structure and parameters from saved/BPR-Aug-09-2021_03-44-12.pth - Evaluate : 100%|████████████████████| 6040/6040 [00:08<00:00, 718.04it/s, GPU RAM: 0.03 G/11.91 G] - 09 Aug 03:51 INFO best valid : {'recall@10': 0.1466, 'mrr@10': 0.378, 'ndcg@10': 0.2067, 'hit@10': 0.7278, 'precision@10': 0.1625} - 09 Aug 03:51 INFO test result: {'recall@10': 0.1614, 'mrr@10': 0.4432, 'ndcg@10': 0.2558, 'hit@10': 0.7422, 'precision@10': 0.201} + Train 96: 100%|████████████████████████| 40/40 [00:00<00:00, 229.26it/s, GPU RAM: 0.01 G/11.91 G] + 24 Aug 01:47 INFO epoch 96 training [time: 0.18s, train loss: 3.7170] + Evaluate : 100%|██████████████████████| 472/472 [00:00<00:00, 857.00it/s, GPU RAM: 0.01 G/11.91 G] + 24 Aug 01:47 INFO epoch 96 evaluating [time: 0.56s, valid_score: 0.375200] + 24 Aug 01:47 INFO valid result: + recall@10 : 0.2162 mrr@10 : 0.3752 ndcg@10 : 0.2284 hit@10 : 0.7508 precision@10 : 0.1602 + 24 Aug 01:47 INFO Finished training, best eval result in epoch 85 + 24 Aug 01:47 INFO Loading model structure and parameters from saved/BPR-Aug-24-2021_01-46-43.pth + Evaluate : 100%|██████████████████████| 472/472 [00:00<00:00, 866.53it/s, GPU RAM: 0.01 G/11.91 G] + 24 Aug 01:47 INFO best valid : {'recall@10': 0.2195, 'mrr@10': 0.3871, 'ndcg@10': 0.2344, 'hit@10': 0.7582, 'precision@10': 0.1627} + 24 Aug 01:47 INFO test result: {'recall@10': 0.2523, 'mrr@10': 0.4855, 'ndcg@10': 0.292, 'hit@10': 0.7953, 'precision@10': 0.1962} Finally you will get the model's performance on the test set and the model file will be saved under the `/save`. Besides, -RecBole allows tracking and visualizing train loss and valid score with TensorBoard, please read the xxx for more details. +RecBole allows tracking and visualizing train loss and valid score with TensorBoard, please read the .doc.`../user_guide/usage/use_tensorboard` for more details. The above is the whole process of running a model in RecBole, and you can read other docs for depth usage. @@ -132,7 +139,6 @@ You can create a `yaml` file called `test.yaml` and set all the config as follow .. code:: yaml # dataset config - data_path: # YOUR_DATA_FILE_PATH USER_ID_FIELD: user_id ITEM_ID_FIELD: item_id load_col: @@ -161,16 +167,16 @@ Then run the following command: .. code:: bash - python run_recbole.py --model=BPR --dataset=ml-1m --config_files=test.yaml + python run_recbole.py --model=BPR --dataset=ml-100k --config_files=test.yaml -And you will get the output of running the BPR model on the ml-1m dataset. +And you will get the output of running the BPR model on the ml-100k dataset. If you want to change the parameters, such as ``embedding_size``, just set the additional command parameters as you need: .. code:: bash - python run_recbole.py --model=BPR --dataset=ml-1m --config_files=test.yaml --embedding_size=0.0001 + python run_recbole.py --model=BPR --dataset=ml-100k --config_files=test.yaml --embedding_size=0.0001 @@ -178,8 +184,8 @@ In-depth Usage ------------------- For a more in-depth usage about RecBole, take a look at -- :doc:`../user_guide/config_setting` +- :doc:`../user_guide/config_settings` - :doc:`../user_guide/data_intro` - :doc:`../user_guide/model_intro` -- :doc:`../user_guide/evaluation_support` +- :doc:`../user_guide/train_eval_intro` - :doc:`../user_guide/usage` diff --git a/docs/source/index.rst b/docs/source/index.rst index 03d471470..d2851db06 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,22 +1,50 @@ .. RecBole documentation master file. - -RecBole v0.2.0 +.. title:: RecBole v1.0.0 +.. image:: asset/logo.png ========================================================= `HomePage `_ | `Docs `_ | `GitHub `_ | `Datasets `_ | `v0.1.2 `_ -RecBole is a unified, comprehensive and efficient framework developed based on PyTorch. +Introduction +------------------------- +RecBole is a unified, comprehensive and efficient framework developed based on PyTorch. It aims to help the researchers to reproduce and develop recommendation models. -.. image:: ../../../asset/logo.png +In the lastest release, our library includes 73 recommendation algorithms `[Model List]`_, covering four major categories: + +- General Recommendation +- Sequential Recommendation +- Context-aware Recommendation +- Knowledge-based Recommendation + +We design a unified and flexible data file format, and provide the support for 28 benchmark recommendation datasets `[Collected Datasets]`_. A user can apply the provided script to process the original data copy, or simply download the processed datasets by our team. + +.. image:: asset/framework.png :width: 600 :align: center +Features: + +- General and extensible data structure + We deign general and extensible data structures to unify the formatting and usage of various recommendation datasets. +- Comprehensive benchmark models and datasets + We implement 73 commonly used recommendation algorithms, and provide the formatted copies of 28 recommendation datasets. +- Efficient GPU-accelerated execution + We design many tailored strategies in the GPU environment to enhance the efficiency of our library. +- Extensive and standard evaluation protocols + We support a series of commonly used evaluation protocols or settings for testing and comparing recommendation algorithms. + +.. _[Collected Datasets]: + /dataset_list.html + +.. _[Model List]: + /model_list.html + + .. toctree:: :maxdepth: 1 :caption: Get Started - get_started/introduction get_started/install get_started/quick_start @@ -27,7 +55,7 @@ It aims to help the researchers to reproduce and develop recommendation models. user_guide/config_settings user_guide/data_intro user_guide/model_intro - user_guide/evaluation_support + user_guide/train_eval_intro user_guide/usage diff --git a/docs/source/user_guide/config/data_settings.rst b/docs/source/user_guide/config/data_settings.rst new file mode 100644 index 000000000..156982f4c --- /dev/null +++ b/docs/source/user_guide/config/data_settings.rst @@ -0,0 +1,102 @@ +Data settings +========================= + +RecBole provides several arguments for describing: + +- Basic information of the dataset +- Operations of dataset preprocessing + +See below for the details: + +Atomic File Format +---------------------- + +- ``field_separator (str)`` : Separator of different columns in atomic files. Defaults to ``"\t"``. +- ``seq_separator (str)`` : Separator inside the sequence features. Defaults to ``" "``. + +Basic Information +---------------------- + +Common Features +'''''''''''''''''' + +- ``USER_ID_FIELD (str)`` : Field name of user ID feature. Defaults to ``user_id``. +- ``ITEM_ID_FIELD (str)`` : Field name of item ID feature. Defaults to ``item_id``. +- ``RATING_FIELD (str)`` : Field name of rating feature. Defaults to ``rating``. +- ``TIME_FIELD (str)`` : Field name of timestamp feature. Defaults to ``timestamp``. +- ``seq_len (dict)`` : Keys are field names of sequence features, values are maximum length of each sequence (which means sequences too long will be cut off). If not set, the sequences will not be cut off. Defaults to ``None``. + +Label for Point-wise DataLoader +''''''''''''''''''''''''''''''''''' + +- ``LABEL_FIELD (str)`` : Expected field name of the generated labels. Defaults to ``label``. +- ``threshold (dict)`` : The format is ``{k (str): v (float)}``. 0/1 labels will be generated according to the value of ``inter_feat[k]`` and ``v``. The rows with ``inter_feat[k] >= v`` will be labeled as positive, otherwise the label is negative. Note that at most one pair of ``k`` and ``v`` can exist in ``threshold``. Defaults to ``None``. + +NegSample Prefix for Pair-wise DataLoader +'''''''''''''''''''''''''''''''''''''''''''''''''' + +- ``NEG_PREFIX (str)`` : Prefix of field names which are generated as negative cases. E.g. if we have positive item ID named ``item_id``, then those item ID in negative samples will be called ``NEG_PREFIX + item_id``. Defaults to ``neg_``. + +Sequential Model Needed +''''''''''''''''''''''''''''''''''' + +- ``ITEM_LIST_LENGTH_FIELD (str)`` : Field name of the feature representing item sequences' length. Defaults to ``item_length``. +- ``LIST_SUFFIX (str)`` : Suffix of field names which are generated as sequences. E.g. if we have item ID named ``item_id``, then those item ID sequences will be called ``item_id + LIST_SUFFIX``. Defaults to ``_list``. +- ``MAX_ITEM_LIST_LENGTH (int)``: Maximum length of each generated sequence. Defaults to ``50``. +- ``POSITION_FIELD (str)`` : Field name of the generated position sequence. For sequence of length ``k``, its position sequence is ``range(k)``. Note that this field will only be generated if this arg is not ``None``. Defaults to ``position_id``. + +Knowledge-based Model Needed +''''''''''''''''''''''''''''''''''' + +- ``HEAD_ENTITY_ID_FIELD (str)`` : Field name of the head entity ID feature. Defaults to ``head_id``. +- ``TAIL_ENTITY_ID_FIELD (str)`` : Field name of the tail entity ID feature. Defaults to ``tail_id``. +- ``RELATION_ID_FIELD (str)`` : Field name of the relation ID feature. Defaults to ``relation_id``. +- ``ENTITY_ID_FIELD (str)`` : Field name of the entity ID. Note that it's only a symbol of entities, not real feature of one of the ``xxx_feat``. Defaults to ``entity_id``. + +Selectively Loading +------------------------------ + +- ``load_col (dict)`` : Keys are the suffix of loaded atomic files, values are the list of field names to be loaded. If a suffix doesn't exist in ``load_col``, the corresponding atomic file will not be loaded. Note that if ``load_col`` is ``None``, then all the existed atomic files will be loaded. Defaults to ``{inter: [user_id, item_id]}``. +- ``unload_col (dict)`` : Keys are suffix of loaded atomic files, values are list of field names NOT to be loaded. Note that ``load_col`` and ``unload_col`` can not be set at the same time. Defaults to ``None``. +- ``unused_col (dict)`` : Keys are suffix of loaded atomic files, values are list of field names which is loaded for data processing but will not used in model. E.g. the ``time_field`` may used for time ordering but model does not use this field. Defaults to ``None``. +- ``additional_feat_suffix (list)``: Control loading additional atomic files. E.g. if you want to load features from ``ml-100k.hello``, just set this arg as ``additional_feat_suffix: [hello]``. Features of additional features will be stored in ``Dataset.feat_list``. Defaults to ``None``. + +Filtering +----------- + +Remove duplicated user-item interactions +'''''''''''''''''''''''''''''''''''''''' + +- ``rm_dup_inter (str)`` : Whether to remove duplicated user-item interactions. If ``time_field`` exists, ``inter_feat`` will be sorted by ``time_field`` in ascending order. Otherwise it will remain unchanged. After that, if ``rm_dup_inter == first``, we will keep the first user-item interaction in duplicates; if ``rm_dup_inter == last``, we will keep the last user-item interaction in duplicates. Defaults to ``None``. + +Filter by value +'''''''''''''''''' + +- ``val_interval (dict)``: Has the format ``{k (str): interval (str), ...}``, where ``interval `` can be set as ``[A,B]`` / ``[A,B)`` / ``(A,B)`` / ``(A,B]``. The rows whose ``feat[k]`` is in the interval ``interval`` will be retained. If you want to specify more than one interval, separate them with semicolon(s). For instance, ``{k: "[A,B);(C,D]"}`` can be adopted and rows whose ``feat[k]`` is in any specified interval will be retained. Defaults to ``None``, which means all rows will be retained. + +Remove interation by user or item +''''''''''''''''''''''''''''''''''' + +- ``filter_inter_by_user_or_item (bool)`` : If ``True``, we will remove the interaction in ``inter_feat`` which user or item is not in ``user_feat`` or ``item_feat``. Defaults to ``True``. + +Filter by number of interactions +'''''''''''''''''''''''''''''''''''' + +- ``user_inter_num_interval (str)`` : Has the interval format, such as ``[A,B]`` / ``[A,B)`` / ``(A,B)`` / ``(A,B]``, where ``A`` and ``B`` are the endpoints of the interval and ``A <= B``. Users whose number of interactions is in the interval will be retained. Defaults to ``[0,inf)``. +- ``item_inter_num_interval (str)`` : Has the interval format, such as ``[A,B]`` / ``[A,B)`` / ``(A,B)`` / ``(A,B]``, where ``A`` and ``B`` are the endpoints of the interval and ``A <= B``. Items whose number of interactions is in the interval will be retained. Defaults to ``[0,inf)``. + +Preprocessing +----------------- + +- ``alias_of_user_id (list)``: List of fields' names, which will be remapped into the same index system with ``USER_ID_FIELD``. Defaults to ``None``. +- ``alias_of_item_id (list)``: List of fields' names, which will be remapped into the same index system with ``ITEM_ID_FIELD``. Defaults to ``None``. +- ``alias_of_entity_id (list)``: List of fields' names, which will be remapped into the same index system with ``ENTITY_ID_FIELD``, ``HEAD_ENTITY_ID_FIELD`` and ``TAIL_ENTITY_ID_FIELD``. Defaults to ``None``. +- ``alias_of_relation_id (list)``: List of fields' names, which will be remapped into the same index system with ``RELATION_ID_FIELD``. Defaults to ``None``. +- ``preload_weight (dict)`` : Has the format ``{k (str): v (float)}, ...``. ``k`` if a token field, representing the IDs of each row of preloaded weight matrix. ``v`` is a float like fields. Each pair of ``u`` and ``v`` should be from the same atomic file. This arg can be used to load pretrained vectors. Defaults to ``None``. +- ``normalize_field (list)`` : List of filed names to be normalized. Note that only float like fields can be normalized. Defaults to ``None``. +- ``normalize_all (bool)`` : Normalize all the float like fields if ``True``. Defaults to ``True``. + +Benchmark file +------------------- + +- ``benchmark_filename (list)`` : List of pre-split user-item interaction suffix. We will only apply normalize, remap-id, which will not delete the interaction in inter_feat. And then split the inter_feat by ``benchmark_filename``. E.g. Let's assume that the dataset is called ``click``, and ``benchmark_filename`` equals to ``['part1', 'part2', 'part3']``. That we will load ``click.part1.inter``, ``click.part2.inter``, ``click.part3.inter``, and treat them as train, valid, test dataset. Defaults to ``None``. diff --git a/docs/source/user_guide/config/environment_settings.rst b/docs/source/user_guide/config/environment_settings.rst new file mode 100644 index 000000000..dc4bb07b8 --- /dev/null +++ b/docs/source/user_guide/config/environment_settings.rst @@ -0,0 +1,26 @@ +Environment settings +=========================== +Environment settings are designed to set basic parameters of running environment. + +- ``gpu_id (int or str)`` : The id of GPU device. Defaults to ``0``. +- ``use_gpu (bool)`` : Whether or not to use GPU. If True, using GPU, else using CPU. + Defaults to ``True``. +- ``seed (int)`` : Random seed. Defaults to ``2020``. +- ``state (str)`` : Logging level. Defaults to ``'INFO'``. + Range in ``['INFO', 'DEBUG', 'WARNING', 'ERROR', 'CRITICAL']``. +- ``reproducibility (bool)`` : If True, the tool will use deterministic + convolution algorithms, which makes the result reproducible. If False, + the tool will benchmark multiple convolution algorithms and select the fastest one, + which makes the result not reproducible but can speed up model training in + some case. Defaults to ``True``. +- ``data_path (str)`` : The path of input dataset. Defaults to ``'dataset/'``. +- ``checkpoint_dir (str)`` : The path to save checkpoint file. + Defaults to ``'saved/'``. +- ``show_progress (bool)`` : Show the progress of training epoch and evaluate epoch. + Defaults to ``True``. +- ``save_dataset (bool)``: Whether or not save filtered dataset. + If True, save filtered dataset, otherwise it will not be saved. + Defaults to ``False``. +- ``save_dataloaders (bool)``: Whether or not save split dataloaders. + If True, save split dataloaders, otherwise they will not be saved. + Defaults to ``False``. diff --git a/docs/source/user_guide/config/evaluation_settings.rst b/docs/source/user_guide/config/evaluation_settings.rst new file mode 100644 index 000000000..638189e75 --- /dev/null +++ b/docs/source/user_guide/config/evaluation_settings.rst @@ -0,0 +1,34 @@ +Evaluation Settings +=========================== +Evaluation settings are designed to set parameters about model evaluation. + + + +- ``eval_args (dict)``: This parameter have 4 keys: ``group_by``, ``order``, ``split``, and ``mode``, + which respectively control the data grouping strategy, data ordering strategy, data splitting strategy + and evaluation mode for model evaluation. + + - ``group_by (str)``:`group_by` decides how we group the data in `.inter`. Now we support two kinds of grouping strategies: `['user', 'none']`. If the value of `group_by` is `user`, the data will be grouped by the column of `USER_ID_FIELD ` and split in user dimension. If the value is `none`, the data won't be grouped. The default value is `user`. + + - ``order (str)``: `order` decides how we sort the data in `.inter`. Now we support two kinds of ordering strategies: `['RO', 'TO']`, which denotes the random ordering and temporal ordering. For `RO`, we will shuffle the data and then split them in this order. For `TO`, we will sort the data by the column of `TIME_FIELD` in ascending order and the split them in this order. The default value is `RO`. + + - ``split (dict)``: `split ` decides how we split the data in `.inter`. Now we support two kinds of splitting strategies: `['RS','LS']`, which denotes the ratio-based data splitting and leave-one-out data splitting. If the key of `split` is `RS`, you need to set the splitting ratio like `[0.8,0.1,0.1]`,`[7,2,1]` or `[8,0,2]`, which denotes the ratio of training set, validation set and testing set respectively. If the key of split is `LS`, now we support three kinds of `LS` mode: `['valid_and_test', 'valid_only', 'test_only']` and you should choose one mode as the value of `LS`. The default value of `split` is `{'RS': [0.8,0.1,0.1]}`. + + - ``mode (str)``: `mode` decides the data range which we evaluate the model on. Now we support four kinds of evaluation mode: `['full','unixxx','popxxx','labeled']`. `full` , `unixxx` and `popxxx` are designed for the evaluation on implicit feedback (data without label). For implicit feedback, we regard the items with observed interactions as positive items and those without observed interactions as negative items. `full` means evaluating the model on the set of all items. `unixxx`, for example `uni100`, means uniformly sample 100 negative items for each positive item in testing set, and evaluate the model on these positive items with their sampled negative items. `popxxx`, for example `pop100`, means sample 100 negative items for each positive item in testing set based on item popularity ( Counter(item) in `.inter` file), and evaluate the model on these positive items with their sampled negative items. Here the `xxx` must be an integer. For explicit feedback (data with label), you should set the mode as `none` and we will evaluate the model based on your label. The default value is `full`. + +- ``repeatable (bool)``: Whether to evaluate the result with a repeatable recommendation scene. + Note that it is disabled for sequential models as the recommendation is already repeatable. + For other models, defaults to ``False``. +- ``metrics (list or str)``: Evaluation metrics. Defaults to + ``['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']``. Range in + ``[''Recall', 'MRR', 'NDCG', 'Hit', 'MAP', 'Precision', 'AUC', + 'MAE', 'RMSE', 'LogLoss', 'ItemCoverage', 'AveragePopularity', + 'GiniIndex','ShannonEntropy','TailPercentage' ]``. Note that value-based + metrics and ranking-based metrics can not be used together. +- ``topk (list or int or None)``: The value of k for topk evaluation metrics. + Defaults to ``10``. +- ``valid_metric (str)``: The evaluation metrics for early stopping. + It must be one of used ``metrics``. Defaults to ``'MRR@10'``. +- ``eval_batch_size (int)``: The evaluation batch size. Defaults to ``4096``. +- ``metric_decimal_place(int)``: The decimal place of metric score. Defaults to ``4``. + diff --git a/docs/source/user_guide/config/parameters_configuration.rst b/docs/source/user_guide/config/parameters_configuration.rst new file mode 100644 index 000000000..a0c57411d --- /dev/null +++ b/docs/source/user_guide/config/parameters_configuration.rst @@ -0,0 +1,149 @@ +Parameters Configuration +------------------------------ +RecBole supports three types of parameter configurations: Config files, +Parameter Dicts and Command Line. The parameters are assigned via the +Configuration module. + +Config Files +^^^^^^^^^^^^^^^^ +Config Files should be organized in the format of yaml. +The users should write their parameters according to the rules aligned with +yaml, and the final config files are processed by the configuration module +to complete the parameter settings. + +To begin with, we write the parameters into the yaml files (e.g. `example.yaml`). + +.. code:: yaml + + gpu_id: 1 + training_batch_size: 1024 + +Then, the yaml files are conveyed to the configuration module to finish the +parameter settings. + +.. code:: python + + from recbole.config import Config + + config = Config(model='BPR', dataset='ml-100k', config_file_list=['example.yaml']) + print('gpu_id: ', config['gpu_id']) + print('training_batch_size: ', config['training_batch_size']) + + +output: + +.. code:: bash + + gpu_id: 1 + training_batch_size: 1024 + +The parameter ``config_file_list`` supports multiple yaml files. + +For more details on yaml, please refer to YAML_. + +.. _YAML: https://yaml.org/ + +When using our toolkit, the parameters belonging to **Dataset parameters** and +Evaluation Settings of **Basic Parameters** are recommended to be written into +the config files, which may be convenient for reusing the configurations. + +Parameter Dicts +^^^^^^^^^^^^^^^^^^ +Parameter Dict is realized by the dict data structure in python, where the key +is the parameter name, and the value is the parameter value. The users can write their +parameters into a dict, and input it into the configuration module. + +An example is as follows: + +.. code:: python + + from recbole.config import Config + + parameter_dict = { + 'gpu_id': 2, + 'training_batch_size': 512 + } + config = Config(model='BPR', dataset='ml-100k', config_dict=parameter_dict) + print('gpu_id: ', config['gpu_id']) + print('training_batch_size: ', config['training_batch_size']) + +output: + +.. code:: bash + + gpu_id: 2 + training_batch_size: 512 + + +Command Line +^^^^^^^^^^^^^^^^^^^^^^^^ +We can also assign parameters based on the command line. +The parameters in the command line can be read from the configuration module. +The format is: `-–parameter_name=[parameter_value]`. + +Write the following code to the python file (e.g. `run.py`): + +.. code:: python + + from recbole.config import Config + + config = Config(model='BPR', dataset='ml-100k') + print('gpu_id: ', config['gpu_id']) + print('training_batch_size: ', config['training_batch_size']) + +Running: + +.. code:: bash + + python run.py --gpu_id=3 --training_batch_size=256 + +output: + +.. code:: bash + + gpu_id: 3 + training_batch_size: 256 + + +Priority +^^^^^^^^^^^^^^^^^ +RecBole supports the combination of three types of parameter configurations. + +The priority of the configuration methods is: Command Line > Parameter Dicts +> Config Files > Default Settings + +A example is as follows: + +`example.yaml`: + +.. code:: yaml + + gpu_id: 1 + training_batch_size: 1024 + +`run.py`: + +.. code:: python + + from recbole.config import Config + + parameter_dict = { + 'gpu_id': 2, + 'training_batch_size': 512 + } + config = Config(model='BPR', dataset='ml-100k', config_file_list=['example.yaml'], config_dict=parameter_dict) + print('gpu_id: ', config['gpu_id']) + print('training_batch_size: ', config['training_batch_size']) + +Running: + +.. code:: bash + + python run.py --gpu_id=3 --training_batch_size=256 + +output: + +.. code:: bash + + gpu_id: 3 + training_batch_size: 256 diff --git a/docs/source/user_guide/config/training_settings.rst b/docs/source/user_guide/config/training_settings.rst new file mode 100644 index 000000000..f95f44e2b --- /dev/null +++ b/docs/source/user_guide/config/training_settings.rst @@ -0,0 +1,24 @@ +Training Settings +=========================== +Training settings are designed to set parameters about model training. + + +- ``epochs (int)`` : The number of training epochs. Defaults to ``300``. +- ``train_batch_size (int)`` : The training batch size. Defaults to ``2048``. +- ``learner (str)`` : The name of used optimizer. Defaults to ``'adam'``. + Range in ``['adam', 'sgd', 'adagrad', 'rmsprop', 'sparse_adam']``. +- ``learning_rate (float)`` : Learning rate. Defaults to ``0.001``. +- ``neg_sampling(dict)``: This parameter control the negative sampling for model training. + The key range is ``['uniform', 'popularity']``, which decides the distribution of negative item in sampling pools. + ``uniform`` means uniformly select the negative items while ``popularity`` means select the negative item based on + their popularity (Counter(item) in `.inter` file). Note that if your data is labeled, you need to set this parameter as ``None``. + The default value of this parameter is ``{'uniform': 1}``. +- ``eval_step (int)`` : The number of training epochs before a evaluation + on the valid dataset. If it is less than 1, the model will not be + evaluated on the valid dataset. Defaults to ``1``. +- ``stopping_step (int)`` : The threshold for validation-based early stopping. + Defaults to ``10``. +- ``clip_grad_norm (dict)`` : The args of `clip_grad_norm_ `_ + which will clips gradient norm of model. Defaults to ``None``. +- ``loss_decimal_place(int)``: The decimal place of training loss. Defaults to ``4``. +- ``weight_decay (float)`` : Weight decay (L2 penalty), used for `optimizer `_. Default to ``0.0``. \ No newline at end of file diff --git a/docs/source/user_guide/config_settings.rst b/docs/source/user_guide/config_settings.rst index 4f600cc54..bb317f161 100644 --- a/docs/source/user_guide/config_settings.rst +++ b/docs/source/user_guide/config_settings.rst @@ -13,16 +13,16 @@ The introduction of different parameter configurations are presented as follows :maxdepth: 1 config/environment_settings - data/data_settings - train_eval/train_settings - train_eval/evaluation_settings + config/data_settings + config/training_settings + config/evaluation_settings How to set config? ----------------------------- RecBole supports three types of parameter configurations: Config files, Parameter Dicts and Command Line. The parameters are assigned via the Configuration module. -For more details about setting config, please read +For more details about setting config, please read .. toctree:: :maxdepth: 1 diff --git a/docs/source/user_guide/data/dataset_download.rst b/docs/source/user_guide/data/dataset_download.rst new file mode 100644 index 000000000..01672dbdd --- /dev/null +++ b/docs/source/user_guide/data/dataset_download.rst @@ -0,0 +1,39 @@ +Dataset Download +================================ + +In RecBole, we have collected and released 28 commonly-used publiced dataset (detailed as `Dataset List `_). +Users can freely download these datasets in the following three ways: + +1. Automatically downloading +----------------------------- +For the convenience of users, we implement automatically downloading module in RecBole and now we support to download the :doc:`atomic_files` of 28 commonly-used +publiced datasets (detailed as `Dataset List `_). If you want to run models on a dataset, you just need to set the +`dataset` and then the data files will be automatically downloaded. + +For example, if you want to run BPR model on the ml-1m dataset but you don't prepare the the :doc:`atomic_files` of ml-1m dataset, +you can use our automatically downloading module to download the data. +All you need is run the model as normal, and RecBole will automatically check if you have the data files, if not, it will begin to download the data files +and you will get the output like this: + +.. code:: none + + 23 Aug 10:02 INFO Prepare to download dataset [ml-1m] from [https://recbole.s3-accelerate.amazonaws.com/ProcessedDatasets/MovieLens/ml-1m.zip]. + 23 Aug 10:02 INFO Downloading https://recbole.s3-accelerate.amazonaws.com/ProcessedDatasets/MovieLens/ml-1m.zip + Downloaded 0.01 GB: 100%|█████████████████████████████████████████████████████████████████████████████| 7/7 [04:16<00:00, 36.65s/it] + 23 Aug 10:06 INFO Extracting dataset/ml-1m/ml-1m.zip + 23 Aug 10:06 INFO Downloading done. + +And next time you can directly run other models on ml-1m dataset. + +2. Download from cloud disk +----------------------------- +Besides automatically downloading, we also upload our collected and converted atomic files of 28 datasets in `Google Drive `_ and `Baidu Wangpan `_ (Password: e272). +You can also download the data from these two resources by yourself. + +3. Covert the raw data +----------------------------- +If you have already download the raw data, you can also covert them into atomic files format by yourself. +And we have already publiced some converting scripts in `RecDatasets _`. + + + diff --git a/docs/source/user_guide/data/label_of_data.rst b/docs/source/user_guide/data/label_of_data.rst new file mode 100644 index 000000000..c33b2795f --- /dev/null +++ b/docs/source/user_guide/data/label_of_data.rst @@ -0,0 +1,90 @@ +Label of data +========================= +In recommendation filed, there are two kinds of data scenes: explicit feedback scene and implicit feedback scene. + +Explicit feedback, like rating for items, has explicit label for model training. While for implicit feedback, like clicks and purchases, +the label of data is vague, and generally we will regard all the observed interaction as the positive samples and select negative samples from +unobserved interactions (known as negative sampling). + +To supports both explicit feedback scene and implicit feedback scene, RecBole design three ways to set label of data. + +1. Set label field +----------------------------- +If your data has already been labeled, you only need to set ``LABEL_FIELD`` to tell the model +which column represents the label of data, and then set `neg_sampling` as `None`. + +For example, if your `.inter` file is like: + +============= ============= ============ =============== +user_id:token item_id:token label:float timestamp:float +============= ============= ============ =============== +1 1193 1 978300760 +1 661 0 978302109 +2 11 1 978302009 +2 112 1 978312344 +2 555 0 978302321 +3 234 1 978302109 +============= ============= ============ =============== + +Then, you can set the config like: + +.. code:: yaml + + LABEL_FIELD: label + neg_sampling: None + +Note that the value of your label column should only be 0 or 1 (0 represents the negative label and +1 represents the positive label). + +2. Set threshold +------------------------------ + +If your data doesn't have labels but has users'feedback information (like rating for items) to show the their preferences, +a general way to label them is to set threshold. + +For example, if you `.inter` file is like: + +============= ============= ============ =============== +user_id:token item_id:token rating:float timestamp:float +============= ============= ============ =============== +1 1193 5 978300760 +1 661 1 978302109 +2 11 4 978302009 +2 112 4 978312344 +2 555 1 978302321 +3 234 3 978302109 +============= ============= ============ =============== + +To set label for these interactions, you can set `3` as the threshold of rating, and +the interactions will be labeled as positive if their rating no less than 3. + +You can set the config like: + +.. code:: yaml + + threshold: + rating: 3 + neg_sampling: None + +And then RecBole will automatically set label for each interactions based on their rating column. + +3. Negative sampling +------------------------------ +If your only have implicit feedback data, without label or users' feedback information. +A general way to label these kind of data is negative sampling. We will assume that for each user, all the observed interactions are positive, +and the unobserved ones are negative. And then, we will set positive label for all the observed interactions, +and select some negative samples from the unobserved interactions according to a certain strategy. + +You can set the config like: + +.. code:: yaml + + neg_sampling: + uniform: 1 + +And then, RecBole will automatically select one negative sample for each positive sample uniformly from the unobserved interactions. + +At last, for more details about the label config, please read :doc:`../config/data_settings` and :doc:`../config/training_settings`. + + + diff --git a/docs/source/user_guide/data_intro.rst b/docs/source/user_guide/data_intro.rst index 64ddad537..84b693d68 100644 --- a/docs/source/user_guide/data_intro.rst +++ b/docs/source/user_guide/data_intro.rst @@ -1,13 +1,15 @@ -Data Introduction +Data Module Introduction =================== -RecBole has a flexible and extensible data module. +RecBole not only implements lots of popular recommender models, but also collects and releases 28 commonly-used publiced datasets. +You can freely download these datasets following our docs :doc:`data/dataset_download`. -For extensibility and reusability, our data module designs an elegant data flow that transforms raw data +For extensibility and reusability, Recbole has a flexible and extensible data module. +our data module designs an elegant data flow that transforms raw data into the model input. Detailed as :doc:`data/data_flow`. - In order to characterize most forms of the input data -required by different recommendation tasks, RecBole designs an input data format called :doc:`data/atomic_files`. +required by different recommendation tasks, RecBole designs an input data format called :doc:`data/atomic_files`. All the input data should be +convert into `Atomic Files` format. Besides, we design a data structure called :doc:`data/interaction` to provides a unified internal data representation for different recommendation algorithms. @@ -22,8 +24,8 @@ Here are the related docs for data module: .. toctree:: :maxdepth: 1 + data/dataset_download data/data_flow data/atomic_files data/interaction - data/label_of_data - data/data_setttings \ No newline at end of file + data/label_of_data \ No newline at end of file diff --git a/docs/source/user_guide/evaluation_support.rst b/docs/source/user_guide/evaluation_support.rst deleted file mode 100644 index 39cc2167c..000000000 --- a/docs/source/user_guide/evaluation_support.rst +++ /dev/null @@ -1,65 +0,0 @@ -Evaluation Support -=========================== - -The function of evaluation module is to implement commonly used evaluation -protocols for recommender systems. Since different models can be compared under -the same evaluation modules, RecBole standardizes the evaluation of recommender -systems. - - -Evaluation Settings ------------------------ -The evaluation settings supported by RecBole is as following. Among them, the -first four rows correspond to the dataset splitting methods, while the last two -rows correspond to the ranking mechanism, namely a full ranking over all the -items or a sampled-based ranking. - -================== ======================================================== - Notation Explanation -================== ======================================================== - RO_RS Random Ordering + Ratio-based Splitting - TO_LS Temporal Ordering + Leave-one-out Splitting - RO_LS Random Ordering + Leave-one-out Splitting - TO_RS Temporal Ordering + Ratio-based Splitting - full full ranking with all item candidates - uniN sample-based ranking: each positive item is paired with N sampled negative items in uniform distribution - popN sample-based ranking: each positive item is paired with N sampled negative items in popularity distribution -================== ======================================================== - -The parameters used to control the evaluation settings are as follows: - -- ``eval_setting (str)``: The evaluation settings. Defaults to ``'RO_RS,full'``. - The parameter has two parts. The first part control the splitting methods, - range in ``['RO_RS','TO_LS','RO_LS','TO_RS']``. The second part(optional) - control the ranking mechanism, range in ``['full','uni100','uni1000','pop100','pop1000']``. -- ``group_by_user (bool)``: Whether the users are grouped. - It must be ``True`` when ``eval_setting`` is in ``['RO_LS', 'TO_LS']``. - Defaults to ``True``. -- ``spilt_ratio (list)``: The split ratio between train data, valid data and - test data. It only take effects when the first part of ``eval_setting`` - is in ``['RO_RS', 'TO_RS']``. Defaults to ``[0.8, 0.1, 0.1]``. -- ``leave_one_num (int)``: It only take effects when the first part of - ``eval_setting`` is in ``['RO_LS', 'TO_LS']``. Defaults to ``2``. - -Evaluation Metrics ------------------------ - -RecBole supports both value-based and ranking-based evaluation metrics. - -The value-based metrics (i.e., for rating prediction) include ``RMSE``, ``MAE``, -``AUC`` and ``LogLoss``, measuring the prediction difference between the true -and predicted values. - -The ranking-based metrics (i.e., for top-k item recommendation) include the most -common ranking-aware metrics, such as ``Recall``, ``Precision``, ``Hit``, -``NDCG``, ``MAP`` and ``MRR``, measuring the ranking performance of the -generated recommendation lists by an algorithm. - -The parameters used to control the evaluation metrics are as follows: - -- ``metrics (list or str)``: Evaluation metrics. Defaults to - ``['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']``. Range in - ``['Recall', 'MRR', 'NDCG', 'Hit', 'MAP', 'Precision', 'AUC', - 'MAE', 'RMSE', 'LogLoss']``. -- ``topk (list or int or None)``: The value of k for topk evaluation metrics. - Defaults to ``10``. diff --git a/docs/source/user_guide/train_eval_intro.rst b/docs/source/user_guide/train_eval_intro.rst new file mode 100644 index 000000000..caf7aff3a --- /dev/null +++ b/docs/source/user_guide/train_eval_intro.rst @@ -0,0 +1,97 @@ +Training & Evaluation Introduction +=========================== + +Training introduction +----------------------- +Multiple training strategies are supported by Recbole. For traditional CPU-based +collaborative filter models, non-gradient training is naturally applied. For +main-stream neural-based models, automatic gradient descent is well equipped +and set as default training strategy. Also two-stage training strategy is prepared +for pretraining-based models. In addition, users who need a unusual training strategy +can customize the ``Trainer`` and please refer to :doc:`../developer_guide/customize_trainers` +for more details. + +Apart from flexible training strategies, an automatic hyper-parameter searching is +also supported. The implement of searching is fully based on `hyperopt `_ +Users can set the range of hyper-parameters in an config file with format of hyperopt +and the optimal hyper-parameter and result will be output. +You can read :doc:`usage/parameter_tuning` for more information about hyper-parameter-tuning in RecBole. + +To control the training method, we design a series of training parameters in config, +and you can read the :doc:`config/training_settings` for more information. + + +Evaluation introduction +----------------------- +The function of evaluation module is to implement commonly used evaluation +protocols for recommender systems. Since different models can be compared under +the same evaluation modules, RecBole standardizes the evaluation of recommender +systems. + +Evaluation method +>>>>>>>>>>>>>>>>>>>>>>> + +The evaluation method supported by RecBole is as following. Among them, the +first four rows correspond to the dataset splitting methods, while the last two +rows correspond to the ranking mechanism, namely a full ranking over all the +items or a sampled-based ranking. + +================== ======================================================== + Notation Explanation +================== ======================================================== + RO Random Ordering + TO Temporal Ordering + LS Leave-one-out Splitting + RS Ratio-based Splitting + full full ranking with all item candidates + uniN sample-based ranking: each positive item is paired with N sampled negative items in uniform distribution + popN sample-based ranking: each positive item is paired with N sampled negative items in popularity distribution +================== ======================================================== + +The parameters used to control the evaluation method are as follows: + +- ``eval_args (dict)``: The overall evaluation settings. It contains all the setting of evaluation + including ``split``, ``group_by``, ``order`` and ``mode``. + + - ``split (dict)``: Control the splitting of dataset and the split ratio. The key is splitting method + and value is the list of split ratio. The range of key is ``[RO,TO]``. Defaults to ``{'RO':[0.8, 0.1, 0.1]}`` + - ``group_by (str)``: Whether to split dataset with the group of user. + Range in ``[None, user]`` and defaults to ``user``. + - ``order (str)``: Control the ordering of data and affect the splitting of data. + Range in ``['RS', 'LS']`` and defaults to ``RS``. + - ``mode (str)``: Control different candidates of ranking. + Range in ``[labeled, full,unixxx,popxxx]`` and defaults to ``full``. + +- ``repeatable (bool)``: Whether to evaluate the result with a repeatable recommendation scene. + Note that it is disabled for sequential models as the recommendation is already repeatable. + For other models, defaults to ``False``. + +Evaluation metrics +>>>>>>>>>>>>>>>>>>>>>>>>>> + +RecBole supports both value-based and ranking-based evaluation metrics. + +The value-based metrics (i.e., for rating prediction) include ``RMSE``, ``MAE``, +``AUC`` and ``LogLoss``, measuring the prediction difference between the true +and predicted values. + +The ranking-based metrics (i.e., for top-k item recommendation) include the most +common ranking-aware metrics, such as ``Recall``, ``Precision``, ``Hit``, +``NDCG``, ``MAP``, ``MRR`` and ``GAUC``, measuring the ranking performance of the +generated recommendation lists by an algorithm. Besides, several ranking-based +non-accuracy metrics are supported to evaluate in different views, such as +``ItemCoverage``, ``AveragePopularity``, ``GiniIndex``,``ShannonEntropy`` and ``TailPercentage`` +More details about metrics can refer to :doc:`/recbole/recbole.evaluator.metrics`. + +The parameters used to control the evaluation metrics are as follows: + +- ``metrics (list or str)``: Evaluation metrics. Defaults to + ``['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']``. Range in + ``['Recall', 'MRR', 'NDCG', 'Hit', 'MAP', 'Precision', 'AUC', + 'MAE', 'RMSE', 'LogLoss', 'ItemCoverage', 'AveragePopularity', + 'GiniIndex','ShannonEntropy','TailPercentage']``. + Note that value-based metrics and ranking-based metrics can not be used together. +- ``topk (list or int or None)``: The value of k for topk evaluation metrics. + Defaults to ``10``. + +For more details about evaluation settings, please read :doc:`config/evaluation_settings` \ No newline at end of file diff --git a/docs/source/user_guide/usage.rst b/docs/source/user_guide/usage.rst index 4c0a0db1e..3aca00a84 100644 --- a/docs/source/user_guide/usage.rst +++ b/docs/source/user_guide/usage.rst @@ -1,6 +1,7 @@ Usage =================== -Here we introduce how to use RecBole. +In order to help users learn the depth usage of RecBole, we write the following usage docs +to give a detailed introduction about RecBole's features. .. toctree:: :maxdepth: 1 @@ -10,7 +11,8 @@ Here we introduce how to use RecBole. usage/parameter_tuning usage/running_new_dataset usage/running_different_models - usage/qa usage/load_pretrained_embedding usage/save_and_load_data_and_model - usage/case_study \ No newline at end of file + usage/case_study + usage/use_tensorboard + usage/qa \ No newline at end of file diff --git a/docs/source/user_guide/usage/qa.rst b/docs/source/user_guide/usage/qa.rst index f088c6802..451a9c753 100644 --- a/docs/source/user_guide/usage/qa.rst +++ b/docs/source/user_guide/usage/qa.rst @@ -22,15 +22,3 @@ For more rigorous evaluation, those user-item interaction records in validation Thus the distribution of validation & test sets may be inconsistent. However, this doesn't affect the comparison between models. - -**Q3** - -Why do I receive a warning about ``batch_size changed``? What is the meaning of :attr:`batch_size` in dataloader? - -**A3** - -In RecBole's dataloader, the meaning of :attr:`batch_size` is the upper bound of the number of **interactions** in one single batch. - -On the one hand, it's easy to calculate and control the usage of GPU memories. E.g., while comparing between different datasets, you don't need to change the value of :attr:`batch_size`, because the usage of GPU memories will not change a lot. - -On the other hand, in RecBole's top-k evaluation, we need the interactions of each user grouped in one batch. In other words, the interactions of any user should not be separated into multiple batches. We try to feed more interactions into one batch, but due to the above rules, the :attr:`batch_size` is just an upper bound. And :meth:`_batch_size_adaptation` is designed to adapt the actual batch size dynamically. Thus, while executing :meth:`_batch_size_adaptation`, you will receive a warning message. diff --git a/docs/source/user_guide/usage/running_different_models.rst b/docs/source/user_guide/usage/running_different_models.rst index e262a940d..48081dcc3 100644 --- a/docs/source/user_guide/usage/running_different_models.rst +++ b/docs/source/user_guide/usage/running_different_models.rst @@ -1,19 +1,14 @@ Running Different Models ========================== -Here, we present how to run different models in RecBole. +In RecBole, we have 4 categories of models, namely general recommendation, context-aware +recommendation, sequential recommendation and knowledge-based recommendation. Since different categories of models have different requirements for data +processing and evaluation setting, we need to configure these settings appropriately. -Proper Parameters Configuration ----------------------------------- -Since different categories of models have different requirements for data -processing and evaluation setting, we need to configure these settings -appropriately. +Here, we present some examples to show how to these four categories models in RecBole. -The following will introduce the parameter configuration of these four -categories of models: namely general recommendation, context-aware -recommendation, sequential recommendation and knowledge-based recommendation. General Recommendation -^^^^^^^^^^^^^^^^^^^^^^^^^^ +--------------------------------- **specify and load the user and item columns** @@ -35,19 +30,21 @@ corresponding column names. **training and evaluation settings** General recommendation models usually needs to group data by user and perform -negative sampling. +negative sampling. You can set the config like this: .. code:: yaml - group_by_user: True - training_neg_sample_num: 1 + eval_args: + group_by: user + neg_sampling: + uniform: 1 Context-aware Recommendation -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------ **load the feature columns** -Context-aware recommendation models utilize the features of users, items and +Generally, context-aware recommendation models utilize the features of users, items and interactions to make CTR predictions, so it needs to load the used features. .. code:: yaml @@ -62,53 +59,25 @@ inter atomic file. **label setting** -We also need to configure `LABEL_FIELD`, which represents the label column in -the CTR prediction. For the Context-aware recommendation models, the setting of -`LABEL_FIELD` is divided into two cases: +In general, context-aware recommendation models mainly used in explicit feedback scenes, +so your data should have explicit feedback information and you need to set label for them. For more information about label setting, +please read the :doc:`../data/label_of_data`. -1) There is a label field in atomic file, and the value is in 0/1, we only need to -set as follows: +**evaluation settings** -.. code:: yaml - - LABEL_FIELD: label - -2) There is no label field in atomic file, we need to generate label field based -on some information. - -.. code:: yaml - - LABEL_FIELD: label - threshold: - rating: 3 - -`rating` is a column in atomic file and is loaded (by ``load_col``). In this way, -the label of the interaction with ``rating >= 3`` is set to 1, the reset are -set to 0. - -**training and evaluation settings** - -Context-aware recommendation models usually does not need to group data by user and -perform negative sampling. - -.. code:: yaml - - group_by_user: False - training_neg_sample_num: 0 - -Since there is no need to rank the results, ``eval_setting`` only needs to set -the first part, for example: - -.. code:: yaml - - eval_setting: RO_RS - -The evaluation metrics are generally set to `AUC` and `LogLoss`. +If you want to apply context-aware recommendation models for CTR predictions, you can set the config like: .. code:: yaml + eval_args: + group_by: None + mode: labeled metrics: ['AUC', 'LogLoss'] + valid_metric: AUC +Note that RecBole also supports to evaluate the context-aware recommendation models by full-ranking like general recommendation models, +but you need to make sure that your ``.inter`` file can not load any other context information column. + Sequential Recommendation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/user_guide/usage/running_new_dataset.rst b/docs/source/user_guide/usage/running_new_dataset.rst index b986567f5..ef1794a82 100644 --- a/docs/source/user_guide/usage/running_new_dataset.rst +++ b/docs/source/user_guide/usage/running_new_dataset.rst @@ -1,21 +1,23 @@ Running New Dataset ======================= -Here, we present how to use a new dataset in RecBole. +RecBole has a build-in dataset **ml-100k** for users to quickly get start. +However, if you want to use new dataset, Here, we present how to use a new dataset in RecBole. -Convert to Atomic Files +Prepare atomic files ------------------------- -If the user use the collected datasets, she can choose one of the following ways: +In order to characterize most forms of the input data required by different recommendation tasks, +RecBole designs an input data format called :doc:`../data/atomic_files` and +you need to convert your raw data into Atomic Files format before data loading. -1. Download the converted atomic files from `Google Drive `_ or `Baidu Wangpan `_ (Password: e272). -2. Find the converting script from RecDatasets_, and transform them to atomic files. +For the convenience of users, we have collected more than +28 commonly used datasets (detailed as `Dataset List `_.) and released their Atomic Files format +for users to download them freely. More information of downloading our prepared datasets can be found in :doc:`../data/dataset_download`. -If the user use other datasets, she should format the data according to the format of the atomic files. +However, if the you use other datasets, you should convert your data into the Atomic Files by yourself. -.. _RecDatasets: https://github.com/RUCAIBox/RecDatasets - -For the dataset of ml-1m, the converting file is: +For the ml-1m dataset, the converted atomic files are like: **ml-1m.inter** @@ -45,11 +47,11 @@ item_id:token movie_title:token_seq release_year:token genre:token_seq ============= ===================== ================== ============================ -Local Path +Set data path --------------- -Name of atomic files, name of dir that containing atomic files and ``config['dataset']`` should be the same. - -``config['data_path']`` should be the parent dir of the dir that containing atomic files. +You need to set the data path in config when you want to use new dataset. +The name of atomic files, name of dir that containing atomic files and ``config['dataset']`` should be the same, and +the ``data_path`` in your config should be the parent dir of the dir that containing atomic files. For example: @@ -75,6 +77,7 @@ Suppose we use ml-1m to train BPR. According to the dataset information, the user should set the dataset information and filtering parameters in the configuration file `ml-1m.yaml`. For example, we conduct 10-core filtering, removing the ratings which are smaller than 3, the time of the record should be earlier than 97830000, and we only load inter data. +The ``yaml`` file should be like: .. code:: yaml @@ -86,11 +89,11 @@ For example, we conduct 10-core filtering, removing the ratings which are smalle load_col: inter: [user_id, item_id, rating, timestamp] - min_user_inter_num: 10 - min_item_inter_num: 10 - lowest_val: - rating: 3 - timestamp: 97830000 + user_inter_num_interval: "[10,inf)" + item_inter_num_interval: "[10,inf)" + val_interval: + rating: "[3,inf)" + timestamp: "[97830000, inf)" .. code:: python @@ -108,14 +111,16 @@ Convert to Dataloader Here, we present how to convert :class:`~recbole.data.dataset.dataset.Dataset` into :obj:`Dataloader`. We firstly set the parameters in the configuration file `ml-1m.yaml`. -We leverage random ordering + ratio-based splitting and full ranking with all item candidates, the splitting ratio is set as 8:1:1. +Suppose we want to leverage random ordering + ratio-based splitting and full ranking with all item candidates, the splitting ratio is set as 8:1:1. +You can add the following config in your `ml-1m.yaml`: .. code:: yaml - ... - - eval_setting: RO_RS,full - split_ratio: [0.8,0.1,0.1] + eval_args: + split: {'RS': [8,1,1]} + group_by: user + order: RO + mode: full .. code:: python diff --git a/docs/source/user_guide/usage/use_tensorboard.rst b/docs/source/user_guide/usage/use_tensorboard.rst new file mode 100644 index 000000000..97088560b --- /dev/null +++ b/docs/source/user_guide/usage/use_tensorboard.rst @@ -0,0 +1,21 @@ +Use Tensorboard +==================== + +In the latest release, RecBole allows tracking and visualizing train loss and valid score with TensorBoard. + +In Recbole, TensorBoard output to `./log_tensorboard/` directory by default. You can start TensorBoard with: + +.. code:: sh + + $ tensorboard --logdir=log_tensorboard + +Then, go to the URL it provides OR to http://localhost:6006/. You can see the following page. + +.. image:: ../../asset/tensorboard_1.png + +This dashboard shows how the train loss and valid score change with every epoch. + +You can also compare hyperparameters by switching to the 'HPAPAMS' page +from the header menu. It’s helpful to compare these metrics across different training runs to improve your model. + +.. image:: ../../asset/tensorboard_2.png \ No newline at end of file diff --git a/recbole/data/dataset/dataset.py b/recbole/data/dataset/dataset.py index 8d52a8004..649c4f7d6 100644 --- a/recbole/data/dataset/dataset.py +++ b/recbole/data/dataset/dataset.py @@ -325,7 +325,7 @@ def _load_additional_feat(self, token, dataset_path): For those additional features, e.g. pretrained entity embedding, user can set them as ``config['additional_feat_suffix']``, then they will be loaded and stored in - :attr:`feat_name_list`. See :doc:`../user_guide/data/data_args` for details. + :attr:`feat_name_list`. See :doc:`../user_guide/data/data_settings` for details. Args: token (str): dataset name. diff --git a/recbole/sampler/sampler.py b/recbole/sampler/sampler.py index c0fc428bf..d4484693f 100644 --- a/recbole/sampler/sampler.py +++ b/recbole/sampler/sampler.py @@ -60,7 +60,7 @@ def _uni_sampling(self, sample_num): raise NotImplementedError('Method [_uni_sampling] should be implemented') def _get_candidates_list(self): - """Get sample candidates list + """Get sample candidates list for _pop_sampling() Returns: candidates_list (list): a list of candidates id. diff --git a/recbole/trainer/trainer.py b/recbole/trainer/trainer.py index 46039d9ab..450710437 100644 --- a/recbole/trainer/trainer.py +++ b/recbole/trainer/trainer.py @@ -385,12 +385,8 @@ def _full_sort_batch_eval(self, batched_data): scores = scores.view(-1, self.tot_item_num) scores[:, 0] = -np.inf ss = scores - # print(scores) if history_index is not None: scores[history_index] = -np.inf - # print(scores) - # print(ss.equal(scores)) - # exit() return interaction, scores, positive_u, positive_i def _neg_sample_batch_eval(self, batched_data): From 97501633dd7b4ea58e456749b3c2c40bba1483af Mon Sep 17 00:00:00 2001 From: 2017pxy <2017202006@ruc.edu.cn> Date: Tue, 24 Aug 2021 06:10:51 +0000 Subject: [PATCH 3/8] FEA: udpate index.rst --- conda/meta.yaml | 8 ++++---- docs/source/index.rst | 16 ++++++++++++++++ .../user_guide/config/evaluation_settings.rst | 8 ++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/conda/meta.yaml b/conda/meta.yaml index 7963dba0b..9c39b5bfe 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -9,26 +9,26 @@ requirements: build: - python host: - - python + - python >=3.6 - numpy >=1.17.2 - scipy ==1.6.0 - pandas >=1.0.5 - tqdm >=4.48.2 - pyyaml >=5.1.0 - scikit-learn >=0.23.2 - - pytorch + - pytorch >=1.7.0 - colorlog==4.7.2 - colorama==0.4.4 - tensorboard >=2.5.0 run: - - python + - python >=3.6 - numpy >=1.17.2 - scipy ==1.6.0 - pandas >=1.0.5 - tqdm >=4.48.2 - pyyaml >=5.1.0 - scikit-learn >=0.23.2 - - pytorch + - pytorch >=1.7.0 - colorlog==4.7.2 - colorama==0.4.4 - tensorboard >=2.5.0 diff --git a/docs/source/index.rst b/docs/source/index.rst index d2851db06..1b44669c4 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -85,3 +85,19 @@ Features: recbole/recbole.utils.case_study recbole/recbole.utils.utils +The Team +------------------ +RecBole is developed and maintained by `RUC, BUPT, ECNU `_. + +Here is the list of our lead developers in each development phase. They are the souls of RecBole and have made outstanding contributions. + +====================== =============== ============================================= +Time Version Lead Developers +====================== =============== ============================================= +June 2020 ~ Nov. 2020 v0.1.1 `Shanlei Mu `_, `Yupeng Hou `_, `Zihan Lin `_, `Kaiyuan Li `_ +Nov. 2020 ~ Now v0.1.2 ~ v1.0.0 `Yushuo Chen `_, `Xingyu Pan `_ +====================== =============== ============================================= + +License +------------ +RecBole uses `MIT License `_. \ No newline at end of file diff --git a/docs/source/user_guide/config/evaluation_settings.rst b/docs/source/user_guide/config/evaluation_settings.rst index 638189e75..42fffc633 100644 --- a/docs/source/user_guide/config/evaluation_settings.rst +++ b/docs/source/user_guide/config/evaluation_settings.rst @@ -8,13 +8,13 @@ Evaluation settings are designed to set parameters about model evaluation. which respectively control the data grouping strategy, data ordering strategy, data splitting strategy and evaluation mode for model evaluation. - - ``group_by (str)``:`group_by` decides how we group the data in `.inter`. Now we support two kinds of grouping strategies: `['user', 'none']`. If the value of `group_by` is `user`, the data will be grouped by the column of `USER_ID_FIELD ` and split in user dimension. If the value is `none`, the data won't be grouped. The default value is `user`. + - ``group_by (str)``: decides how we group the data in `.inter`. Now we support two kinds of grouping strategies: ``['user', 'none']``. If the value of ``group_by`` is ``user``, the data will be grouped by the column of `USER_ID_FIELD ` and split in user dimension. If the value is `none`, the data won't be grouped. The default value is ``user``. - - ``order (str)``: `order` decides how we sort the data in `.inter`. Now we support two kinds of ordering strategies: `['RO', 'TO']`, which denotes the random ordering and temporal ordering. For `RO`, we will shuffle the data and then split them in this order. For `TO`, we will sort the data by the column of `TIME_FIELD` in ascending order and the split them in this order. The default value is `RO`. + - ``order (str)``: decides how we sort the data in `.inter`. Now we support two kinds of ordering strategies: ``['RO', 'TO']``, which denotes the random ordering and temporal ordering. For ``RO``, we will shuffle the data and then split them in this order. For ``TO``, we will sort the data by the column of `TIME_FIELD` in ascending order and the split them in this order. The default value is `RO`. - - ``split (dict)``: `split ` decides how we split the data in `.inter`. Now we support two kinds of splitting strategies: `['RS','LS']`, which denotes the ratio-based data splitting and leave-one-out data splitting. If the key of `split` is `RS`, you need to set the splitting ratio like `[0.8,0.1,0.1]`,`[7,2,1]` or `[8,0,2]`, which denotes the ratio of training set, validation set and testing set respectively. If the key of split is `LS`, now we support three kinds of `LS` mode: `['valid_and_test', 'valid_only', 'test_only']` and you should choose one mode as the value of `LS`. The default value of `split` is `{'RS': [0.8,0.1,0.1]}`. + - ``split (dict)``: decides how we split the data in `.inter`. Now we support two kinds of splitting strategies: ``['RS','LS']``, which denotes the ratio-based data splitting and leave-one-out data splitting. If the key of ``split`` is ``RS``, you need to set the splitting ratio like ``[0.8,0.1,0.1]``,``[7,2,1]`` or ``[8,0,2]``, which denotes the ratio of training set, validation set and testing set respectively. If the key of split is ``LS``, now we support three kinds of ``LS`` mode: ``['valid_and_test', 'valid_only', 'test_only']`` and you should choose one mode as the value of `LS`. The default value of `split` is ``{'RS': [0.8,0.1,0.1]}``. - - ``mode (str)``: `mode` decides the data range which we evaluate the model on. Now we support four kinds of evaluation mode: `['full','unixxx','popxxx','labeled']`. `full` , `unixxx` and `popxxx` are designed for the evaluation on implicit feedback (data without label). For implicit feedback, we regard the items with observed interactions as positive items and those without observed interactions as negative items. `full` means evaluating the model on the set of all items. `unixxx`, for example `uni100`, means uniformly sample 100 negative items for each positive item in testing set, and evaluate the model on these positive items with their sampled negative items. `popxxx`, for example `pop100`, means sample 100 negative items for each positive item in testing set based on item popularity ( Counter(item) in `.inter` file), and evaluate the model on these positive items with their sampled negative items. Here the `xxx` must be an integer. For explicit feedback (data with label), you should set the mode as `none` and we will evaluate the model based on your label. The default value is `full`. + - ``mode (str)``: decides the data range which we evaluate the model on. Now we support four kinds of evaluation mode: ``['full','unixxx','popxxx','labeled']``. ``full`` , ``unixxx`` and ``popxxx`` are designed for the evaluation on implicit feedback (data without label). For implicit feedback, we regard the items with observed interactions as positive items and those without observed interactions as negative items. ``full`` means evaluating the model on the set of all items. ``unixxx``, for example ``uni100``, means uniformly sample 100 negative items for each positive item in testing set, and evaluate the model on these positive items with their sampled negative items. ``popxxx``, for example ``pop100``, means sample 100 negative items for each positive item in testing set based on item popularity (:obj:`Counter(item)` in `.inter` file), and evaluate the model on these positive items with their sampled negative items. Here the `xxx` must be an integer. For explicit feedback (data with label), you should set the mode as ``None`` and we will evaluate the model based on your label. The default value is ``full``. - ``repeatable (bool)``: Whether to evaluate the result with a repeatable recommendation scene. Note that it is disabled for sequential models as the recommendation is already repeatable. From ba9da8c60b2e995b80e12564f4e613241c4aa4ab Mon Sep 17 00:00:00 2001 From: Xingyu Pan <2017202006@ruc.edu.cn> Date: Tue, 24 Aug 2021 17:34:59 +0800 Subject: [PATCH 4/8] Update recbole/data/dataloader/general_dataloader.py Co-authored-by: chenyushuo <297086016@qq.com> --- recbole/data/dataloader/general_dataloader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recbole/data/dataloader/general_dataloader.py b/recbole/data/dataloader/general_dataloader.py index 0b3fe8bf1..4ef782343 100644 --- a/recbole/data/dataloader/general_dataloader.py +++ b/recbole/data/dataloader/general_dataloader.py @@ -195,7 +195,6 @@ def _set_user_property(self, uid, used_item, positive_item): return #print(used_item) history_item = used_item - positive_item - #print(history_item) self.uid2positive_item[uid] = torch.tensor(list(positive_item), dtype=torch.int64) self.uid2items_num[uid] = len(positive_item) self.uid2history_item[uid] = torch.tensor(list(history_item), dtype=torch.int64) From 6924e78a350150ca78249d80010856f1c6c46482 Mon Sep 17 00:00:00 2001 From: Xingyu Pan <2017202006@ruc.edu.cn> Date: Tue, 24 Aug 2021 17:35:06 +0800 Subject: [PATCH 5/8] Update recbole/data/dataloader/general_dataloader.py Co-authored-by: chenyushuo <297086016@qq.com> --- recbole/data/dataloader/general_dataloader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recbole/data/dataloader/general_dataloader.py b/recbole/data/dataloader/general_dataloader.py index 4ef782343..d83953071 100644 --- a/recbole/data/dataloader/general_dataloader.py +++ b/recbole/data/dataloader/general_dataloader.py @@ -193,7 +193,6 @@ def __init__(self, config, dataset, sampler, shuffle=False): def _set_user_property(self, uid, used_item, positive_item): if uid is None: return - #print(used_item) history_item = used_item - positive_item self.uid2positive_item[uid] = torch.tensor(list(positive_item), dtype=torch.int64) self.uid2items_num[uid] = len(positive_item) From c1b56ae786380b7b6fe486467a3445c164c5a381 Mon Sep 17 00:00:00 2001 From: Xingyu Pan <2017202006@ruc.edu.cn> Date: Tue, 24 Aug 2021 17:35:19 +0800 Subject: [PATCH 6/8] Update recbole/data/dataloader/general_dataloader.py Co-authored-by: chenyushuo <297086016@qq.com> --- recbole/data/dataloader/general_dataloader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recbole/data/dataloader/general_dataloader.py b/recbole/data/dataloader/general_dataloader.py index d83953071..eb60e36da 100644 --- a/recbole/data/dataloader/general_dataloader.py +++ b/recbole/data/dataloader/general_dataloader.py @@ -235,7 +235,6 @@ def _next_batch_data(self): positive_i = torch.cat(list(positive_item)) self.pr += self.step - #print(history_u,history_i) return user_df, (history_u, history_i), positive_u, positive_i else: interaction = self.dataset[self.pr:self.pr + self.step] From ef40d0dbc6ad56e4dcb862d67c48dd39559820f2 Mon Sep 17 00:00:00 2001 From: Xingyu Pan <2017202006@ruc.edu.cn> Date: Tue, 24 Aug 2021 17:35:29 +0800 Subject: [PATCH 7/8] Update recbole/trainer/trainer.py Co-authored-by: chenyushuo <297086016@qq.com> --- recbole/trainer/trainer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recbole/trainer/trainer.py b/recbole/trainer/trainer.py index 450710437..d6669d5fb 100644 --- a/recbole/trainer/trainer.py +++ b/recbole/trainer/trainer.py @@ -384,7 +384,6 @@ def _full_sort_batch_eval(self, batched_data): scores = scores.view(-1, self.tot_item_num) scores[:, 0] = -np.inf - ss = scores if history_index is not None: scores[history_index] = -np.inf return interaction, scores, positive_u, positive_i From 6862c8903db9ee50d226e7ba97a21bf8bf507066 Mon Sep 17 00:00:00 2001 From: chenyushuo <297086016@qq.com> Date: Tue, 24 Aug 2021 17:46:39 +0800 Subject: [PATCH 8/8] Update recbole/data/dataloader/general_dataloader.py --- recbole/data/dataloader/general_dataloader.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/recbole/data/dataloader/general_dataloader.py b/recbole/data/dataloader/general_dataloader.py index eb60e36da..cb64132f5 100644 --- a/recbole/data/dataloader/general_dataloader.py +++ b/recbole/data/dataloader/general_dataloader.py @@ -197,8 +197,6 @@ def _set_user_property(self, uid, used_item, positive_item): self.uid2positive_item[uid] = torch.tensor(list(positive_item), dtype=torch.int64) self.uid2items_num[uid] = len(positive_item) self.uid2history_item[uid] = torch.tensor(list(history_item), dtype=torch.int64) - #print(self.uid2history_item[uid]) - def _init_batch_size_and_step(self): batch_size = self.config['eval_batch_size'] if not self.is_sequential: