MovieLens 数据集是由 GroupLens 项目组制作的公开数据集。MoveieLens数据集可以说是推荐系统领域最为经典的数据集之一,其地位类似计算机视觉领域里的MNIST数据集。
MovieLens 是一系列数据集的统称。根据创建时间、数据集大小等划分为若干个子数据集。例如:
每个数据集都可以在官网进行下载。
我们以 MovieLens 1M Dataset 为例进行分析。
首先,我们下载 MovieLens 1M Dataset 后得到压缩包 ml-1m.zip。对其进行接下后可以得到四个文件:
README 文件中描述了数据集的相关信息,有兴趣的同学可以自行查阅。我们主要关注另外三个文件的内容和格式。
ratings.dat 文件里面的内容包含了每一个用户对于每一部电影的评分。打开文件,我们可以看到以下内容 (我们仅展示一部分):
1::1193::5::978300760
1::661::3::978302109
1::914::3::978301968
1::3408::4::978300275
1::2355::5::978824291
1::1197::3::978302268
1::1287::5::978302039
1::2804::5::978300719
内容的描述格式为:UserID::MovieID::Rating::Timestamp
注意: 每个用户至少会对 20 部电影进行评级。
users.data 描述了用户的信息。我们展示文件的部分行。
1::F::1::10::48067
2::M::56::16::70072
3::M::25::15::55117
4::M::45::7::02460
5::M::25::20::55455
6::F::50::9::55117
7::M::35::1::06810
8::M::25::12::11413
内容的描述格式为:UserID::Gender::Age::Occupation::Zip-code
UserID 表示用户编号,范围从 1 到 6040
Gender 'M’代表男性,'F’代表女性
Age 表示用户年龄
Occupation 表示用户的职业
Zip-dode 表示用户所在地的邮政编码
movies.dat 文件中描述了电影的详细信息,我们展示部分内容。
1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
6::Heat (1995)::Action|Crime|Thriller
7::Sabrina (1995)::Comedy|Romance
8::Tom and Huck (1995)::Adventure|Children's
内容的描述格式为:MovieID::Title::Genres
我们使用 pandas 加载数据
import pandas as pd
def get_data(root_path):
# 读取数据--并重新定义列名
col_names = ['user_id','movie_id','rating','timestamp']
ratings = pd.read_csv(os.path.join(root_path, 'ratings.dat'), sep='::', engine='python', names=col_names)
# 打印出前几行数据
print(ratings[0:5])
"""
user_id movie_id rating timestamp
0 1 1193 5 978300760
1 1 661 3 978302109
2 1 914 3 978301968
3 1 3408 4 978300275
4 1 2355 5 978824291
"""
col_names = ["user_id", "gender", "age", "occupation", "zip_code"]
users = pd.read_csv(os.path.join(root_path, 'users.dat'), sep='::', engine='python', names=col_names)
print(users[:5])
"""
user_id gender age occupation zip_code
0 1 F 1 10 48067
1 2 M 56 16 70072
2 3 M 25 15 55117
3 4 M 45 7 02460
4 5 M 25 20 55455
"""
col_names = ["movie_id", "title", "genres"]
movies = pd.read_csv(os.path.join(root_path, 'movies.dat'), sep='::', engine='python', names=col_names)
print(movies[:5])
"""
movie_id title genres
0 1 Toy Story (1995) Animation|Children's|Comedy
1 2 Jumanji (1995) Adventure|Children's|Fantasy
2 3 Grumpier Old Men (1995) Comedy|Romance
3 4 Waiting to Exhale (1995) Comedy|Drama
4 5 Father of the Bride Part II (1995) Comedy
"""
return ratings, users, movies
if __name__ == "__main__":
root_path = './data/ml-1m/'
get_data(root_path)