引言
神经网络协同过滤 (NCF) 是一种将矩阵分解与多层感知机相结合的推荐算法,能够有效地学习用户和物品之间的复杂交互关系。本篇文章将以 ncf_movielens.ipynb
示例为例,详细介绍如何使用 Recommenders 工具包实现 NCF 算法,并对模型性能进行评估。
数据准备
本示例使用经典的 MovieLens 数据集,该数据集包含了用户对电影的评分信息。首先,使用 recommenders.datasets.movielens
模块加载数据集,并指定使用的数据集大小和数据格式。
df = movielens.load_pandas_df(
size=MOVIELENS_DATA_SIZE,
header=["userID", "itemID", "rating", "timestamp"]
)
接下来,使用 python_chrono_split
函数按照时间顺序将数据集划分为训练集和测试集,划分比例为 75:25。
train, test = python_chrono_split(df, 0.75)
为了避免冷启动问题,将测试集中未出现在训练集中的用户和物品过滤掉。
test = test[test["userID"].isin(train["userID"].unique())]
test = test[test["itemID"].isin(train["itemID"].unique())]
模型构建
使用 recommenders.models.ncf.ncf_singlenode
模块中的 NCF 类构建 NCF 模型。
model = NCF (
n_users=data.n_users,
n_items=data.n_items,
model_type="NeuMF",
n_factors=4,
layer_sizes=[16,8,4],
n_epochs=EPOCHS,
batch_size=BATCH_SIZE,
learning_rate=1e-3,
verbose=10,
seed=SEED
)
在 NCF 模型中,model_type
参数指定使用的模型类型,本示例使用 NeuMF 模型,该模型结合了广义矩阵分解 (GMF) 和多层感知机 (MLP) 的优势。n_factors
参数表示隐含特征维度,layer_sizes
参数指定 MLP 网络的层数和每层的神经元数量。
模型训练
使用训练集对 NCF 模型进行训练。
with Timer() as train_time:
model.fit(data)
print("Took {} seconds for training.".format(train_time))
生成推荐结果
在电影推荐场景中,通常不推荐用户已经看过的电影。因此,需要将训练集中出现过的用户-电影组合从推荐结果中剔除。
with Timer() as test_time:
users, items, preds = [], [], []
item = list(train.itemID.unique())
for user in train.userID.unique():
user = [user] * len(item)
users.extend(user)
items.extend(item)
preds.extend(list(model.predict(user, item, is_list=True)))
all_predictions = pd.DataFrame(data={"userID": users, "itemID":items, "prediction":preds})
merged = pd.merge(train, all_predictions, on=["userID", "itemID"], how="outer")
all_predictions = merged[merged.rating.isnull()].drop('rating', axis=1)
print("Took {} seconds for prediction.".format(test_time))
模型评估
使用 recommenders.evaluation.python_evaluation
模块中的评估指标对模型进行评估。
eval_map = map(test, all_predictions, col_prediction='prediction', k=TOP_K)
eval_ndcg = ndcg_at_k(test, all_predictions, col_prediction='prediction', k=TOP_K)
eval_precision = precision_at_k(test, all_predictions, col_prediction='prediction', k=TOP_K)
eval_recall = recall_at_k(test, all_predictions, col_prediction='prediction', k=TOP_K)
print("MAP:\
"NDCG:\
"Precision@K:\
"Recall@K:\
总结
本篇文章以 ncf_movielens.ipynb
为例,详细介绍了如何使用 Recommenders 工具包实现 NCF 算法,并对模型性能进行了评估。NCF 算法能够有效地学习用户和物品之间的复杂交互关系,在推荐系统中具有广泛的应用。