实现了一系列常见的推荐算法,包含“切分训练集与测试集-训练模型-推荐-评估”一整套流程。
User Based Collaborative Filtering(基于User的协同过滤)
Item Based Collaborative Filtering(基于Item的协同过滤)
矩阵分解
基于内容的推荐算法 (进行中)
基于神经网络的协同过滤 Neural Collaborative Filtering (包括:GMF/ MLP/ Neural MF)(都基于pytorch写的)
Movielens 1M数据集ml-1m.zip
指标一:Precision、Recall、Coverage、Popularity
指标二:MSE、RMSE
指标三:HR、NDCGM
-
下载数据集
下载,并解压到项目Recommend-system文件夹下
-
运行代码
eg:
python item_cf.py
python user_cf.py
python GMF.py --batch_size 256 --lr 0.01 --n_emb 32 --epochs 30
电影推荐结果可能被注释掉了,如果需要此部分数据可自行修改代码。
UserCF算法中,由于用户数量多,生成的相似性矩阵也大,会占用比较多的内存。
ItemCF算法中,每次推荐都需要找出一个用户的所有电影,再为每一部电影找出最相似的电影,运算量比UserCF大,因此推荐的过程比较慢。
基本**:相似的用户可能喜欢相似的产品,根据其它用户看的电影+用户相似度,来预测和推荐产品。
核心:计算用户之间的相似度
相似度计算方法:简单法:
对用户a和b,N为数量:
Sim(a,b) = N(a和b共同看过的电影数量) / math.sqrt(N(a单独看过的电影数量) * N(b单独看过的电影数量))
皮尔森系数:
基本**:相似的产品可能有相似的评价,根据当前用户已评价过的产品+产品相似度,可预测和推荐产品。
核心:计算产品之间的相似度
相似度计算方法:对产品x和y,N为数量:
Sim(x,y) = N(产品x和y同时被一个人用过的次数) / math.sqrt(N(x单独被用过的次数)* N(y单独被用过的次数))
- 都是基于评分矩阵打分,即用户需要有打分如5分,7分,数据获取难。
- 用户打分准确度
- 矩阵稀疏严重
- 冷启动问题严重(新用户/产品的推荐)
不适用于大多真实场景,比如实际有大量用户与产品,难以找最近邻居。
- 隐式打分:点击、网页浏览、浏览时间、文件下载情况
用户冷启动问题:
- 激励用户主动评分选择倾向
- 基于用户个性
产品冷启动问题:
- 基于内容的方法
- 基于专家的方法
针对新闻类网站,可以采用UserCF。因为用户大都关注热门新闻,个性化要求不强,热门程度和实效性是推荐的重点;ItemCF需要维护一张物品相似度表,当物品更新速度较快时,表的维护成本太高。
针对电商、音乐、图书类网站,可以采用ItemCF。因为用户的兴趣喜好相对稳定,个性化要求较高,同时对实效性要求不高。
往往需要很大的算力,在线下预处理,在预测的时候可以直接基于模型预测。
常见的有:
- 基于矩阵分解MF的方法:SVD、PCA。也有一些经典变形:如PMF/SVD++/NMF/FunkSVD/BiasSVD/timeSVD/ConvMF
- 基于关联规则挖掘的方法
- 基于概率的方法:贝叶斯网络。思路是给定打分矩阵,根据如贝叶斯理论,算出可能喜欢的概率。也有复杂的模型如聚类模型、pLSA主题模型等。
- 基于机器学习的方法
- 基于深度学习的方法
NeuralCF模型实际上提出了一个模型框架,它基于用户向量和物品向量这两个Embedding层,利用不同的互操作层进行特征的交叉组合,并且可以灵活地进行不同互操作层的拼接。从这里可以看出深度学习构建推荐模型的优势----利用神经网络理论上能够拟合任意函数的能力,灵活地组合不同的特征,按需增加或减少模型的复杂度。
NeuralCF模型也存在局限性。由于是基于协同过滤的**进行改造的,所以NeuralCF模型并没有引入更多其他类型的特征,这在实际应用中无疑浪费了其他有价值的信息。此外,对于模型中互操作的种类并没有做进一步的探究和说明。这都需要后来者进行更深入的探索。
原理详细可见论文解析 https://zhuanlan.zhihu.com/p/131274333
###代码说明:
代码参考了原论文作者的代码实现,库地址
models目录中包含性能最佳的GMF和MLP模型。
data_proc.py 包含了如何为实验准备数据。
对于Linux系统,可以采用shell命令快速进行,如:
source activate pytorch
python GMF.py --batch_size 256 --lr 0.01 --n_emb 8 --epochs 30
python GMF.py --batch_size 256 --lr 0.001 --n_emb 8 --epochs 30
python GMF.py --batch_size 512 --lr 0.01 --n_emb 8 --epochs 30
python GMF.py --batch_size 512 --lr 0.001 --n_emb 8 --epochs 30
python GMF.py --batch_size 1024 --lr 0.01 --n_emb 8 --epochs 30
python GMF.py --batch_size 1024 --lr 0.001 --n_emb 8 --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 256 --lr 0.001 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 512 --lr 0.01 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 512 --lr 0.001 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 1024 --lr 0.01 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 1024 --lr 0.001 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[64, 32, 16]" --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[128, 64, 32]" --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[256, 128, 64]" --epochs 30
python NeuralMF.py --batch_size 1024 --lr 0.001 --n_emb 32 --layers "[128, 64, 32]" --mf_pretrain "pytorch_GMF_bs_256_lr_0001_n_emb_32.pt" --mlp_pretrain "pytorch_MLP_bs_256_reg_00_lr_001_n_emb_64_ll_32_dp_wodp.pt" --learner "SGD" --epochs 10
python NeuralMF.py --batch_size 1024 --lr 0.001 --n_emb 32 --layers "[128, 64, 32]" --mf_pretrain "pytorch_GMF_bs_256_lr_0001_n_emb_32.pt" --mlp_pretrain "pytorch_MLP_bs_256_reg_00_lr_001_n_emb_64_ll_32_dp_wodp.pt" --freeze 1 --learner "SGD" --epochs 10
相关课件
https://github.com/Lockvictor/MovieLens-RecSys
https://www.cnblogs.com/lzllovesyl/p/5243370.html
https://blog.csdn.net/zhongkejingwang/article/details/43053513
https://blog.csdn.net/zhongkejingwang/article/details/43083603
基于神经网络的协同推荐上更多pytorch外的实现或参数比较:https://github.com/jrzaurin/neural_cf