解释方法:标签排名平均准确度得分

时间:2019-04-27 14:38:31

标签: python numpy scikit-learn multilabel-classification average-precision

我是数组编程的新手,发现很难解释sklearn.metrics label_ranking_average_precision_score函数。需要您的帮助以了解其计算方式,并感谢您学习Numpy数组编程的任何技巧。

通常,我知道Precision是
((真正)/(真正+假正))

我问的原因是,我偶然发现了Kaggle音频标记竞赛,并发现这篇帖子说,当响应中有多个正确的标签时,他们正在使用LWRAP函数计算分数。我开始阅读以了解该分数是如何计算的,并发现难以解释。我的两个困难是
1)从文档中解释Math函数,我不确定分数计算中如何使用排名
2)从代码解释Numpy数组操作
我正在阅读的功能来自Google Collab document,然后我尝试阅读sklearn上的文档,但无法正确理解。

一个样本计算的代码是

# Core calculation of label precisions for one test sample.

def _one_sample_positive_class_precisions(scores, truth):
  """Calculate precisions for each true class for a single sample.

  Args:
    scores: np.array of (num_classes,) giving the individual classifier scores.
    truth: np.array of (num_classes,) bools indicating which classes are true.

  Returns:
    pos_class_indices: np.array of indices of the true classes for this sample.
    pos_class_precisions: np.array of precisions corresponding to each of those
      classes.
  """
  num_classes = scores.shape[0]
  pos_class_indices = np.flatnonzero(truth > 0)
  # Only calculate precisions if there are some true classes.
  if not len(pos_class_indices):
    return pos_class_indices, np.zeros(0)
  # Retrieval list of classes for this sample. 
  retrieved_classes = np.argsort(scores)[::-1]
  # class_rankings[top_scoring_class_index] == 0 etc.
  class_rankings = np.zeros(num_classes, dtype=np.int)
  class_rankings[retrieved_classes] = range(num_classes)
  # Which of these is a true label?
  retrieved_class_true = np.zeros(num_classes, dtype=np.bool)
  retrieved_class_true[class_rankings[pos_class_indices]] = True
  # Num hits for every truncated retrieval list.
  retrieved_cumulative_hits = np.cumsum(retrieved_class_true)
  # Precision of retrieval list truncated at each hit, in order of pos_labels.
  precision_at_hits = (
      retrieved_cumulative_hits[class_rankings[pos_class_indices]] / 
      (1 + class_rankings[pos_class_indices].astype(np.float)))
  return pos_class_indices, precision_at_hits

1 个答案:

答案 0 :(得分:2)

为了更好地理解分数的计算方式,我们举一个简单的例子。假设我们正在标记可能包含猫,狗和/或鸟的图像。类数组看起来像[猫,狗,鸟]。因此,如果我们有一幅只包含猫的图像,则真值数组的形式为[1、0、0]。

我们将仅包含Cat的图像输入模型,并输出[.9,.2,.3]。首先,我们对模型预测的标签进行排名。猫排第一,鸟排第二,狗排第三。现在,我们计算从第一名开始获得真正的兴趣类别(Cat)所需的标签数。该模型将Cat排在第一位,因此它的取值简单为1。接下来,我们计算还有多少其他真实标签,直到达到正确的标签(Cat)为止。乍一看这可能会造成混淆,但是稍后需要使用多标签示例。对于这种情况,Cat标签是正确的,我们不需要进一步移动,因此它也取值为1。分数是通过取第二个值并将其除以第一个值来计算的。在这种情况下,分数是1/1 = 1。

那么,如果模型使它乱序怎么办?让我们通过不同的模型放置同一张Cat图片。它输出[.6,.8,.1]。从头到尾对标签进行排名。狗获得第一名,猫获得第二名,伯德获得第三名。找出从第1位开始到达正确兴趣类别(再次为Cat)所需的标签数。在这种情况下,它需要两个标签,因此第一个值为2。接下来,找出沿途有多少个正确的标签。只有1,所以第二个值是1。在这种情况下,分数是1/2 = 0.50。

好的,这些就是简单的例子。接下来的两篇文章我不会那么冗长,而是采用与上面相同的逻辑。主要区别在于每个正确的标签都需要分别计算。

正确排列两个标签:图像包含猫和鸟[1、0、1]。模型输出[.8,.2,.9]。排名是鸟,猫,狗。对于Cat标签,第一个值为2(获取两个标签),第二个值为2(沿途有两个正确的标签Bird和Cat)。 Score = 2/2 =1。对于Bird标签,第一个值为1,第二个值为1。Score= 1/1 = 1。

两个标签的排名不正确:图像包含猫和狗[1、1、0]。模型输出[.1,.2,.8]。排名是鸟,狗,猫。对于Cat标签,第一个值为3,第二个值为2。得分= 2/3 = 0.66。对于“狗”标签,第一个值为2,第二个值为1。得分= 1/2 = 0.50。

好的,那么我们如何获得每个课程的最终成绩?最简单的方法是取平均值。让我们使用前面的两个示例来计算。对于Cat,我们的得分分别为1和0.66。最终猫分数=(1 + 0.66)/ 2 = 0.83。对于Dog,我们的分数仅为0.50,因此,最终Dog分数= 0.50。对于Bird,我们的分数仅为1.0,因此,最终Bird分数=1。该指标非常适合分析课堂表现。

我们如何将这些班级成绩压缩为一个最终成绩?我们可以对所有最终班的分数进行平均,但这会稀释普通班的分数并增加不常上课的人数。相反,我们可以简单地使用加权平均值!使用两个示例图像,我们有2只猫,1只狗和1只鸟。最终分数=(2个猫/ 4个标签)* 0.83 +(1个狗/ 4个标签)* 0.50 +(1个鸟/ 4个标签)* 1.0 = 0.79。方便地,这最终与对所有单个分数进行平均相同,因此我们甚至不需要存储班级权重。回想一下,我们对第一张图像的猫和鸟的得分分别为1和1,然后对第二张图像的猫和狗的得分分别为0.66和0.50。 (1 +1 + 0.66 + 0.50)/ 4 = 0.79。

希望这可以使您对计算有更好的了解。我已经开车了足够长的时间,将代码留给了另一位发布者。也许如果没有人很快回答这一部分,我可以添加一篇文章。