surprise推荐系统工具
surprise推荐系统工具下有很多推荐算法:
本文主要讲一下Baseline算法和SlopeOne
Baseline算法
论文地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.476.4158&rep=rep1&type=pdf
Baseline算法是一种基于统计基准分数进行预测的算法。
bui为预测值;
u为均值;
bu为用户偏好;
bi为商品差异。
结合原文进行解释。1.我们知道所有电影的平均评分为3.7,即u=3.7;
2.然而泰坦尼克号电影是部好电影,评分要好于平均电影的评分,大约高了0.5,即bi=0.5;
3.然而Joe是个吝啬的人,他打分比较低,一般比平均低0.3,即bu = -0.3
最后预测Joe对泰坦尼克号的打分为3.7+0.5-0.3 = 3.9
目标函数为:
如何求目标函数呢?变量有bu和bi两个。可以用ALS或者SGD作为优化方法。
使用ALS进行优化
Step1,固定bu,优化bi
Step2,固定bi,优化bu
ALS、SGD优化方法:
推荐算法-矩阵分解(Matrix Factorization,MF)
Slope One算法
论文地址:https://arxiv.org/pdf/cs/0702144.pdf
Slope One算法是一种基于item-base的协同过滤算法。
论文指出当对userb-itemj评分进行预测时,查看itemi-itemj之间的差异。即userb-itemj = 2+(1.5-1)=2.5 .表示从usera看itemj比itemi要高0.5,同理,对于userb,itemj也比itemi要高0.5。
SlopeOne算法:
Step1,计算Item之间的评分差的均值,记为评分偏差(两个item都评分过的用户):
Step2,根据Item间的评分偏差和用户的历史评分,预测用户对未评分的item的评分:
Step3,将预测评分排序,取topN对应的item推荐给用户
Baseline算法、Slope One算法用到movieLens数据集
#数据集来源:https://www.kaggle.com/jneupane12/movielens/download
#baseline论文:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.476.4158&rep=rep1&type=pdf
#surprise文档:https://surprise.readthedocs.io/en/stable/
from surprise import Dataset
from surprise import Reader
from surprise import BaselineOnly
from surprise import accuracy
from surprise.model_selection import KFold
#数据读取
reader = Reader(line_format='user item rating timestamp',sep = ',',skip_lines=1)
data = Dataset.load_from_file('./ratings.csv',reader = reader)
train_set = data.build_full_trainset()
#ALS优化,优化方式可以选其他的('SGD')
#设置user、item的正则化项
bsl_options = {'method':'als','n_epochs':5,'reg_u':12,'reg_i':5}
model = BaselineOnly(bsl_options=bsl_options)
#k折交叉验证
kf = KFold(n_splits=5)
for trainset,testset in kf.split(data):
model.fit(trainset)
pred = model.test(testset)
#计算RMSE
accuracy.rmse(pred)
uid= str(300)
iid = str(180)
#输出uid对iid 的预测结果
pred = model.predict(uid,iid,r_ui=4,verbose=True)
输出结果如下:
Estimating biases using als...
RMSE: 0.8586
Estimating biases using als...
RMSE: 0.8632
Estimating biases using als...
RMSE: 0.8626
Estimating biases using als...
RMSE: 0.8641
Estimating biases using als...
RMSE: 0.8616
user: 300 item: 180 r_ui = 4.00 est = 3.58 {'was_impossible': False}
#SlopeOne论文:https://arxiv.org/pdf/cs/0702144.pdf
from surprise import Dataset
from surprise import Reader
from surprise.model_selection import KFold
from surprise import SlopeOne
from surprise import accuracy
reader = Reader(line_format= 'user item rating timestamp',sep = ',',skip_lines=1)
data = Dataset.load_from_file('./ratings.csv',reader = reader)
trainset = data.build_full_trainset()
#使用SlopeOne算法
algo = SlopeOne()
algo.fit(trainset)
#对指定用户和商品进行评分预测
uid =str(200)
iid = str(100)
pred = algo.predict(uid,iid,r_ui=4,verbose=True)
输出结果如下:
user: 200 item: 100 r_ui = 4.00 est = 3.41 {'was_impossible': False}
代码地址:推荐系统 surprise工具