NCF:基于神经网络的协同过滤算法 2024-06-29 作者 C3P00 引言 神经网络协同过滤 (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:\t%f" % eval_map, "NDCG:\t%f" % eval_ndcg, "Precision@K. \t%f" % eval_precision,✅ "Recall@K. \t%f" % eval_recall, sep='\n')✅ 总结 本篇文章以 ncf_movielens.ipynb 为例,详细介绍了如何使用 Recommenders 工具包实现 NCF 算法,并对模型性能进行了评估。NCF 算法能够有效地学习用户和物品之间的复杂交互关系,在推荐系统中具有广泛的应用。
引言
神经网络协同过滤 (NCF) 是一种将矩阵分解与多层感知机相结合的推荐算法,能够有效地学习用户和物品之间的复杂交互关系。本篇文章将以
ncf_movielens.ipynb
示例为例,详细介绍如何使用 Recommenders 工具包实现 NCF 算法,并对模型性能进行评估。数据准备
本示例使用经典的 MovieLens 数据集,该数据集包含了用户对电影的评分信息。首先,使用
recommenders.datasets.movielens
模块加载数据集,并指定使用的数据集大小和数据格式。接下来,使用
python_chrono_split
函数按照时间顺序将数据集划分为训练集和测试集,划分比例为 75:25。为了避免冷启动问题,将测试集中未出现在训练集中的用户和物品过滤掉。
模型构建
使用
recommenders.models.ncf.ncf_singlenode
模块中的 NCF 类构建 NCF 模型。在 NCF 模型中,
model_type
参数指定使用的模型类型,本示例使用 NeuMF 模型,该模型结合了广义矩阵分解 (GMF) 和多层感知机 (MLP) 的优势。n_factors
参数表示隐含特征维度,layer_sizes
参数指定 MLP 网络的层数和每层的神经元数量。模型训练
使用训练集对 NCF 模型进行训练。
生成推荐结果
在电影推荐场景中,通常不推荐用户已经看过的电影。因此,需要将训练集中出现过的用户-电影组合从推荐结果中剔除。
模型评估
使用
recommenders.evaluation.python_evaluation
模块中的评估指标对模型进行评估。总结
本篇文章以
ncf_movielens.ipynb
为例,详细介绍了如何使用 Recommenders 工具包实现 NCF 算法,并对模型性能进行了评估。NCF 算法能够有效地学习用户和物品之间的复杂交互关系,在推荐系统中具有广泛的应用。