电影数据集
電影數(shù)據(jù)集
The MovieLens Dataset
有許多數(shù)據(jù)集可用于推薦研究。其中,MovieLens數(shù)據(jù)集可能是最受歡迎的數(shù)據(jù)集之一。MovieLens是一個(gè)基于web的非商業(yè)電影推薦系統(tǒng)。創(chuàng)建于1997年,由明尼蘇達(dá)大學(xué)的一個(gè)研究實(shí)驗(yàn)室GroupLens管理,目的是為了研究目的收集電影分級(jí)數(shù)據(jù)。MovieLens的數(shù)據(jù)對(duì)于包括個(gè)性化推薦和社會(huì)心理學(xué)在內(nèi)的一些研究都是至關(guān)重要的。
- Getting the Data
MovieLens數(shù)據(jù)集由GroupLens網(wǎng)站托管。有幾個(gè)版本可用。將使用MovieLens 100K數(shù)據(jù)集。此數(shù)據(jù)集包括10萬收視率,從1星到5星,從1682部電影的943名用戶。已經(jīng)被清理,這樣每個(gè)用戶至少有20部電影。一些簡(jiǎn)單的人口統(tǒng)計(jì)信息,如年齡、性別、用戶的類型和項(xiàng)目也可用。可以下載ml-100k.zip并提取u.data文件,其中包含所有10萬csv格式的評(píng)分。文件夾中還有許多其文件,每個(gè)文件的詳細(xì)說明可以在數(shù)據(jù)集的自述文件中找到。首先,讓導(dǎo)入運(yùn)行本節(jié)實(shí)驗(yàn)所需的包。
from d2l import mxnet as d2l
from mxnet import gluon, np
import os
import pandas as pd
然后,下載MovieLens
 100k數(shù)據(jù)集并將交互作為DataFrame加載。
#@save
d2l.DATA_HUB[‘ml-100k’] = (
'http://files.grouplens.org/datasets/movielens/ml-100k.zip','cd4dcac4241c8a4ad7badc7ca635da8a69dddb83')
#@save
def read_data_ml100k():
data_dir = d2l.download_extract('ml-100k')names = ['user_id', 'item_id', 'rating', 'timestamp']data = pd.read_csv(os.path.join(data_dir, 'u.data'), '\t', names=names,engine='python')num_users = data.user_id.unique().shape[0]num_items = data.item_id.unique().shape[0]
return data, num_users, num_items
- Statistics
 of the Dataset
讓裝載數(shù)據(jù)并手動(dòng)檢查前五個(gè)記錄。這是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)并驗(yàn)證是否已正確加載的有效方法。
data, num_users, num_items = read_data_ml100k()
sparsity = 1 - len(data) / (num_users * num_items)
print(‘number of users: %d, number of
 items: %d.’ % (num_users, num_items))
print(‘matrix sparsity: %f’ % sparsity)
print(data.head(5))
number of users: 943, number of items: 1682.
matrix sparsity: 0.936953
user_id item_id rating timestamp
0 196 242 3 881250949
1 186 302 3 891717742
2 22 377 1 878887116
3 244 51 2 880606923
4 166 346 1 886397596
可以看到,每行由四列組成,包括“userid”1-943、“item
 id”1-1682、“rating”1-5和“timestamp”。可以構(gòu)造一個(gè)尺寸的相互作用矩陣牛×米牛×米,其中nn和米米分別是用戶數(shù)和項(xiàng)目數(shù)。這個(gè)數(shù)據(jù)集只記錄現(xiàn)有的評(píng)級(jí),所以也可以稱之為評(píng)級(jí)矩陣,如果這個(gè)矩陣的值代表確切的評(píng)級(jí),將互換使用交互矩陣和評(píng)級(jí)矩陣。評(píng)級(jí)矩陣中的大多數(shù)值是未知的,因?yàn)橛脩魶]有對(duì)大多數(shù)電影進(jìn)行評(píng)級(jí)。還展示了這個(gè)數(shù)據(jù)集的稀疏性。稀疏性定義為The sparsity is defined
 as 1 - number of nonzero entries / ( number of users * number of items).。顯然,相互作用矩陣非常稀疏(即稀疏度=93.695%)。現(xiàn)實(shí)世界中的數(shù)據(jù)集可能會(huì)受到更大程度的稀疏性的影響,并且一直是構(gòu)建推薦系統(tǒng)的長(zhǎng)期挑戰(zhàn)。一個(gè)可行的解決方案是使用附加的附加信息,例如用戶/項(xiàng)目特性來緩解稀疏性。然后,繪制不同評(píng)級(jí)的計(jì)數(shù)分布圖。正如預(yù)期的那樣,這似乎是一個(gè)正態(tài)分布,大多數(shù)評(píng)級(jí)集中在3-4。
d2l.plt.hist(data[‘rating’], bins=5, ec=‘black’)
d2l.plt.xlabel(‘Rating’)
d2l.plt.ylabel(‘Count’)
d2l.plt.title(‘Distribution of Ratings in MovieLens 100K’)
d2l.plt.show()
 
 3. Splitting the dataset
將數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集。以下函數(shù)提供兩種分割模式,包括隨機(jī)和序列感知。在隨機(jī)模式下,該函數(shù)在不考慮時(shí)間戳的情況下隨機(jī)分割100k個(gè)交互,默認(rèn)使用90%的數(shù)據(jù)作為訓(xùn)練樣本,其余10%作為測(cè)試樣本。在seq-aware模式中,將用戶最近評(píng)估的項(xiàng)目和用戶的歷史交互作為訓(xùn)練集。用戶歷史交互根據(jù)時(shí)間戳從最舊到最新排序。此模式將在序列感知推薦部分中使用。
#@save
def split_data_ml100k(data, num_users, num_items,
                  split_mode='random', test_ratio=0.1):"""Split the dataset in random mode or seq-aware
mode."""
if split_mode == 'seq-aware':train_items, test_items, train_list = {}, {}, []for line in data.itertuples():u, i, rating, time = line[1], line[2], line[3], line[4]train_items.setdefault(u, []).append((u, i, rating, time))if u not in test_items or test_items[u][-1] < time:test_items[u] = (i, rating, time)for u in range(1, num_users + 1):train_list.extend(sorted(train_items[u], key=lambda k: k[3]))test_data = [(key, *value) for key, value in test_items.items()]train_data = [item for item in train_list if item not in test_data]train_data = pd.DataFrame(train_data)test_data = pd.DataFrame(test_data)else:mask = [True if x == 1 else False for x in np.random.uniform(0, 1, (len(data))) < 1 - test_ratio]neg_mask = [not x for x in mask]train_data, test_data = data[mask], data[neg_mask]return train_data, test_data
請(qǐng)注意,除了測(cè)試集之外,在實(shí)踐中使用驗(yàn)證集是一個(gè)很好的實(shí)踐。然而,為了簡(jiǎn)潔起見,省略了這一點(diǎn)。在這種情況下,測(cè)試集可以被視為保留驗(yàn)證集。
- Loading the data
數(shù)據(jù)集拆分后,為了方便起見,將訓(xùn)練集和測(cè)試集轉(zhuǎn)換成列表和字典/矩陣。以下函數(shù)逐行讀取數(shù)據(jù)幀并從零開始枚舉用戶/項(xiàng)的索引。然后,該函數(shù)返回用戶、項(xiàng)目、評(píng)分和記錄交互的字典/矩陣的列表。可以將反饋的類型指定為顯式或隱式。
#@save
def load_data_ml100k(data, num_users, num_items, feedback=‘explicit’):
users, items, scores = [], [], []inter = np.zeros((num_items, num_users)) if feedback == 'explicit' else {}for line in data.itertuples():user_index, item_index = int(line[1] - 1), int(line[2] - 1)score = int(line[3]) if feedback == 'explicit' else 1users.append(user_index)items.append(item_index)scores.append(score)if feedback == 'implicit':inter.setdefault(user_index, []).append(item_index)else:inter[item_index, user_index] = scorereturn users, items, scores, inter
之后,將上述步驟放在一起,并將在下一節(jié)中使用。結(jié)果用Dataset和DataLoader包裝。注意,訓(xùn)練數(shù)據(jù)的最后一批DataLoader被設(shè)置為rollover模式(剩余的樣本被滾動(dòng)到下一個(gè)epoch),并且順序被無序排列。
#@save
def split_and_load_ml100k(split_mode=‘seq-aware’, feedback=‘explicit’,
                      test_ratio=0.1, batch_size=256):data, num_users, num_items = read_data_ml100k()train_data, test_data = split_data_ml100k(data, num_users, num_items, split_mode, test_ratio)train_u, train_i, train_r, _ = load_data_ml100k(train_data, num_users, num_items, feedback)test_u, test_i, test_r, _ = load_data_ml100k(test_data, num_users, num_items, feedback)train_set = gluon.data.ArrayDataset(np.array(train_u), np.array(train_i), np.array(train_r))test_set = gluon.data.ArrayDataset(np.array(test_u), np.array(test_i), np.array(test_r))train_iter = gluon.data.DataLoader(train_set, shuffle=True, last_batch='rollover',batch_size=batch_size)test_iter = gluon.data.DataLoader(test_set, batch_size=batch_size)return num_users, num_items, train_iter, test_iter
- Summary
 MovieLens datasets are widely used for recommendation research. It is public available and free to use.
 We define functions to download and preprocess the MovieLens 100k dataset for further use in later sections.
總結(jié)
 
                            
                        - 上一篇: CVPR2020:基于自适应采样的非局部
- 下一篇: 自动编码器的评级预测
