surprise工具简介--矩阵分解

时间:2020-03-10
本文章向大家介绍surprise工具简介--矩阵分解,主要包括surprise工具简介--矩阵分解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Surprise(Simple Python Recommendation System Engine)是一款推荐系统库,是scikit系列中的一个。简单易用,同时支持多种推荐算法(基础算法、协同过滤、矩阵分解等)。

设计surprise时考虑到以下目的:
让用户完美控制他们的实验。为此,特别强调 文档,试图通过指出算法的每个细节尽可能清晰和准确。
减轻数据集处理的痛苦。用户可以使用内置数据集(Movielens, Jester)和他们自己的自定义 数据集。
提供各种即用型预测算法, 例如基线算法, 邻域方法,基于矩阵因子分解( SVD, PMF, SVD ++,NMF)等等。此外, 内置了各种相似性度量(余弦,MSD,皮尔逊......)。
可以轻松实现新的算法思路。
提供评估, 分析 和 比较 算法性能的工具。使用强大的CV迭代器(受scikit-learn优秀工具启发)以及 对一组参数的详尽搜索,可以非常轻松地运行交叉验证程序 。

基本算法

算法类名说明
random_pred.NormalPredictor根据训练集的分布特征随机给出一个预测值
baseline_only.BaselineOnly给定用户和Item,给出基于baseline的估计值
knns.KNNBasic最基础的协同过滤
knns.KNNWithMeans将每个用户评分的均值考虑在内的协同过滤实现
knns.KNNBaseline考虑基线评级的协同过滤
matrix_factorization.SVDSVD实现
matrix_factorization.SVDppSVD++,即LFM+SVD
matrix_factorization.NMF基于矩阵分解的协同过滤
slope_one.SlopeOne一个简单但精确的协同过滤算法
co_clustering.CoClustering基于协同聚类的协同过滤算法

其中基于近邻的方法(协同过滤)可以设定不同的度量准则

相似度度量标准度量标准说明
cosine计算所有用户(或物品)对之间的余弦相似度。
msd计算所有用户(或物品)对之间的均方差异相似度。
pearson计算所有用户(或物品)对之间的Pearson相关系数。
pearson_baseline计算所有用户(或物品)对之间的(缩小的)Pearson相关系数,使用基线进行居中而不是平均值。

支持不同的评估准则

评估准则准则说明
rmse计算RMSE(均方根误差)。
mae计算MAE(平均绝对误差)。
fcp计算FCP(协调对的分数)。

biasSVD算法

使用Surprise工具中的SVD
参数:

n_factors: k值,默认为100
n_epochs:迭代次数,默认为20
biased:是否使用biasSVD,默认为True
verbose:输出当前epoch,默认为False
reg_all:所有正则化项的统一参数,默认为0.02
reg_bu:bu的正则化参数,reg_bi:bi的正则化参数
reg_pu:pu的正则化参数,reg_qi:qi的正则化参数

funkSVD算法

使用Surprise工具中的SVD
参数:

n_factors: k值,默认为100
n_epochs:迭代次数,默认为20
biased:是否使用biasSVD,设置为False
verbose:输出当前epoch,默认为False
reg_all:所有正则化项的统一参数,默认为0.02
reg_bu:bu的正则化参数,reg_bi:bi的正则化参数
reg_pu:pu的正则化参数,reg_qi:qi的正则化参数

SVD++算法

使用Surprise工具中的SVDpp
参数:

n_factors: k值,默认为20
n_epochs:迭代次数,默认为20
verbose:输出当前epoch,默认为False
reg_all:所有正则化项的统一参数,默认为0.02
reg_bu:bu的正则化参数,reg_bi:bi的正则化参数
reg_pu:pu的正则化参数,reg_qi:qi的正则化参数
reg_yj:yj的正则化参数

利用surprise工具预测movielens简单数据集(SVD,biasSVD,SVD++)

from surprise import Dataset
from surprise import Reader
from surprise import BaselineOnly, KNNBasic, NormalPredictor
from surprise import accuracy
from surprise.model_selection import KFold, split
from surprise import SVD,SVDpp
#import pandas as pd

# 数据读取
reader = Reader(line_format='user item rating timestamp', sep=',', skip_lines=1)
data = Dataset.load_from_file('./ratings.csv', reader=reader)
#rain_set = data.build_full_trainset()
train_s,test_s = split.train_test_split(data, train_size=0.8)

algo1 = SVD()
algo2 = SVD(biased = False)
algo3 = SVDpp()

print('SVDbias结果')
algo1.fit(train_s)
pre = algo1.test(test_s)
accuracy.rmse(pre,verbose=True)
print('SVD结果')
algo2.fit(train_s)
pre = algo2.test(test_s)
accuracy.rmse(pre,verbose=True)
print('SVD++结果')
algo3.fit(train_s)
pre = algo3.test(test_s)
accuracy.rmse(pre,verbose=True)

示例代码:
链接:https://pan.baidu.com/s/1JY7d6xiFc8jgTQZpEQJ_Ng
提取码:q6x5

原文地址:https://www.cnblogs.com/MaggieForest/p/12457109.html