在Python SciKit中基于用户和项目的基本数据过滤



我正在尝试根据用户的评分向用户实施推荐系统。我认为最常见的一个。我读了很多书,并入围了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_iditem_id对不在训练数据集中。这里像这个函数:

build_anti_testset

返回可以 在 test(( 方法中用作测试集。

评级是不在列车组中的所有评级,即所有 用户 u 已知,项目 i 已知,但 评级 rui 不在火车组中。由于 rui 未知,因此它要么 替换为填充值或假定等于所有值的平均值 收视率global_mean。

之后,您可以将这些对传递给test()predict()方法并收集评级,并从此数据中获取特定用户的前 N 个建议。

这里给出了一个例子:

  • https://blog.dominodatalab.com/recommender-systems-collaborative-filtering/

最新更新