You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Keras模型中添加NDCG指标遇评估仅返回RMSE问题求助

问题解决思路与代码调整

核心原因

你遇到的问题是因为TF Ranking的DCG/NDCG指标要求输入是「查询-多候选item」的排序任务格式,而原DCN教程默认是单样本回归任务(每个样本对应一个用户-物品的评分预测),这种单样本格式不满足排序指标的输入要求,所以指标没有被正确计算,只返回了回归任务默认的RMSE。

具体解决步骤

  1. 调整测试集数据格式为排序任务结构
    需要将测试数据按用户分组,每个用户对应多个候选物品及真实评分,形成「查询-候选集」的结构:

    # 假设你的测试集包含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)
    
  2. 替换为NDCG指标(直接用你需要的NDCG而非DCG)
    原代码用的是DCG,改成NDCG更符合你的需求,同时确保指标被正确配置:

    model.compile(
        optimizer='sgd',
        loss=tf.keras.losses.MeanSquaredError(),  # 保留原回归损失,或替换为排序损失如PairwiseHingeLoss
        metrics=[tfr.keras.metrics.NDCGMetric(name="ndcg")]
    )
    
  3. 确保模型适配排序输入
    如果原模型是为单样本设计的,需要调整输入处理逻辑,让模型能接受「单个用户特征 + 多个物品特征」的输入,输出对应数量的预测得分。比如在模型的输入层,对物品特征设置ragged=True或者处理成批量张量。

验证结果

执行评估后,就能同时拿到RMSE和NDCG指标:

metrics = model.evaluate(cached_test, return_dict=True)
print(metrics)  # 输出会包含loss、rmse、ndcg三个字段

内容的提问来源于stack exchange,提问作者Learning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:22:07