推荐系统工具包:一个开源的推荐系统工具包
该代码库提供了一系列经典的传统推荐方法,这些方法仅使用评分数据进行预测,以及社交推荐方法,这些方法利用信任/社交信息来缓解评分数据的稀疏性问题。此外,我们还收集了一些其他人实现的经典方法,以方便您使用。
传统推荐
- UserCF[Resnick等人,1994]
Resnick, Paul等人。"GroupLens:协作过滤网络新闻的开放架构"。1994年ACM计算机支持的协作工作会议论文集。ACM,1994。
- ItemCF[Sarwar等人,2001]
Sarwar, Badrul等人。"基于项目的协作过滤推荐算法"。第10届国际万维网会议论文集。ACM,2001。
- FunkSVD[Simon Funk,2006]
http://sifter.org/~simon/journal/20061211.html
- PMF[Salakhutdinov,2008]
Mnih, Andriy和Ruslan R. Salakhutdinov。"概率矩阵分解"。神经信息处理系统进展(2008):1257-1264。
- IntegSVD[Koren等人,2008]
Koren, Yehuda。"因子化遇上邻域:多面协作过滤模型"。第14届ACM SIGKDD知识发现和数据挖掘国际会议论文集。ACM,2008。
- BiasSVD[Koren等人,2009]
Koren, Yehuda、Robert Bell和Chris Volinsky。"推荐系统的矩阵分解技术"。计算机42.8(2009)。
- SVD++[Koren等人,2010]
Koren, Yehuda。"考虑邻居因素:可扩展且准确的协作过滤"。ACM知识发现和数据交易(TKDD)4.1(2010):1。
社交推荐
- SocialRec[Ma等人,2008]
Ma, Hao等人。"Sorec:使用概率矩阵分解的社交推荐"。第17届ACM信息和知识管理会议论文集。ACM,2008。
- RSTE[Ma等人,2009]
Ma, Hao、Irwin King和Michael R. Lyu。"学习使用社交信任集成进行推荐"。第32届ACM SIGIR信息检索研究与开发国际会议论文集。ACM,2009。
- TrustWalker[Jamali和Ester,2009]
Jamali, Mohsen和Martin Ester。"Trustwalker:结合基于信任和基于项目推荐的随机游走模型"。第15届ACM SIGKDD知识发现和数据挖掘国际会议论文集。ACM,2009。
- SocialMF[Jamali和Ester,2010]
Jamali, Mohsen和Martin Ester。"一种用于社交网络推荐的信任传播矩阵分解技术"。第四届ACM推荐系统会议论文集。ACM,2010。
- SocialReg[Ma等人,2011]
Ma, Hao等人。"具有社交正则化的推荐系统"。第四届ACM国际网络搜索和数据挖掘会议论文集。ACM,2011。
- TrustSVD[Guo等人,2015]
Guo, Guibing、Jie Zhang和Neil Yorke-Smith。"TrustSVD:同时考虑用户信任的显式和隐式影响以及项目评分的协作过滤"。AAAI。第15卷。2015。
- CUNE[Zhang等人,2017]
Chuxu Zhang、Lu Yu、Yan Wang、Chirag Shah、Xiangliang Zhang。"社交推荐系统的协作用户网络嵌入"。SDM,2017。
其他人实现的RSAlgorithms
Sedhain等人。"Autorec:自编码器遇上协作过滤"。WWW,2015。代码
Kim等人。"用于文档上下文感知推荐的卷积矩阵分解"。RecSys,2016。代码
Liang等人。"因子化遇上项目嵌入:使用项目共现正则化矩阵分解"。RecSys,2016。代码
He等人。"用于具有隐式反馈的在线推荐的快速矩阵分解"。SIGIR,2016。代码
Quadrana等人。"使用分层递归神经网络个性化会话推荐"。RecSys,2017。代码
He等人。"神经协作过滤"。WWW,2017。代码
Ebesu等人。"推荐系统的协作记忆网络"。SIGIR,2018。代码
Fan等人。"社交推荐的图神经网络"。WWW,2019。代码
Chong等人。"用于推荐的高效异构协作过滤无需负采样"。AAAI,2020。代码
环境要求
- numpy==1.14.2
- scipy==1.0.1
- pandas==0.22.0
- matplotlib==2.2.2
代码结构
我们项目的结构以树形式呈现如下:
推荐系统 # 项目根目录
│ README.md
│ __init__.py
│ .gitignore
|
└───configx # 配置全局参数和超参数
│ │ configx.py
| │
└───data # 存储评分和社交数据
│ │ ft_ratings.txt
| │ ft_trust.txt
| |
│ └───cv # 交叉验证数据
│ │ ft-0.txt
│ │ ft-1.txt
│ │ ft-2.txt
│ │ ft-3.txt
│ │ ft-4.txt
| |
└───metrics # 用于衡量评分预测任务预测准确性的指标
│ │ metric.py
| |
└───model # 传统和社交推荐方法集
│ │ bias_svd.py
│ │ funk_svd.py
│ │ pmf.py
│ │ integ_svd.py
| | item_cf.py
| | item_cf_big.py
| | mf.py
| | social_mf.py
| | social_rec.py
| | social_reg.py
| | social_rste.py
| | svd++.py
| | trust_svd.py
| | trust_walker.py
| | user_cf.py
| |
└───reader # 评分和社交数据的数据生成器
│ │ rating.py
│ │ trust.py
| |
└───utility # 其他常用工具
│ cross_validation.py
│ data_prepro.py
│ data_statistics.py
│ draw_figure.py
│ matrix.py
│ similarity.py
│ tools.py
│ util.py
参数设置
如果您想更改默认超参数,可以在configx.py
中进行设置。超参数的含义如下:
数据集参数
dataset_name
:数据集的简称,默认值为ft
。
k_fold_num
:交叉验证的折数,默认值为5
。
rating_path
:原始评分数据文件的路径,默认值为../data/ft_ratings.txt
。
rating_cv_path
:评分数据的交叉验证路径,默认值为../data/cv/
。
trust_path
:原始信任数据文件的路径,默认值为../data/ft_trust.txt
。
sep
:三元组中评分和信任数据的分隔符,默认值为
。
random_state
:随机数种子,默认值为0
。
size
:训练集的比例,默认值为0.8
。
min_val
:最小评分值,默认值为0.5
。
max_val
:最大评分值,默认值为4.0
。
模型超参数
coldUserRating
:冷启动用户对项目的评分数量,默认值为5
。
factor
:用户和项目的潜在维度大小,默认值为10
。
threshold
:模型训练的阈值,默认值为1e-4
。
lr
:学习率,默认值为0.01
。
maxIter
:最大迭代次数,默认值为100
。
lambdaP
:用户正则化参数,默认值为0.001
。
lambdaQ
:项目正则化参数,默认值为0.001
。
gamma
:动量系数,默认值为0.9
。
isEarlyStopping
:早停标志,默认值为false
。
输出参数
result_path
:结果主目录,默认值为../results/
。
model_path
:训练好的变量目录,默认值为../results/model/
。
result_log_path
:训练模型时的日志目录,默认值为../results/log/
。
使用方法
接下来,我将以pmf
为例介绍如何执行我们的代码。
首先,我们应该将评分数据分割成几个部分用于训练、测试和交叉验证。
from utility.cross_validation import split_5_folds
from configx.configx import ConfigX
if __name__ == "__main__":
configx = ConfigX()
configx.k_fold_num = 5
configx.rating_path = "../data/ft_ratings.txt"
configx.rating_cv_path = "../data/cv/"
split_5_folds(configx)
然后,我们打开model
文件夹中的pmf.py
文件,配置训练的超参数并执行以下代码:
if __name__ == '__main__':
rmses = []
maes = []
bmf = FunkSVDwithR()
for i in range(bmf.config.k_fold_num):
bmf.train_model(i)
rmse, mae = bmf.predict_model()
print("当前最佳rmse为%0.5f,mae为%0.5f" % (rmse, mae))
rmses.append(rmse)
maes.append(mae)
rmse_avg = sum(rmses) / 5
mae_avg = sum(maes) / 5
print("rmse列表为%s" % rmses)
print("mae列表为%s" % maes)
print("rmse平均值为%s " % rmse_avg)
print("mae平均值为%s " % mae_avg)
引用
如果您使用了我们的代码,请引用我们的论文。谢谢!
@inproceedings{pricai2018sotricf,
title="Social Collaborative Filtering Ensemble",
author="Zhang, Honglei and Liu, Gangdu and Wu, Jun",
booktitle="PRICAI",
pages="1005--1017"
year="2018",
}
@inproceedings{ijcnn2019MFDGE,
title={Integrating dual user network embedding with matrix factorization for social recommender systems},
author={Chen, Liying and Zhang, Honglei and Wu, Jun},
booktitle={IJCNN},
pages={1--8},
year={2019},
}
RSPapers
最近,我们启动了一个开源项目RSPapers,其中包含一些经典的综述、传统推荐系统、社交推荐系统、基于深度学习的推荐系统、推荐系统中的冷启动问题和POI推荐系统。
致谢
特别为您总结了传统和社交推荐系统,如果您有任何问题,请随时联系我。最后,我真诚地期待与您合作,为此做出贡献。
非常感谢@yunzhan2014对此项目的贡献。
我的Gmail:hongleizhang1993@gmail.com