Surprise推荐系统库入门指南
概述
Surprise是一个专注于推荐系统的Python库,全称为Simple Python Recommendation System Engine。它提供了多种经典的推荐算法实现,特别适合用于评分预测任务。本文将详细介绍如何使用Surprise进行推荐系统开发。
基础用法
自动交叉验证
Surprise内置了多种推荐算法和数据集,只需几行代码即可完成交叉验证:
from surprise import SVD
from surprise import Dataset
from surprise.model_selection import cross_validate
# 加载内置数据集
data = Dataset.load_builtin('ml-100k')
# 使用SVD算法
algo = SVD()
# 5折交叉验证
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)
执行结果将显示每折的RMSE(均方根误差)和MAE(平均绝对误差)等指标,以及它们的均值和标准差。
训练集-测试集划分
如果不想使用交叉验证,可以采用简单的训练测试集划分:
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(data, test_size=0.25)
# 训练并测试
algo = SVD()
algo.fit(trainset)
predictions = algo.test(testset)
# 计算RMSE
accuracy.rmse(predictions)
完整训练集训练与预测
也可以在整个数据集上训练模型,然后进行预测:
from surprise import SVD
from surprise import Dataset
# 加载数据并构建完整训练集
data = Dataset.load_builtin('ml-100k')
trainset = data.build_full_trainset()
# 训练模型
algo = SVD()
algo.fit(trainset)
# 预测用户196对物品302的评分(已知实际评分为4)
uid = '196'
iid = '302'
pred = algo.predict(uid, iid, r_ui=4, verbose=True)
使用自定义数据集
从文件加载
Surprise支持从CSV等文件加载自定义数据集:
from surprise import Dataset
from surprise import Reader
# 定义文件格式
reader = Reader(line_format='user item rating timestamp', sep='\t')
# 加载数据
data = Dataset.load_from_file('path/to/your/file', reader=reader)
从DataFrame加载
也可以直接从Pandas DataFrame加载数据:
import pandas as pd
from surprise import Dataset
from surprise import Reader
# 创建示例DataFrame
ratings_dict = {
'itemID': [1, 1, 1, 2, 2],
'rating': [3, 2, 4, 3, 1],
'userID': [9, 32, 2, 45, 'user_foo']
}
df = pd.DataFrame(ratings_dict)
# 定义评分范围
reader = Reader(rating_scale=(1, 5))
# 加载数据
data = Dataset.load_from_df(df[['userID', 'itemID', 'rating']], reader)
交叉验证迭代器
Surprise提供了多种交叉验证策略:
from surprise import SVD
from surprise import Dataset
from surprise.model_selection import KFold
# 加载数据
data = Dataset.load_builtin('ml-100k')
# 定义3折交叉验证
kf = KFold(n_splits=3)
algo = SVD()
for trainset, testset in kf.split(data):
algo.fit(trainset)
predictions = algo.test(testset)
accuracy.rmse(predictions, verbose=True)
参数调优
使用GridSearchCV进行参数调优:
from surprise import SVD
from surprise import Dataset
from surprise.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'n_epochs': [5, 10],
'lr_all': [0.002, 0.005],
'reg_all': [0.4, 0.6]
}
# 网格搜索
gs = GridSearchCV(SVD, param_grid, measures=['rmse', 'mae'], cv=3)
data = Dataset.load_builtin('ml-100k')
gs.fit(data)
# 输出最佳参数
print(gs.best_score['rmse'])
print(gs.best_params['rmse'])
# 使用最佳参数
algo = gs.best_estimator['rmse']
对于复杂参数(如bsl_options和sim_options),可以这样定义:
param_grid = {
'k': [10, 20],
'sim_options': {
'name': ['msd', 'cosine'],
'min_support': [1, 5],
'user_based': [False]
}
}
总结
Surprise是一个功能强大但易于使用的推荐系统库,本文介绍了它的基本用法,包括:
- 内置数据集的使用
- 交叉验证的实现
- 自定义数据集的加载
- 多种交叉验证策略
- 参数调优方法
通过这些功能,开发者可以快速构建和评估推荐系统模型。Surprise的API设计借鉴了scikit-learn,因此对于熟悉scikit-learn的用户来说会非常容易上手。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考