Skip to content

Movielens

潜心 edited this page Sep 1, 2020 · 2 revisions

Movielens

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

ml-1m数据集中包含ratings.datusers.datmovies.dat

rating

标签列表为: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

user

标签列表为: 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

movies

标签列表为: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

  1. 通过pandas的read_csv方法进行读取,分隔符为::
  2. 在"Matrix Factorization Techniques for Recommender Systems"中,使用了带偏置的MF,因此通过groupby方法计算每个用户的平均打分;
    data_df['avg_score'] = data_df.groupby(by='UserId')['Rating'].transform('mean')
  3. 计算用户id、电影id的最大值,由于用户id从1开始,可以将其最大值+1;
    user_num, item_num = data_df['UserId'].max() + 1, data_df['MovieId'].max() + 1
  4. 训练集与测试集的划分,为了保证数据在时间上的真实性,我们选择每个用户时间戳后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()
  5. 与其他模型保持一致,我们在输入上分为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