Как интерпретировать: рейтинг метки Средний балл точности
Я новичок в программировании Array, и мне было трудно интерпретировать функцию sklearn.metrics label_ranking_average_precision_score. Нужна ваша помощь, чтобы понять, как он рассчитывается, и любой ценит любые советы, чтобы узнать Numpy Array Programming.
Вообще, я знаю, что точность
((Истинный позитив) / (Истинный позитив + ложный позитив))
Причина, по которой я спрашиваю, заключается в том, что я наткнулся на 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
0 ответов
Чтобы лучше понять, как рассчитывается оценка, давайте рассмотрим простой пример. Представьте, что мы маркируем изображения, которые могут содержать кошек, собак и / или птиц. Массив классов выглядит как [Кошка, Собака, Птица]. Итак, если у нас есть изображение, содержащее только кота, массив истинности будет иметь форму [1, 0, 0].
Мы скармливаем модели это изображение, содержащее только кота, и оно выводит [.9, .2, .3]. Сначала мы ранжируем метки, предсказанные моделью. Кот занял 1 место, Птица - 2 место, а Собака - 3 место. Теперь посчитаем, сколько ярлыков нужно, чтобы добраться до истинного класса интереса (Cat), начиная с 1-го места. В модели Cat на 1-м месте, поэтому здесь просто принимается значение 1. Затем мы подсчитываем, сколько других истинных меток было, пока мы не достигли правильной метки (Cat). Сначала это может показаться запутанным, но позже это понадобится для примеров с несколькими метками. В этом случае метка 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.
Хорошо, а как нам получить окончательную оценку для каждого класса? Самый простой способ - взять среднее значение. Давайте воспользуемся двумя предыдущими примерами, чтобы рассчитать это. Для 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.
Надеюсь, это поможет вам лучше понять расчеты. Я оставлю код другому пользователю, так как я уже достаточно долго бормотал. Возможно, если в ближайшее время никто не ответит на эту часть, я могу добавить рецензию.