我正在尝试根据用户的评分向用户实施推荐系统。我认为最常见的一个。我读了很多书,并入围了Surprise,一个基于python-scikit的推荐系统。
虽然我能够导入数据并运行预测,但它并不完全符合我想要的。
现在我拥有的是:我可以通过user_id,item_id和评级,并获得该用户给出我通过的评级的概率。
我真正想做的是:传递一个user_id,作为回报,根据数据获得该用户可能喜欢/高度评价的项目列表。
from surprise import Reader, Dataset
from surprise import SVD, evaluate
# Define the format
reader = Reader(line_format='user item rating timestamp', sep='t')
# Load the data from the file using the reader format
data = Dataset.load_from_file('./data/ecomm/e.data', reader=reader)
# Split data into 5 folds
data.split(n_folds=5)
algo = SVD()
# Retrieve the trainset.
trainset = data.build_full_trainset()
algo.fit(trainset)
//Inputs are: user_id, item_id & rating.
print algo.predict(3, 107, 1)
数据文件中的采样线。
第一列是user_id,第二列是项目 ID,第三列是评级,然后是时间戳。
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
115 265 2 881171488
253 465 5 891628467
305 451 3 886324817
6 86 3 883603013
您需要循环访问单个user_id
的所有可能的item_id
值并预测其评级。然后,收集评分最高的项目以推荐给该用户。
但请确保user_id
、item_id
对不在训练数据集中。这里像这个函数:
build_anti_testset
返回可以 在 test(( 方法中用作测试集。
评级是不在列车组中的所有评级,即所有 用户 u 已知,项目 i 已知,但 评级 rui 不在火车组中。由于 rui 未知,因此它要么 替换为填充值或假定等于所有值的平均值 收视率global_mean。
之后,您可以将这些对传递给test()
或predict()
方法并收集评级,并从此数据中获取特定用户的前 N 个建议。
这里给出了一个例子:
- https://blog.dominodatalab.com/recommender-systems-collaborative-filtering/