Как интерпретировать: рейтинг метки Средний балл точности - PullRequest
3 голосов
/ 27 апреля 2019

Я новичок в программировании Array, и мне было трудно интерпретировать функцию sklearn.metrics label_ranking_average_precision_score. Нужна ваша помощь, чтобы понять, как он рассчитывается, и кто-нибудь оценит любые советы по изучению программирования Numpy Array.

Вообще, я знаю, что точность
((Истинно положительный) / (истинно положительный + ложный положительный))

Причина, по которой я спрашиваю, состоит в том, что я наткнулся на Kaggle Competition for Audio Tagging и наткнулся на этот пост, в котором говорится, что они используют функцию LWRAP для вычисления баллов, когда в ответе более одной правильной метки. Я начал читать, чтобы узнать, как рассчитывается этот счет, и мне было трудно его интерпретировать. Мои две трудности
1) Интерпретируя математическую функцию из документации, я не уверен, как ранги используются при подсчете баллов
2) Интерпретация операций с массивом Numpy из кода
Функция, которую я читаю, взята из документа Google Collab , затем я попытался прочитать документацию по 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 Ответ

2 голосов
/ 02 июля 2019

Чтобы лучше понять, как рассчитывается счет, давайте приведем простой пример. Представьте, что мы помечаем изображения, которые могут содержать кошек, собак и / или птиц. Массив классов выглядит как [Cat, Dog, Bird]. Поэтому, если у нас есть изображение, содержащее только кота, массив истины будет иметь вид [1, 0, 0].

Мы подаем модели это изображение, содержащее только Cat, и оно выводит [.9, .2, .3]. Сначала мы оцениваем метки, которые предсказывала модель. Кошка заняла 1 место, Берд - 2 место, а Собака - 3 место. Теперь мы посчитаем, сколько ярлыков требуется, чтобы попасть в настоящий класс интересов (Cat), начиная с 1-го места. У модели было Cat на 1-м месте, так что это просто принимает значение 1. Затем мы подсчитываем, сколько других истинных меток было, пока мы не достигли правильной метки (Cat). Поначалу это может показаться странным, но это будет необходимо для примеров с несколькими метками позже. В этом случае метка Cat была правильной, и нам не нужно было двигаться дальше, поэтому она также принимает значение 1. Оценка рассчитывается путем взятия второго значения и деления его на первое значение. В этом случае оценка составляет 1/1 = 1.

Так что же произойдет, если модель выведет его из строя? Давайте поместим то же самое изображение Cat через другую модель. Он выводит [.6, .8, .1]. Ранжируйте метки от первого до последнего. Пес занял 1 место, Кот - 2 место, а Птица - 3 место. Узнайте, сколько ярлыков требуется, чтобы добраться до нужного класса интересов (снова Cat), начиная с 1-го места. Для этого сценария требуется две метки, поэтому первое значение равно 2. Затем выясните, сколько правильных меток было на этом пути. Было только 1, поэтому второе значение равно 1. Для этого случая показатель равен 1/2 = 0,50.

Хорошо, вот простые примеры. Я не собираюсь быть столь многословным для следующих двух, но применяю ту же логику, что и выше. Основное отличие состоит в том, что каждая правильная метка должна рассчитываться отдельно.

Правильное ранжирование двух меток: Изображение содержит кошку и птицу [1, 0, 1]. Модель выводит [.8, .2, .9]. Рейтинг Птица, Кот, Собака. Для метки Cat первое значение равно 2 (потребовалось две метки, чтобы добраться до него), а второе значение равно 2 (на пути было две правильные метки, Bird и Cat). Оценка = 2/2 = 1. Для метки Bird первое значение равно 1, а второе значение равно 1. Оценка = 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. Для собаки у нас было только 0,50 балла, поэтому итоговая оценка собаки = 0,50. Для Bird у нас было только 1,0 балла, поэтому Final Bird Score = 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.

Надеюсь, это даст вам лучшее понимание расчетов. Я оставлю код другому постеру, так как дронировался достаточно долго. Возможно, если никто не ответит на эту часть в ближайшее время, я могу добавить описание.

...