NDCG 类keras_rs.metrics.NDCG(
k: int | None = None,
gain_fn: Callable[[Any], Any] = default_gain_fn,
rank_discount_fn: Callable[[Any], Any] = default_rank_discount_fn,
**kwargs: Any
)
计算归一化折扣累积增益 (nDCG)。
此指标评估排序质量。它通过对每个列表的折扣累积增益 (DCG) 进行归一化处理,得到理想折扣累积增益 (IDCG)。该指标处理 y_true 中的真实相关性标签(分级相关性分数,数值越大表示相关性越高)与 y_pred 中的预测分数。y_pred 中的分数用于通过降序排序来确定项目的排名顺序。返回一个介于 0 和 1 之间的归一化分数。得分为 1 表示根据真实相关性(在前 k 项中)进行的完美排序,而得分为 0 通常表示排序中不包含任何相关项。分数越高表示相对于最佳可能排序,排序质量越好。
对于 y_pred 中的每个预测分数列表 s 以及 y_true 中对应的真实标签列表 y,每个查询的 nDCG 分数计算如下:
nDCG@k = DCG@k / IDCG@k
其中 DCG@k 基于预测排名 (y_pred) 计算:
DCG@k(y') = sum_{i=1}^{k} (gain_fn(y'_i) / rank_discount_fn(i))
而 IDCG@k 是理想 DCG,使用相同的公式计算,但对根据其真实相关性 (y_true) 完美排序的项目进行计算:
IDCG@k(y'') = sum_{i=1}^{k} (gain_fn(y''_i) / rank_discount_fn(i))
其中
y'_i:排名在由 y_pred 诱导的排名中第 i 项的真实相关性。y''_i:排名在理想排名(按 y_true 降序排序)中第 i 项的真实相关性。gain_fn 是用户提供的将相关性映射到增益的函数。默认函数 (default_gain_fn) 通常等同于 lambda y: 2**y - 1。rank_discount_fn 是用户提供的将排名 i(从 1 开始)映射到折扣值的函数。默认函数 (default_rank_discount_fn) 通常等同于 lambda rank: 1 / log2(rank + 1)。报告的最终 nDCG 分数通常是数据集中所有查询/列表的这些每个查询分数的加权平均值。
注意:sample_weight 对于排名指标的处理方式不同。对于批处理输入,sample_weight 可以是标量、1D 或 2D。标量情况和 1D 情况(列表式权重)很直接。2D 情况(项式权重)不同,因为样本权重会聚合以获得 1D 权重。有关更多详细信息,请参阅 keras_rs.src.metrics.ranking_metrics_utils.get_list_weights。
参数
y_true) 映射到增益值。默认实现为 2**y - 1。default_rank_discount_fn) 实现为 1 / log2(rank + 1)。True。None,表示使用 keras.backend.floatx()。keras.backend.floatx() 默认为 "float32",除非通过 keras.backend.set_floatx() 设置为其他值。如果提供了 keras.DTypePolicy,则将使用 compute_dtype。示例
>>> batch_size = 2
>>> list_size = 5
>>> labels = np.random.randint(0, 3, size=(batch_size, list_size))
>>> scores = np.random.random(size=(batch_size, list_size))
>>> metric = keras_rs.metrics.NDCG()(
... y_true=labels, y_pred=scores
... )
屏蔽某些元素(可用于不均匀输入)
>>> batch_size = 2
>>> list_size = 5
>>> labels = np.random.randint(0, 3, size=(batch_size, list_size))
>>> scores = np.random.random(size=(batch_size, list_size))
>>> mask = np.random.randint(0, 2, size=(batch_size, list_size), dtype=bool)
>>> metric = keras_rs.metrics.NDCG()(
... y_true={"labels": labels, "mask": mask}, y_pred=scores
... )