趋近智
Precision@k 衡量了前 k 个推荐项中包含多少相关项目,但它有一个明显的局限:它忽略了这些项目的排列顺序。根据 Precision@5 的计算规则,将相关项目排在第 1 位的推荐列表与将其排在第 5 位的列表得分完全相同。在大多数应用场景中,这并不理想。用户更有可能与列表顶部的项目进行交互,因此,一个优秀的推荐系统应当因将相关项目排在更高位置而获得奖励。
这正是平均精度均值 (MAP) 旨在解决的问题。它是一种排序指标,对于将相关项目排在推荐列表较后位置的模型会给予较大的减分。
要理解 MAP,我们首先需要了解平均精度 (Average Precision, AP),它是针对每个用户分别计算的。单个用户的平均精度是在每个包含相关项目的排名位置 k 处计算出的 Precision@k 值的平均值。
让我们通过一个例子来说明。假设我们的模型为某位用户生成了包含 6 部电影的推荐排名列表。同时,我们已知测试集中的真实标签(Ground Truth),即该用户实际观看并喜欢的电影集合。
[电影 C, 电影 A, 电影 F, 电影 B, 电影 H, 电影 D]{电影 A, 电影 B, 电影 D}现在,我们遍历推荐列表,且仅在发现相关电影的位置计算精确度:
为了得到该用户的平均精度,我们对这些精确度得分取平均值。由于总共有 3 个相关项目,我们将计算出的精确度总和除以 3。
现在,考虑一个表现更好的模型,它将同样的相关项目排在了更高的位置。
[电影 A, 电影 B, 电影 C, 电影 F, 电影 D, 电影 H]{电影 A, 电影 B, 电影 D}让我们计算这个新列表的 AP:
现在,计算平均值:
模型 2 的 AP 得分明显更高,准确地反映了它生成的推荐列表排序更加合理。
下图展示了两个模型的计算过程,说明了相关项目的排名越高,AP 得分就越好。
比较同一用户的两个不同推荐模型的平均精度。模型 2 获得了更高的分数,因为它将相关项目 (A, B) 排在了列表的前列。
平均精度的正式定义为:
其中:
平均精度给出了单个用户的得分。为了得到一个描述整个模型性能的单一指标,我们为测试集中的每个用户计算 AP,然后取所有这些得分的平均值。这个最终值就是平均精度均值 (MAP)。
其中:
MAP 得分范围从 0 到 1,数值越高表示模型越好。1.0 的得分意味着模型为每一个用户都完美地将所有相关项目排在了列表的最顶端。
我们将上述逻辑转化为一个简单的 Python 函数。该函数接受一个推荐项目列表和一个相关项目集合,并计算 AP。
import numpy as np
def average_precision(recommended_items, relevant_items):
"""
计算单个推荐列表的平均精度 (AP)。
参数:
recommended_items (list): 推荐项目的排名 ID 列表。
relevant_items (set): 相关项目的 ID 集合 (真实标签)。
返回:
float: 平均精度得分。
"""
if not relevant_items:
return 0.0
# 存储每个相关位置的精确度值
precision_scores = []
num_hits = 0
for i, item_id in enumerate(recommended_items):
if item_id in relevant_items:
num_hits += 1
precision_at_k = num_hits / (i + 1)
precision_scores.append(precision_at_k)
if not precision_scores:
return 0.0
# AP 是相关位置精确度得分的平均值
return np.mean(precision_scores)
# 模型 2 的示例
recommended = ['电影 A', '电影 B', '电影 C', '电影 F', '电影 D', '电影 H']
relevant = {'电影 A', '电影 B', '电影 D'}
ap_score = average_precision(recommended, relevant)
print(f"模型 2 的 AP 得分: {ap_score:.4f}")
# 预期输出: 模型 2 的 AP 得分: 0.8667
要获取系统的 MAP 得分,您需要为测试集中的每个用户运行此函数,然后计算所有返回的 AP 得分的均值。对于任何关注项目排序的推荐任务,MAP 都是一种标准且有效的指标。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•