本文是用来记录学习surprise的过程。
本文内容:
- 自动交叉验证
- train-test split 和 fit() 方法
- 训练整个数据集和predict()方法
排个雷:evaluate()方法在1.0.5版本中已经弃用(功能上已由取代model_selection().cross_validate),并在1.1.0中删除(你要看一下你现在安装的版本)。
1.自动交叉验证
Surprise有一套内置的算法和数据集供您使用。在最简单的形式中,只需几行代码即可运行交叉验证程序:
import surprise
from surprise import SVD
from surprise import Dataset
# evaluate()方法在1.0.5版本中已经弃用(功能上已由取代model_selection().cross_validate),并在1.1.0中删除(你要看一下你现在安装的版本)。
from surprise.model_selection import cross_validate
# 首次运行需要下载
data = Dataset.load_builtin(name='ml-100k') # Movielens 数据集
# 假设使用SVD矩阵分解
algo = SVD()
#运行5倍交叉验证并打印结果
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)
代码运行结果:由于随机化,结果可能有差别。
Fold 1 Fold 2 Fold 3 Fold 4 Fold 5 Mean Std
RMSE (testset) 0.9332 0.9367 0.9360 0.9396 0.9363 0.9364 0.0020
MAE (testset) 0.7360 0.7372 0.7376 0.7394 0.7385 0.7378 0.0012
Fit time 6.48 6.84 8.08 6.43 6.50 6.87 0.63
Test time 0.23 0.26 0.25 0.23 0.21 0.24 0.02
这个load_builtin()方法将提供下载电影-100 k数据集(如果你尚未下载),则将其保存在.surprise_data文件夹在您的主目录中(您也可以选择保存它)。其他地方).
我们在这里用的是SVD算法,但许多其他算法是可用的。
这个cross_validate()函数根据cv参数,并计算accuracy措施。我们在这里使用的是经典的5倍交叉验证,但是可以使用更好的迭代器。
2.train-test split 和 fit() 方法
如果不希望运行完整的交叉验证过程,则可以使用train_test_split()若要示例具有给定大小的培训集和测试集,请使用accuracy metric你的选择。您需要使用fit()方法,该方法将在训练集上训练算法,以及test()方法,该方法将返回从测试集所作的预测:
from surprise import SVD
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import train_test_split
# 首次运行需要下载
data = Dataset.load_builtin('ml-100k') # Movielens 数据集
# 随机测试集和训练集
# 将25%的数据设置为测试集
trainset, testset = train_test_split(data, test_size=.25)
# 使用SVD矩阵分解
algo = SVD()
# 在训练集中训练算法,并在测试集中预测
algo.fit(trainset)
predictions = algo.test(testset)
'''
# 可以使用下面这行代码来训练和测试算法
predictions = algo.fit(trainset).test(testset)
'''
# 计算 RMSE
accuracy.rmse(predictions)
计算得到的结果是:
RMSE: 0.9425
可能每次运行得到的结果不太一样,前面已经讲过了。
3.训练整个数据集和predict()方法
我们可以简单的将算法与整个数据集相匹配,而不是运行交叉验证。可以用build_full_trainset()构建trainset对象方法实现:
from surprise import KNNBasic
from surprise import Dataset
# 首次运行需要下载
data = Dataset.load_builtin('ml-100k') # Movielens 数据集
# Retrieve the trainset.
# 训练集
trainset = data.build_full_trainset()
# 构建算法并训练
algo = KNNBasic()
algo.fit(trainset)
# 确保这两个在训练集中,并且真实值为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}
其中est是预测值
本文讲解的都是内置的数据集,也可以使用自己的数据集,将在下文讲解。