我的目标是理解平均精确度在K
和召回率在K
。我有两个列表,一个是预测的,另一个是实际的(真实情况)
我们称这两个列表为预测和实际。现在我想计算精确度@k
和召回率@k
。
使用Python,我实现了平均精确度在K的计算如下:
def apk(actual, predicted, k=10): """ Computes the average precision at k. This function computes the average precision at k between two lists of items. Parameters ---------- actual: list A list of elements that are to be predicted (order doesn't matter) predicted : list A list of predicted elements (order does matter) k: int, optional Returns ------- score : double The average precision at k over the input lists """ if len(predicted) > k: predicted = predicted[:k] score = 0.0 num_hits = 0.0 for i,p in enumerate(predicted): if p in actual and p not in predicted[:i]: num_hits += 1.0 score += num_hits / (i + 1.0) if not actual: return 1.0 if min(len(actual), k) == 0: return 0.0 else: return score / min(len(actual), k)
假设我们的预测列表包含以下顺序的5个字符串:predicted = ['b','c','a','e','d'] 和
actual = [‘a’,’b’,’e’]由于我们是在@k进行计算,精确度@k是否与
召回率@k相同?如果不同,我该如何计算
召回率@k`
如果我想计算F-measure (F-score)
,对于上述提到的列表,最好的方法是什么?
回答:
我想,你已经查看了维基百科。根据其公式,第三个也是最大的一个(在单词’This finite sum is equivalent to:’之后),让我们看看你的例子中每一次迭代的情况:
- i=1 p = 1
- i=2 rel = 0
- i=3 p = 2/3
- i=4 p = 3/4
- i=5 rel = 0
所以,avp@4 = avp@5 = (1 + 0.66 + 0.75) / 3 = 0.805; avp@3 = (1 + 0.66) / 3 等等。
召回率@5 = 召回率@4 = 3/3 = 1; 召回率@3 = 2/3; 召回率@2 = 召回率@1 = 1/3
以下是精确度@k和召回率@k的代码。我保留了你的符号,尽管使用actual
表示观察/返回值和expected
表示真实情况似乎更为常见(例如,参见JUnit的默认设置)。
def precision(actual, predicted, k): act_set = set(actual) pred_set = set(predicted[:k]) result = len(act_set & pred_set) / float(k) return resultdef recall(actual, predicted, k): act_set = set(actual) pred_set = set(predicted[:k]) result = len(act_set & pred_set) / float(len(act_set)) return result