KerasRS / API 文档 / 指标 / DCG 指标

DCG 指标

[源代码]

DCG

keras_rs.metrics.DCG(
    k: Optional[int] = None,
    gain_fn: Callable[[Any], Any] = default_gain_fn,
    rank_discount_fn: Callable[[Any], Any] = default_rank_discount_fn,
    **kwargs: Any
)

计算折损累积增益 (DCG)。

这个指标评估排序质量。它计算项目的分级相关性得分之和,并根据位置应用可配置的折损。该指标处理 y_true 中的真实相关性标签(分级相关性得分,非负数,值越高表示相关性越大)与 y_pred 中的预测得分。y_pred 中的得分用于通过降序排序来确定项目的排名顺序。得分是非负的,值越高表示排序质量越好(高度相关的项目排名越高)。单个列表的得分没有边界或归一化,即它不在一个特定范围内。

对于 y_pred 中的每个预测得分列表 sy_true 中对应的真实标签列表 y,每个查询的 DCG 得分计算如下:

DCG@k(y', w') = sum_{i=1}^{k} (gain_fn(y'_i) / rank_discount_fn(i))

其中

  • y'_i 是位于位置 i 的项目的真实相关性得分(通过根据 y_pred 排序 y_true 获得)。
  • gain_fn 是用户提供的函数,用于将相关性 y'_i 映射到增益值。默认函数 (default_gain_fn) 通常等同于 lambda y: 2**y - 1
  • rank_discount_fn 是用户提供的函数,用于将排名位置 i 映射到折损值。默认函数 (default_rank_discount_fn) 通常等同于 lambda rank: 1 / log2(rank + 1)
  • 最终结果会聚合这些每个列表的得分。

报告的最终 DCG 得分通常是数据集中所有查询/列表的这些每个查询得分的加权平均值。

注意:sample_weight 对于排序指标的处理方式不同。对于批量输入,sample_weight 可以是标量、1维或 2维。标量情况和 1维情况(列表级权重)比较直接。2维情况(项目级权重)有所不同,样本权重会被聚合并得到 1维权重。更多详情请参阅 keras_rs.src.metrics.ranking_metrics_utils.get_list_weights

参数

  • gain_fn:可调用对象。将相关性得分(y_true)映射到增益值。默认实现是 2**y - 1
  • rank_discount_fn:函数。将排名位置映射到折损值。默认实现 (default_rank_discount_fn) 是 1 / log2(rank + 1)
  • k:int。要考虑的排名前 k 个项目的数量(即“top-k”中的“k”)。必须是正整数。
  • shuffle_ties:bool。是否在排序前随机打乱得分。这样做是为了打破平局。默认为 True
  • seed:int。用于打乱的随机种子。
  • name:str。指标实例的可选名称。
  • dtype:指标计算的数据类型(dtype)。默认为 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.DCG()(
...     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.DCG()(
...     y_true={"labels": labels, "mask": mask}, y_pred=scores
... )