推荐算法 Surprise(一)

本文介绍了Surprise推荐系统中的自动交叉验证功能,展示了如何使用内置的SVD算法进行交叉验证和评估。此外,还讲解了如何进行train-test split,使用fit()方法训练模型,并使用predict()方法进行预测。内容包括使用内置数据集movielens-100k,以及如何处理给定的训练集和测试集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动交叉验证:

Surprise有很多内置算法和数据集供你使用。最简单的,我们可以只用几行代码运行交叉验证程序。

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import cross_validate

date = Dataset.load_builtin('ml-100k')

algo = SVD()

cross_validate(algo,date,measures=['RMSE', 'MAE'],cv=5,verbose=True)

运行结果如下

Dataset ml-100k could not be found. Do you want to download it? [Y/n] y
Trying to download dataset from http://files.grouplens.org/datasets/movielens/ml-100k.zip...
Done! Dataset ml-100k has been saved to C:\Users\60191/.surprise_data/ml-100k
Evaluating RMSE, MAE of algorithm SVD on 5 split(s).

                  Fold 1  Fold 2  Fold 3  Fold 4  Fold 5  Mean    Std     
RMSE (testset)    0.9422  0.9361  0.9327  0.9296  0.9396  0.9360  0.0045  
MAE (testset)     0.7423  0.7390  0.7351  0.7324  0.7399  0.7377  0.0035  
Fit time          4.42    4.70    4.53    4.68    4.55    4.58    0.10    
Test time         0.14    0.14    0.11    0.15    0.14    0.13    0.01    

load_builtin()将下载movielens-100k数据集(尚未下载),并将其保存.surprise_data在主目录中的文件夹中(也可以将其保存在其他地方)。

我们使用著名的 SVD 算法,但还有许多其他算法可用。参考这里

cross_validate() 函数根据cv参数运行交叉验证程序,并计算一些accuracy进行评估。我们使用经典的5倍交叉验证,也可以使用优秀的迭代器(看这里)。

Train-test split 和 fit() 方法:

你如果不想使用交叉验证方法,也可以用 train_test_split() 来得到指定大小的测试集和训练集,并且可自己选择测量精度的方法 accuracy metric 。训练时使用 fit() 在训练集训练,测试时用 test(),它将会返回测试集上的预测结果。

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import train_test_split
from surprise import accuracy

data = Dataset.load_builtin('ml-100k')

trainset, testset = train_test_split(date,test_size=.25) #随机选取25%作为测试集

algo = SVD()

algo.fit(trainset)
predictions = algo.test(testset)

accuracy.rmse(predictions)

结果:

RMSE: 0.9392

你也可以用一行代码来进行测试和训练:

predictions = algo.fit(trainset).test(testset)

有时候,训练集和测试集是给定的,查阅这里来处理此类情况。

在整个训练集上训练和predict () 方法

显然,我们可以简单地将我们的算法作用于整个数据集,而不进行交叉验证。这可以通过使用build_full_trainset() 建立 trainset 对象来完成 :

from surprise import KNNBasic
from surprise import Dataset
from surprise.model_selection import train_test_split
from surprise import accuracy

data = Dataset.load_builtin('ml-100k')

trainset = data.build_full_trainset()

algo = KNNBasic()
algo.fit(trainset)

那么现在就可以通过 predict() 来预测评分。假设你对用户id=192和电影id=302(确定它们在训练集中)感兴趣,并且你也知道实际评分r_ui=4:

uid = str(196)
iid = str(302)

pred = algo.predict(uid,iid,r_ui=4,verbose=True)

结果是:

user: 196        item: 302        r_ui = 4.00   est = 4.06   {'actual_k': 40, 'was_impossible': False}

注意:predict() 使用的是原始id(阅读这里了解原始id与内部id)由于数据集是由文件中读取出来的,因此原始id是字符串形式。

目前为止我们一直使用的是内置的数据集,当然你可以使用自己的数据集。下一部分我们会讲到这个用法。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值