在Keras模型中添加NDCG指标遇评估仅返回RMSE问题求助
问题解决思路与代码调整
核心原因
你遇到的问题是因为TF Ranking的DCG/NDCG指标要求输入是「查询-多候选item」的排序任务格式,而原DCN教程默认是单样本回归任务(每个样本对应一个用户-物品的评分预测),这种单样本格式不满足排序指标的输入要求,所以指标没有被正确计算,只返回了回归任务默认的RMSE。
具体解决步骤
调整测试集数据格式为排序任务结构
需要将测试数据按用户分组,每个用户对应多个候选物品及真实评分,形成「查询-候选集」的结构:# 假设你的测试集包含user_id、item_id、rating字段 def group_samples_by_user(features): # 将同一用户的样本打包成一组,作为该用户的候选集 return tf.data.Dataset.from_tensor_slices({ "user_id": features["user_id"], "item_id": features["item_id"], "rating": features["rating"] }).group_by_window( key_func=lambda x: x["user_id"], # 按user_id分组 reduce_func=lambda key, ds: ds.batch(10), # 每个用户取10个候选物品(可按需调整) window_size=10 ) # 转换测试集格式 cached_test = cached_test.apply(group_samples_by_user)替换为NDCG指标(直接用你需要的NDCG而非DCG)
原代码用的是DCG,改成NDCG更符合你的需求,同时确保指标被正确配置:model.compile( optimizer='sgd', loss=tf.keras.losses.MeanSquaredError(), # 保留原回归损失,或替换为排序损失如PairwiseHingeLoss metrics=[tfr.keras.metrics.NDCGMetric(name="ndcg")] )确保模型适配排序输入
如果原模型是为单样本设计的,需要调整输入处理逻辑,让模型能接受「单个用户特征 + 多个物品特征」的输入,输出对应数量的预测得分。比如在模型的输入层,对物品特征设置ragged=True或者处理成批量张量。
验证结果
执行评估后,就能同时拿到RMSE和NDCG指标:
metrics = model.evaluate(cached_test, return_dict=True) print(metrics) # 输出会包含loss、rmse、ndcg三个字段
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

