使用RUCAIBox/RecBole实现序列推荐快速入门
序列推荐是推荐系统领域的重要研究方向,它通过分析用户的历史交互序列来预测用户可能感兴趣的下一个物品。本文将详细介绍如何使用RUCAIBox/RecBole框架快速实现序列推荐任务,以GRU4Rec模型在ml-100k数据集上的应用为例。
序列推荐基础概念
序列推荐与传统推荐系统的核心区别在于它考虑了用户交互的时间顺序。传统推荐系统如BPR主要关注用户-物品的整体交互矩阵,而序列推荐模型则会利用用户历史交互的时间序列信息来预测下一个可能交互的物品。
准备工作
1. 数据准备
RUCAIBox/RecBole内置了ml-100k数据集,可以直接使用。如果需要使用自定义数据集,需要按照特定格式准备数据。
对于序列推荐任务,我们需要在配置文件中指定以下关键字段:
USER_ID_FIELD: user_id
ITEM_ID_FIELD: item_id
TIME_FIELD: timestamp
load_col:
inter: [user_id, item_id,timestamp]
ITEM_LIST_LENGTH_FIELD: item_length
LIST_SUFFIX: _list
MAX_ITEM_LIST_LENGTH: 50
这些配置指定了用户ID字段、物品ID字段、时间戳字段,以及序列的最大长度限制。
2. 数据增强处理
序列推荐模型需要对原始数据进行增强处理,生成训练样本。例如,用户u1的交互序列为i1→i2→i3→i4→i5,当MAX_ITEM_LIST_LENGTH=3时,系统会生成以下训练样本:
- 输入序列:[i1, 填充, 填充],目标物品:i2
- 输入序列:[i1, i2, 填充],目标物品:i3
- 输入序列:[i1, i2, i3],目标物品:i4
- 输入序列:[i2, i3, i4],目标物品:i5
这种处理方式确保了模型能够学习到不同长度的序列模式。
模型选择与配置
我们选择GRU4Rec作为示例模型,这是一种基于门控循环单元(GRU)的序列推荐模型。在配置文件中需要设置以下模型参数:
embedding_size: 64
hidden_size: 128
num_layers: 1
dropout_prob: 0.3
loss_type: 'CE'
这些参数分别控制:
- embedding_size:物品嵌入向量的维度
- hidden_size:GRU隐藏层的维度
- num_layers:GRU的层数
- dropout_prob:Dropout概率,用于防止过拟合
- loss_type:损失函数类型,这里使用交叉熵损失
训练与评估配置
序列推荐任务的训练和评估需要特殊配置:
epochs: 500
train_batch_size: 4096
eval_batch_size: 4096
train_neg_sample_args: ~
eval_args:
group_by: user
order: TO
split: {'LS': 'valid_and_test'}
mode: full
metrics: ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']
topk: 10
valid_metric: MRR@10
关键配置说明:
- eval_args.mode: full表示使用全量评估,即考虑所有物品作为候选
- metrics: 定义了评估指标,包括Recall、MRR等
- topk: 计算top-10推荐结果
- valid_metric: 使用MRR@10作为模型选择的标准
运行模型
通过API运行
创建Python脚本run.py,内容如下:
from recbole.quick_start import run_recbole
run_recbole(model='GRU4Rec', dataset='ml-100k', config_file_list=['test.yaml'])
执行脚本后,你将看到类似如下的输出:
Train 43: 100%|█████████████████████████| 24/24 [00:01<00:00, 17.43it/s, GPU RAM: 1.46 G/31.75 G]
16 Jul 21:13 INFO epoch 43 training [time: 1.38s, train loss: 134.4222]
Evaluate : 100%|███████████████████████████| 1/1 [00:00<00:00, 86.71it/s, GPU RAM: 1.46 G/31.75 G]
16 Jul 21:13 INFO epoch 43 evaluating [time: 0.02s, valid_score: 0.043600]
16 Jul 21:13 INFO valid result:
recall@10 : 0.1326 mrr@10 : 0.0436 ndcg@10 : 0.0641 hit@10 : 0.1326 precision@10 : 0.0133
通过源代码运行
也可以直接使用命令行运行:
python run_recbole.py --model=GRU4Rec --dataset=ml-100k --config_files=test.yaml
如果需要调整参数,可以直接在命令行中指定:
python run_recbole.py --model=GRU4Rec --dataset=ml-100k --config_files=test.yaml --embedding_size=100
结果分析
模型训练完成后,你会得到在测试集上的评估结果,包括Recall、MRR、NDCG等多个指标。例如:
test result: OrderedDict([('recall@10', 0.1103), ('mrr@10', 0.0337), ('ndcg@10', 0.0513), ('hit@10', 0.1103), ('precision@10', 0.011)])
这些指标从不同角度评估了模型的推荐效果:
- Recall@10:在前10个推荐结果中命中真实物品的概率
- MRR@10:考虑命中物品排名的倒数平均值
- NDCG@10:考虑排名位置的折扣累积增益
进阶建议
- 尝试不同的序列推荐模型,如SASRec、BERT4Rec等
- 调整序列最大长度,观察对模型效果的影响
- 实验不同的嵌入维度和GRU层数
- 使用更大的数据集测试模型性能
- 尝试不同的评估策略,如留一法评估
通过RUCAIBox/RecBole框架,你可以轻松实现序列推荐任务,并快速验证不同模型和参数配置的效果。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust099- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiMo-V2.5-ProMiMo-V2.5-Pro作为旗舰模型,擅⻓处理复杂Agent任务,单次任务可完成近千次⼯具调⽤与⼗余轮上 下⽂压缩。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00