LibRecommender
概览
LibRecommender是一个易于使用的推荐系统,专注于端到端的推荐过程。它包含训练(libreco)和服务(libserving)模块,让用户能够快速训练和部署各种推荐模型。
主要特点包括:
- 实现了多种流行的推荐算法,如FM、DIN、LightGCN等。详见完整算法列表。
- 混合推荐系统,允许用户使用协同过滤或基于内容的特征。可以随时添加新特征。
- 内存占用低,自动将分类特征和多值分类特征转换为稀疏表示。
- 支持显式和隐式数据集的训练,以及隐式数据的负采样。
- 提供端到端工作流程,即数据处理/预处理 -> 模型训练 -> 评估 -> 保存/加载 -> 服务。
- 支持冷启动预测和推荐。
- 支持动态特征和序列推荐。
- 为所有算法提供统一且友好的API。
- 易于使用新数据中的新用户/物品重新训练模型。
使用方法
纯协同过滤示例 :
import numpy as np
import pandas as pd
from libreco.data import random_split, DatasetPure
from libreco.algorithms import LightGCN # 纯数据,算法LightGCN
from libreco.evaluation import evaluate
data = pd.read_csv("examples/sample_data/sample_movielens_rating.dat", sep="::",
names=["user", "item", "label", "time"])
# 将整个数据集分为三部分:训练、评估和测试
train_data, eval_data, test_data = random_split(data, multi_ratios=[0.8, 0.1, 0.1])
train_data, data_info = DatasetPure.build_trainset(train_data)
eval_data = DatasetPure.build_evalset(eval_data)
test_data = DatasetPure.build_testset(test_data)
print(data_info) # 用户数: 5894, 物品数: 3253, 数据稀疏度: 0.4172 %
lightgcn = LightGCN(
task="ranking",
data_info=data_info,
loss_type="bpr",
embed_size=16,
n_epochs=3,
lr=1e-3,
batch_size=2048,
num_neg=1,
device="cuda",
)
# 在训练过程中监控评估数据的指标
lightgcn.fit(
train_data,
neg_sampling=True,
verbose=2,
eval_data=eval_data,
metrics=["loss", "roc_auc", "precision", "recall", "ndcg"],
)
# 对测试数据进行最终评估
evaluate(
model=lightgcn,
data=test_data,
neg_sampling=True,
metrics=["loss", "roc_auc", "precision", "recall", "ndcg"],
)
# 预测用户2211对物品110的偏好
lightgcn.predict(user=2211, item=110)
# 为用户2211推荐7个物品
lightgcn.recommend_user(user=2211, n_rec=7)
# 冷启动预测
lightgcn.predict(user="ccc", item="not item", cold_start="average")
# 冷启动推荐
lightgcn.recommend_user(user="are we good?", n_rec=7, cold_start="popular")
包含特征的示例 :
import numpy as np
import pandas as pd
from libreco.data import split_by_ratio_chrono, DatasetFeat
from libreco.algorithms import YouTubeRanking # 特征数据,算法YouTubeRanking
data = pd.read_csv("examples/sample_data/sample_movielens_merged.csv", sep=",", header=0)
# 基于时间将数据分为训练集和测试集
train_data, test_data = split_by_ratio_chrono(data, test_size=0.2)
# 指定完整的列信息
稀疏列 = ["性别", "职业", "类型1", "类型2", "类型3"]
密集列 = ["年龄"]
用户列 = ["性别", "年龄", "职业"]
物品列 = ["类型1", "类型2", "类型3"]
训练数据, 数据信息 = DatasetFeat.build_trainset(
训练数据, 用户列, 物品列, 稀疏列, 密集列
)
测试数据 = DatasetFeat.build_testset(测试数据)
print(数据信息) # 用户数: 5962, 物品数: 3226, 数据稀疏度: 0.4185 %
ytb排序 = YouTubeRanking(
任务="排序",
数据信息=数据信息,
嵌入维度=16,
训练轮数=3,
学习率=1e-4,
批量大小=512,
使用批归一化=True,
隐藏单元=(128, 64, 32),
)
ytb排序.拟合(
训练数据,
负采样=True,
详细程度=2,
打乱=True,
评估数据=测试数据,
评估指标=["损失", "roc_auc", "精确率", "召回率", "map", "ndcg"],
)
# 预测用户2211对物品110的偏好
ytb排序.预测(用户=2211, 物品=110)
# 为用户2211推荐7个物品
ytb排序.为用户推荐(用户=2211, 推荐数=7)
# 冷启动预测
ytb排序.预测(用户="ccc", 物品="不是物品", 冷启动="平均")
# 冷启动推荐
ytb排序.为用户推荐(用户="我们还好吗?", 推荐数=7, 冷启动="热门")
## 数据格式
就是普通的数据格式,每行代表一个样本。重要的是,模型假设`用户`、`物品`和`标签`列索引分别为0、1和2。如果不是这种情况,你可能需要更改列顺序。以`movielens-1m`数据集为例:
> 1::1193::5::978300760<br>
> 1::661::3::978302109<br>
> 1::914::3::978301968<br>
> 1::3408::4::978300275
此外,如果你想使用其他元特征(如年龄、性别、类别等),你需要告诉模型哪些列是[`稀疏列`, `密集列`, `用户列`, `物品列`],这意味着所有特征必须在同一个表中。参见上面的`YouTubeRanking`示例。
**还要注意,你的数据不应包含缺失值。**
## 文档
教程和API文档托管在[librecommender.readthedocs.io](https://librecommender.readthedocs.io/en/latest/)。
示例脚本在[examples/](https://github.com/massquantity/LibRecommender/tree/master/examples)文件夹下。
## 安装与依赖
从pypi安装:
```shell
$ pip install -U LibRecommender
从源代码构建:
$ git clone https://github.com/massquantity/LibRecommender.git
$ cd LibRecommender
$ pip install .
libreco
的基本依赖:
- Python >= 3.6
- TensorFlow >= 1.15, < 2.16
- PyTorch >= 1.10
- Numpy >= 1.19.5
- Pandas >= 1.0.0
- Scipy >= 1.2.1, < 1.13.0
- scikit-learn >= 0.20.0
- gensim >= 4.0.0
- tqdm
- nmslib(可选,用于近似相似度搜索。参见Embedding)
- DGL(可选,用于GraphSage和PinSage。参见实现细节)
- Cython >= 0.29.0, < 3(可选,用于从源代码构建)
如果你使用的是Python 3.6,你还需要安装dataclasses,这在Python 3.7中首次引入。
LibRecommender已在TensorFlow 1.15、2.6、2.10和2.12下测试过。如果在运行过程中遇到任何问题,随时开一个issue。
**TensorFlow 2.16开始使用Keras 3.0,因此不再支持tf1语法。**目前支持的版本是1.15 - 2.15。
已知问题:
- 有时可能会遇到类似
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
的错误。在这种情况下,尝试升级numpy,版本1.22.0或更高可能是一个安全选择。 - 在保存TensorFlow模型以用于服务时,你可能会遇到错误消息:
Fatal Python error: Segmentation fault (core dumped)
。 这个问题很可能与protobuf
库有关,所以你应该根据你的本地tensorflow版本遵循官方推荐的版本。 通常,建议使用protobuf < 4.24.0。
下表显示了一些兼容的版本组合:
Python版本 | Numpy版本 | TensorFlow版本 | 操作系统 |
---|---|---|---|
3.6 | 1.19.5 | 1.15, 2.5 | Linux, Windows, macOS |
3.7 | 1.20.3, 1.21.6 | 1.15, 2.6, 2.10 | Linux, Windows, macOS |
3.8 | 1.22.4, 1.23.4 | 2.6, 2.10, 2.12 | Linux, Windows, macOS |
3.9 | 1.22.4, 1.23.4 | 2.6, 2.10, 2.12 | Linux, Windows, macOS |
3.10 | 1.22.4, 1.23.4, 1.24.2 | 2.10, 2.12 | Linux, Windows, macOS |
3.11 | 1.23.4, 1.24.2 | 2.12 | Linux, Windows, macOS |
libserving
的可选依赖项:
- Python >= 3.7
- sanic >= 22.3
- requests
- aiohttp
- pydantic
- ujson
- redis
- redis-py >= 4.2.0
- faiss >= 1.5.2
- TensorFlow Serving == 2.8.2
Docker
也可以在Docker容器中使用该库,无需安装依赖项,详见Docker。
参考文献
算法 | 类别1 | 后端 | 序列2 | 图3 | 嵌入4 | 论文 |
---|---|---|---|---|---|---|
基于用户/物品的协同过滤 | 纯 | Cython, Rust | 基于物品的协同过滤 | |||
SVD | 纯 | TensorFlow1 | :heavy_check_mark: | 矩阵分解技术 | ||
SVD++ | 纯 | TensorFlow1 | :heavy_check_mark: | 因子化遇上邻域 | ||
ALS | 纯 | Cython | :heavy_check_mark: | 1. 通过交替最小二乘法的矩阵补全(ALS) 2. 隐式反馈数据集的协同过滤 3. 隐式反馈的共轭梯度 | ||
NCF | 纯 | TensorFlow1 | 神经协同过滤 | |||
BPR | 纯 | Cython, TensorFlow1 | :heavy_check_mark: | 贝叶斯个性化排序 | ||
Wide & Deep | 特征 | TensorFlow1 | 推荐系统的Wide & Deep学习 | |||
FM | 特征 | TensorFlow1 | 因子分解机 | |||
DeepFM | 特征 | TensorFlow1 | DeepFM | |||
YouTube检索 | 特征 | TensorFlow1 | :heavy_check_mark: | :heavy_check_mark: | [YouTube推荐的深度神经网络](https://github.com/massquantity/LibRecommender/blob/master/https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf | |
YouTube排序 | 特征 | TensorFlow1 | :heavy_check_mark: | [YouTube推荐的深度神经网络](https://github.com/massquantity/LibRecommender/blob/master/https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf | ||
AutoInt | 特征 | TensorFlow1 | AutoInt | |||
DIN | 特征 | TensorFlow1 | :heavy_check_mark: | 深度兴趣网络 | ||
Item2Vec | 纯 | / | :heavy_check_mark: | :heavy_check_mark: | Item2Vec | |
RNN4Rec / GRU4Rec | 纯 | TensorFlow1 | :heavy_check_mark: | :heavy_check_mark: | 基于循环神经网络的会话推荐 | |
Caser | 纯 | TensorFlow1 | :heavy_check_mark: | :heavy_check_mark: | 个性化Top-N序列推荐的卷积方法 | |
WaveNet | 纯 | TensorFlow1 | :heavy_check_mark: | :heavy_check_mark: | WaveNet:原始音频的生成模型 | |
DeepWalk | 纯 | / | :heavy_check_mark: | :heavy_check_mark: | DeepWalk | |
NGCF | 纯 | PyTorch | :heavy_check_mark: | :heavy_check_mark: | 神经图协同过滤 | |
LightGCN | 纯 | PyTorch | :heavy_check_mark: | :heavy_check_mark: | LightGCN | |
GraphSage | 特征 | DGL, PyTorch | :heavy_check_mark: | :heavy_check_mark: | 大规模图上的归纳表示学习 | |
PinSage | 特征 | DGL, PyTorch | :heavy_check_mark: | :heavy_check_mark: | Web规模的图卷积神经网络 | |
TwoTower | 特征 | TensorFlow1 | :heavy_check_mark: | 1. 大规模语料项目的采样偏差校正神经建模 2. 大规模项目的自监督学习 | ||
Transformer | 特征 | TensorFlow1 | :heavy_check_mark: | 1. BST 2. Transformers4Rec 3. RMSNorm | ||
SIM | 特征 | TensorFlow1 | :heavy_check_mark: | SIM | ||
Swing | 纯粹 | Rust | Swing |
[1] 类别:
pure
指仅使用行为数据的协同过滤算法,feat
指可包含其他辅助特征。↩[2] 序列:利用用户行为序列的算法。↩
[3] 图:利用图信息的算法,包括图嵌入(GE)和图神经网络(GNN)。↩
[4] 嵌入:能生成最终用户和物品嵌入的算法。↩