Как интерпретировать: средний показатель точности рейтинга меток

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

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

Причина, по которой я спрашиваю, заключается в том, что я наткнулся на Kaggle Competition for Audio Tagged и наткнулся на этот пост, в котором говорится, что они используют функцию LWRAP для расчета оценки, когда в ответе есть более одной правильной метки. Я начал читать, чтобы узнать, как рассчитывается этот балл, и мне было трудно его интерпретировать. Мои две трудности
1) Интерпретируя математическую функцию из документации, я не уверен, как ранги используются при расчете очков
2) Интерпретация операций массива Numpy из кода
Функция, которую я читаю, взята из Документ совместной работы Google, затем я попытался прочитать документацию в склерн, но не смог правильно понять.

Код для одного примера расчета

# 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

IMHO этот блог дает интуитивное объяснение средней точности.

HaaLeo 03.10.2020 12:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
1
3 498
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Так что же произойдет, если модель выйдет из строя? Давайте поместим то же самое изображение кота в другую модель. Он выводит [.6, .8, .1]. Расставьте этикетки от первого к последнему. Собака заняла 1-е место, Кошка - 2-е место, а Птица - 3-е место. Узнайте, сколько ярлыков требуется, чтобы попасть в нужный класс интереса (снова кошка), начиная с 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.

Итак, как нам получить окончательный балл по каждому классу? Самым простым способом было бы взять среднее значение. Давайте воспользуемся предыдущими двумя примерами, чтобы вычислить это. Для кошки у нас были оценки 1 и 0,66. Итоговая оценка кошки = (1+0,66)/2 = 0,83. Для собаки у нас была только оценка 0,50, поэтому окончательная оценка собаки = 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.

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

Спасибо за это отличное объяснение! Правильно ли будет сказать, что LRAP, равный 0, означает, что модель выучила все задом наперед? (примерно так же, как показатель корреляции -1 $R^2$ означает, что существует обратная корреляция) И что LRAP, равный 0,5, означает, что модель полностью случайна?

Alexander Soare 29.12.2020 21:05

Общий LRAP, близкий к нулю, означает, что ваша модель ставит правильные классы на последнее место. Если это должно было случиться, это хороший знак, потому что это, вероятно, означает, что вы перепутали свои 0 и 1 в своем мультигорячем векторе. LRAP, равный 0,5, может означать разные вещи в зависимости от его дисперсии на выборку. Например, у вас может быть модель, которая очень хорошо ранжирует одни выборки, но плохо работает с другими (высокая дисперсия). У вас также может быть модель, которая последовательно занимает правильный класс в середине пакета (низкая дисперсия). Оба этих сценария требуют повторной проверки ваших данных и модели на наличие проблем.

Austin 26.01.2021 18:34

Другие вопросы по теме