Surprise:一个Python推荐系统算法库(开源)
用于构建和分析推荐系统的Python scikit
一、基本模块
1. 推荐算法分类
可分为基于用户行为的推荐算法和基于内容(物品属性)的推荐算法。
基于用户行为数据的推荐算法一般称为协同过滤算法,主要方法有基于邻域的方法(neighborhood-based)、隐语义模型(latent factor model,LFM)、基于图的随机游走算法(random walk on graph)等。
在业界得到最广泛应用的算法是基于邻域的方法,主要包含下面两种算法:基于用户的协同过滤算法 UserCF,给用户推荐和他兴趣相似的其他用户喜欢的物品;基于物品的协同过滤算法 ItemCF,给用户推荐和他之前喜欢的物品相似的物品。
2. 基于邻域的CF算法的可设定度量准则,surprise.similarities 模块
余弦相似度 cosine、均方差相似度 msd、皮尔逊相关系数 pearson、基线皮尔逊相关系数 pearson_baseline。
3. 评价指标模块,surprise.accuracy
均方根误差 rmse、平均绝对误差 mae、fcp。
4. 数据集 surprise.dataset 模块
包含了 movielens-100k、movielens-1m、Jester 数据集。还可读取 pandas.DataFrame 格式及其他文件格式的数据集。
5. surprise.model_selection 模块
提供了用于交叉验证所需要的数据集切分、自动CV、网格搜索 GridSearchCV 等。
二、实现推荐算法
1. surprise.prediction_algorithms.algo_base
该模块定义了 类AlgoBase,每个单独的预测算法都继承自该类。
2. surprise.prediction_algorithms.predictions,定义了预测结果类。
3. Basic algorithms 基本算法
(1)prediction_algorithms.random_pred.NormalPredictor
从训练集估计得到一个正态分布(均值和标准差),基于该正态分布进行随机预测。
(2)prediction_algorithms.baseline_only.BaselineOnly
4. k-NN inspired algorithms kNN算法
(1)prediction_algorithms.knns.KNNBasic,即基本的协同过滤算法。
k,kNN 算法中的 k 参数;
min_k,需考虑的最小邻居数,当邻居数不足时,使用全局平均进行预测;
sim_options,该参数接收一个 dict,如
sim_options = {'name': 'cosine',
'user_based': False # compute similarities between items}
(2)prediction_algorithms.knns.KNNWithMeans,考虑了每个用户的平均打分值。
(3)prediction_algorithms.knns.KNNWithZScore,考虑了每个用户的 z-score 标准化。
(4)prediction_algorithms.knns.KNNBaseline,包含可学习参数,可使用 SGD 和 ALS 算法进行参数估计。推荐使用 pearson_baseline 度量方式。
bsl_options,接收一个 dict,说明配置信息。
bsl_options = {'method': 'sgd', 'learning_rate': .00005 }
5. Matrix Factorization-based algorithms
SVD、RSVD、ASVD、SVD++详解
(1)prediction_algorithms.matrix_factorization.SVD
(2)prediction_algorithms.matrix_factorization.SVDpp
引入隐式反馈,可以是打分动作(谁对某个商品打过分),或者是浏览记录等,隐式回馈的原因比较复杂,专门用一部分参数空间去建模,每个 item 对应一个向量 yi ,通过 user 隐含回馈过的 item 的集合来刻画用户的偏好。
(3)prediction_algorithms.matrix_factorization.NMF
NMF 非负矩阵分解,与 SVD 算法类似,用户和物品因子都必须是正值。
6. prediction_algorithms.slope_one.SlopeOne
通过计算物品之间的平均差异来进行预测。
7. prediction_algorithms.co_clustering.CoClustering