NCF:基于神经网络的协同过滤算法

引言

神经网络协同过滤 (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 算法能够有效地学习用户和物品之间的复杂交互关系,在推荐系统中具有广泛的应用。

0 0 投票数
Article Rating
订阅评论
提醒
0 评论
最多投票
最新 最旧
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x