import pandas as pd import numpy as np import gc import os from pathlib import Path p = Path(__file__).parents[1] ROOT_DIR=os.path.abspath(os.path.join(p, '..', 'data/raw/')) def convert(data, num_users, num_movies): ''' Making a User-Movie-Matrix''' new_data=[] for id_user in range(1, num_users+1): id_movie=data[:,1][data[:,0]==id_user] id_rating=data[:,2][data[:,0]==id_user] ratings=np.zeros(num_movies, dtype=np.uint32) ratings[id_movie-1]=id_rating if sum(ratings)==0: continue new_data.append(ratings) del id_movie del id_rating del ratings return new_data def get_dataset_1M(): ''' For each train.dat and test.dat making a User-Movie-Matrix''' gc.enable() training_set=pd.read_csv(ROOT_DIR+'/ml-1m/train.dat', sep='::', header=None, engine='python', encoding='latin-1') training_set=np.array(training_set, dtype=np.uint32) test_set=pd.read_csv(ROOT_DIR+'/ml-1m/test.dat', sep='::', header=None, engine='python', encoding='latin-1') test_set=np.array(test_set, dtype=np.uint32) num_users=int(max(max(training_set[:,0]), max(test_set[:,0]))) num_movies=int(max(max(training_set[:,1]), max(test_set[:,1]))) training_set=convert(training_set,num_users, num_movies) test_set=convert(test_set,num_users, num_movies) return training_set, test_set def _get_dataset(): return get_dataset_1M()
该代码实现了一个函数get_dataset_1M()
,它用于读取一个基于MovieLens 1M数据集的训练集和测试集,并将它们转换为用户-电影评分矩阵。具体来说,代码执行以下操作:
- 读取基于MovieLens 1M数据集的训练集和测试集,其路径为
ROOT_DIR+'/ml-1m/train.dat'
和ROOT_DIR+'/ml-1m/test.dat'
。 - 将训练集和测试集分别存储为numpy数组类型,使用数据类型
np.uint32
。 - 计算用户和电影的数量,通过查找最大的用户ID和电影ID来实现。
- 使用
convert()
函数将训练集和测试集转换为用户-电影评分矩阵,其中convert()
函数实现了 - 以下操作:
- 循环遍历每个用户,对于每个用户,提取其对电影的评分。
- 创建一个与所有电影数量相同的评分数组,将相应的评分放置在数组的正确位置。
- 如果该用户没有评分电影,则跳过该用户。
- 返回所有用户的评分数组列表。
- 返回训练集和测试集的用户-电影评分矩阵。
另外,还定义了一个函数_get_dataset()
,其作用是返回get_dataset_1M()
函数的结果。
代码中的gc.enable()
是Python中的垃圾回收机制,可以在代码运行时自动释放内存。p = Path(__file__).parents[1]
获取当前脚本的上一级目录,然后使用该路径来构造ROOT_DIR
,该变量是用来存储MovieLens 1M数据集的路径。
函数convert()
实现了将训练集和测试集转换为用户-电影评分矩阵的过程。具体来说,该函数先循环遍历所有的用户,对于每个用户,提取其对电影的评分。然后,创建一个与所有电影数量相同的评分数组,将相应的评分放置在数组的正确位置。如果该用户没有评分电影,则跳过该用户。最后,将所有用户的评分数组列表返回。
函数_get_dataset()
返回get_dataset_1M()
函数的结果,这意味着它将返回MovieLens 1M数据集的用户-电影评分矩阵。
get_dataset_1M()
函数实现了从文件中读取MovieLens 1M数据集,将其转换为用户-电影评分矩阵,并返回训练集和测试集。具体来说,该函数使用pandas
库中的read_csv
函数读取训练集和测试集文件,并将其存储在名为training_set
和test_set
的DataFrame
中。然后,这两个数据集被转换为numpy
数组,以便进行进一步处理。
在获取训练集和测试集后,该函数确定用户和电影的数量,以便在后续处理中创建适当大小的评分矩阵。使用convert()
函数将训练集和测试集转换为用户-电影评分矩阵。最后,训练集和测试集被返回,以便可以使用它们进行模型训练和测试。
该代码提供了构建输入管道、读取和处理MovieLens 1M数据集的功能,这是推荐系统模型开发中非常重要的基础步骤。