Пошаговое объяснение одной из самых популярных метрик оценки для рекомендаций или проблем ранжирования

Средняя средняя точность при K (MAP@K) — это один из наиболее часто используемых показателей оценки для рекомендательных систем и других задач классификации, связанных с ранжированием. Поскольку эта метрика представляет собой набор различных метрик или слоев ошибок, ее может быть не так просто понять на первый взгляд.

В этой статье шаг за шагом объясняется MAP@K и его компоненты. В конце этой статьи вы также найдете фрагменты кода, как рассчитать показатель. Но прежде чем углубляться в каждую часть показателя, давайте сначала поговорим о ПОЧЕМУ.

ЗАЧЕМ использовать MAP@K?

MAP@K – это показатель ошибок, который можно использовать, когда последовательность или рейтинг рекомендуемых вами элементов играет важную роль или является целью вашей задачи. Используя его, вы получаете ответы на следующие вопросы:

  • Являются ли мои сгенерированные или прогнозируемые рекомендации релевантными?
  • Находятся ли наиболее актуальныерекомендации в первом рейтинге?

Облегчение понимания следующих шагов

Теперь, когда вы знаете, ПОЧЕМУ, давайте поговорим о КАК. В следующих главах шаг за шагом в «луковичном» стиле, от внутренней части (начиная с Precision P) к внешней (MAP@K) структуре MAP@K.

Чтобы упростить понимание шагов и их состава, мы работаем со следующим примером: мы хотим оценить нашу рекомендательную систему, которая рекомендует шесть позиций потенциальным клиентам при посещении страницы сведений о продукте (рис. 1).

Точность (П)

Возможно, вы уже слышали о точности в книгах или статьях, когда узнавали о метриках ошибок для моделей классификации. Точность можно рассматривать как меру качества. Высокая точность означает, что наша модель возвращает более релевантные результаты, чем нерелевантные или рекомендации.

Точность можно определить как долю релевантных элементов во всех рекомендуемых элементах (релевантные + нерелевантные элементы).

В приведенном ниже примере (рис. 3) показано 6 рекомендуемых элементов. Из этих 6 рекомендаций актуальны 2.

Подставив эти значения в нашу формулу (рис. 1), мы получим точность 0,33 ( 2 relevant items / (2 relevant + 4 irrelevant items) ).

Точность@К (P@K)

Метрика точности (рисунок 2) сама по себе не учитывает ранг или порядок, в котором появляются соответствующие элементы. Пришло время включить ранги в нашу формулу точности. Точность@K можно определить как долю релевантных элементов в списке K наиболее рекомендуемых элементов (рис. 4).

На следующем рисунке (рис. 5) показан наш пример сверху (рис. 3) в ранжированном сценарии.

Столбец Precision@K показывает для каждого ранга (от 1 до 6) значение Precision@K. K обозначает количество рангов (1, 2, …, 6), которые мы рассматриваем.

Точность@1

Предполагая, что мы будем рассматривать только первый рейтинг (K=1), мы получим 0 релевантных элементов, разделенных на 1. strong> (всего элементов), что приводит к 0 для Precision@1.

Точность@3

Предположим, что мы рассматриваем первые три ранга (K=3), тогда у нас будет под тремя верхними рекомендациями 1релевантный элемент и 2нерелевантный элемент. . Если мы поместим эти числа в нашу формулу (рис. 3), мы получим 0,33
(1 relevant item / (1 relevant + 2 irrelevant items)).

Точность@5

И последнее, но не менее важное: рассмотрим первые пять рангов (K=5). Тогда у нас будет под первыми 5 рекомендациями 2 релевантных и 3нерелевантных. Если мы снова посчитаем, то получим значение 0,4
(2 relevant items / (2 relevant + 3 irrelevant items)).

Средняя точность@K (AP@K)

Как мы видели, Precision и Precision@K довольно просты. Следующий шаг немного сложнее.

Средняя точность@K или AP@K – это сумма точности@K, где элемент с рангом kₜₕ является релевантным (rel(k)), деленная на общее количество релевантных элементов. (r) в топ-К рекомендаций (рисунок 6).

Смущенный? Давайте посмотрим на следующий пример для AP@6 (рисунок 7).

Общее количество релевантных элементов (r) в этом примере 2 (на рангах 2 и 4). Следовательно, мы можем поместить 2 в дробь 1/r.

Глядя на первый ранг 1. Точность@1 равна 0, и элемент не имеет значения (серый). Поэтому мы умножаем значение Precision@1 на 0, что приводит к 0 * 0.

Однако на 2-м ранге у нас есть значение Precision@2, равное 0,5, и соответствующий элемент на 2-м ранге. Это приводит к 0.5 * 1 .

На 3-м ранге у нас снова нерелевантный элемент и Precision@3, равный 0,33. Это приводит к 0.33 * 0.

Мы продолжим здесь, пройдясь по каждому рангу. Если ранг k содержит релевантный элемент, мы умножаем его Precision@k на 1. В случае, если он нерелевантный, мы умножаем его на 0, что означает, что он не влияет на увеличение нашей суммы.

Конечным результатом для этого примера будет AP@6 0,5.

Прежде чем мы перейдем к последнему шагу, помните ли вы, что мы говорили в начале, что MAP@K может ответить на вопрос:

Находятся ли наиболее актуальныерекомендации в первом рейтинге?

Отличительной чертой этой метрики является то, что она наказывает соответствующие элементы в более низких рангах. Чтобы дать вам лучшее понимание, давайте рассмотрим следующий пример (рис. 8).

По сравнению с исходным примером (рисунок 7) количество соответствующих элементов не изменилось. Но что изменилось, так это ранг, в который они помещены. AP@K (и, следовательно, MAP@K) наказывает ваши рекомендации или модель, если соответствующие элементы размещаются на более низких рангах.

Средняя средняя точность@K (MAP@K)

Предыдущие шаги и примеры были основаны на оценке одного запроса или одного списка рекомендаций, которые получает один посетитель при просмотре страницы сведений о продукте X. Но у нас более одного посетителя…

Mean Average Precision@K или MAP@K учитывает это. Он усредняет AP@K для рекомендаций, показанных M пользователям.

Обратите внимание: для простоты я выбрал в этом примере «пользователей». Однако, в зависимости от вашего случая, M может быть также, например, поисковым запросом.

Чтобы лучше понять, как рассчитывается MAP@K, можно увидеть следующий пример (рисунок 10).

На основе трех разных пользователей (или запросов) MAP@6 составляет 0,59.

Кодирование

Теперь, когда мы знакомы с теорией, давайте немного напишем код. В следующих примерах мы будем работать с двумя списками actuals и predicted, содержащими product_id.

Цель состоит в том, чтобы проверить, появляются ли наши фактические значения в нашем прогнозируемом списке, и если да, то на каком ранге/месте они появляются. Вот почему порядок элементов имеет значение не в нашем actuals, а в нашем predicted списке.

AP@K

Следующие списки отражают пример, который мы использовали ранее (рис. 11).

actuals = ['p_a', 'p_b']
predicted = ['p_d', 'p_a', 'p_c', 'p_b', 'p_e', 'p_f']

Если мы сравним фактические данные с прогнозируемыми, то увидим, что p_b появляется на 2-м месте, а p_d — на 4-м.

def apk(y_true, y_pred, k_max=0):

  # Check if all elements in lists are unique
  if len(set(y_true)) != len(y_true):
    raise ValueError("Values in y_true are not unique")

  if len(set(y_pred)) != len(y_pred):
    raise ValueError("Values in y_pred are not unique")

  if k_max != 0:
    y_pred = y_pred[:k_max]


  correct_predictions = 0
  running_sum = 0

  for i, yp_item in enumerate(y_pred):
    
    k = i+1 # our rank starts at 1
    
    if yp_item in y_true:
      correct_predictions += 1
      running_sum += correct_predictions/k

  return running_sum/len(y_true)

Если мы поместим наши два списка в нашу функцию

apk(actuals, predicted)

тогда мы получим 0,5, как в нашем ручном примере (рис. 7).

КАРТА@К

Поскольку MAP@K усредняется по нескольким запросам, мы приводим наши списки к следующей структуре:

actual = ['p_a', 'p_b']

predic = [
    ['p_a', 'p_b', 'p_c', 'p_d', 'p_e', 'p_f'],
    ['p_c', 'p_d', 'p_e', 'p_f', 'p_a', 'p_b'],
    ['p_d', 'p_a', 'p_c', 'p_b', 'p_e', 'p_f'],
]

Наш actuals остался прежним, но наш список predicted теперь содержит несколько списков (по одному на каждый запрос). Списки predicted соответствуют спискам на рисунке 10.

В приведенном ниже коде показан расчет MAP@K:

import numpy as np
from itertools import product

def mapk(actuals, predicted, k=0):
  return np.mean([apk(a,p,k) for a,p in product([actual], predicted)])

Если мы поместим наши списки в эту функцию

mapk(actuals, predicted)

тогда мы получаем 0,59.

Заключение

При оценке рекомендательных систем или моделей ранжирования MAP@K — отличный выбор. Он не только дает представление о том, актуальны ли ваши рекомендации, но также учитывает ранг ваших правильных прогнозов.

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

Если вы хотите измерить не только релевантность ваших рекомендаций, но и насколько они релевантны, воспользуйтесь нормализованным дисконтированным совокупным доходом (NDCG).

Источники

Введение в поиск информации — оценка, https://web.stanford.edu/class/cs276/handouts/EvaluationNew-handout-1-per.pdf