KerasRS / API 文档 / 指标 / 平均精度均值 (MAP) 指标

平均精度均值 (MAP) 指标

[源代码]

MeanAveragePrecision

keras_rs.metrics.MeanAveragePrecision(
    k: Optional[int] = None,
    shuffle_ties: bool = True,
    seed: Union[int, keras.src.random.seed_generator.SeedGenerator, NoneType] = None,
    **kwargs: Any
)

计算平均精度均值 (MAP)。

此指标用于评估排序质量。它计算在排序列表中每个相关项目出现后计算的精度值的平均值。该指标处理 y_true 中的真实相关性标签(表示相关性的二元指标 (0 或 1))与 y_pred 中的预测得分。y_pred 中的得分用于确定项目的排名顺序,通过降序排序。得分范围从 0 到 1,得分越高表示相关项目在排名中通常位置越高。

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

平均精度的计算公式定义如下。MAP 是对每个列表计算的平均精度的均值。

AP(y, s) = sum_j (P@j(y, s) * rel(j)) / sum_i y_i
rel(j) = y_i if rank(s_i) = j

其中

  • j 表示排名位置(从 1 开始)。
  • sum_j 表示对从 1 到列表大小(或 k)的所有排名 j 进行求和。
  • P@j(y, s) 表示在排名 j 时的精度,计算方法是在前 j 个位置中找到的相关项目数量除以 j
  • rel(j) 表示具体在排名 j 位置的项目的相关性。如果排名 j 位置的项目相关,则 rel(j) 为 1,否则为 0。
  • y_i 是原始项目 i 在排序前的真实相关性标签。
  • rank(s_i) 是根据项目 i 的得分 s_i 分配给项目 i 的排名位置。
  • sum_i y_i 计算原始列表 y 中相关项目的总数。

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

注意:sample_weight 对于排名指标的处理方式不同。对于批量输入,sample_weight 可以是标量、1D 或 2D。标量情况和 1D 情况(列表级权重)很简单。2D 情况(项目级权重)则不同,因为样本权重会被聚合成 1D 权重。有关更多详细信息,请参阅 keras_rs.src.metrics.ranking_metrics_utils.get_list_weights

参数

  • k:int。要考虑的排名靠前的项目数量(“top-k” 中的“k”)。必须是正整数。
  • shuffle_ties:bool。在排序前是否随机打乱得分。这样做是为了打破平局。默认为 True
  • seed:int。用于打乱的随机种子。
  • name:可选的损失实例名称。
  • dtype:指标计算的数据类型。默认为 None,表示使用 keras.backend.floatx()。除非设置了不同的值(通过 keras.backend.set_floatx()),否则 keras.backend.floatx()"float32"。如果提供了 keras.DTypePolicy,则将使用 compute_dtype

示例

>>> batch_size = 2
>>> list_size = 5
>>> labels = np.random.randint(0, 2, size=(batch_size, list_size))
>>> scores = np.random.random(size=(batch_size, list_size))
>>> metric = keras_rs.metrics.MeanAveragePrecision()(
...     y_true=labels, y_pred=scores
... )

遮蔽某些元素(可用于不均匀输入)

>>> batch_size = 2
>>> list_size = 5
>>> labels = np.random.randint(0, 2, 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.MeanAveragePrecision()(
...     y_true={"labels": labels, "mask": mask}, y_pred=scores
... )