-
Notifications
You must be signed in to change notification settings - Fork 494
Movielens
潜心 edited this page Sep 1, 2020
·
2 revisions
MovieLens 是一个推荐系统和虚拟社区网站,于1997年建立。其主要功能为应用协同过滤技术和用户对电影的喜好,向用户推荐电影。该网站是GroupLens研究所旗下一个项目,该研究所隶属于美国明尼苏达大学双城分校计算机科学与工程系。 --- 维基百科
MovieLens电影数据集是历史最悠久的推荐系统数据集,目前主要分为:ml-100k(1998年)、ml-1m(2003年)、ml-10m(2009年)、ml-20m(2015年)、ml-25m(2019年)。本实验中主要使用ml-1m数据集。
Movielens数据集是典型的显示反馈数据集,即标签为1-5的评分,具体的描绘了用户对电影的喜好。但在部分论文中,可以将其处理成隐式反馈(例如将高于3分的认为是感兴趣的“1”,否则不感兴趣“0”)。
- 已处理过的隐式反馈数据集:ml-1m
ml-1m数据集中包含ratings.dat
、users.dat
、movies.dat
。
标签列表为:UserID::MovieID::Rating::Timestamp
- UserIDs:用户ID(1~6040)
- MovieIDs:电影ID(1~3952)
- Ratings:评分(1~5)
- Timestamp:时间戳
每个用户至少有20个评分记录(经过筛选)
UserId MovieId 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
标签列表为: UserID::Gender::Age::Occupation::Zip-code
- Gender:性别, "M"代表男, "F"代表女;
- Age:年龄,分为多个区间:1,18, 25, 35, 45, 50;
- Occupation:职业,0~20;
UserId 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
标签列表为:MovieID::Title::Genres
- Titles:电影名称;
- Genres:电影分类
MovieID 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
数据预处理主要是按照不同的任务(显示或隐式)、模型(基于协同过滤或基于特征的模型)来进行不同的处理方案。
协同过滤是基于用户行为设计的推荐算法,矩阵分解就是其中之一。所以我们只需利用数据集中的ratings.dat
文件。以下是Recommender System with TF2.0
中MF模型的数据处理方法utils
。
- 通过pandas的
read_csv
方法进行读取,分隔符为::
; - 在"Matrix Factorization Techniques for Recommender Systems"中,使用了带偏置的MF,因此通过
groupby
方法计算每个用户的平均打分;data_df['avg_score'] = data_df.groupby(by='UserId')['Rating'].transform('mean')
- 计算用户id、电影id的最大值,由于用户id从1开始,可以将其最大值+1;
user_num, item_num = data_df['UserId'].max() + 1, data_df['MovieId'].max() + 1
- 训练集与测试集的划分,为了保证数据在时间上的真实性,我们选择每个用户时间戳后20%的样本作为测试集,验证集也可以以相同的方式进行划分;
# split train dataset and test dataset watch_count = data_df.groupby(by='UserId')['MovieId'].agg('count') test_df = pd.concat([ data_df[data_df.UserId == i].iloc[int(0.8 * watch_count[i]):] for i in tqdm(watch_count.index)], axis=0) test_df = test_df.reset_index()
- 与其他模型保持一致,我们在输入上分为
dense_feature
:用户平均打分,和sparse_feature
:用户id和电影id;feature_columns = [[denseFeature('avg_score')], [sparseFeature('user_id', user_num, latent_dim), sparseFeature('item_id', item_num, latent_dim)]]
具体内容见:utils