自动交叉验证:
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是字符串形式。
目前为止我们一直使用的是内置的数据集,当然你可以使用自己的数据集。下一部分我们会讲到这个用法。