Объяснение отзыва @ k, точности @ k и средней точности @ k на примерах из TensorFlow.

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

Мотивация для рекомендательных систем

Система рекомендаций - это алгоритм, который учитывает вкусы пользователей и позволяет рекомендовать элементы, представляющие интерес, на основе профиля пользователя. Если это достаточно расплывчато, вы будете удивлены, увидев, что системы рекомендаций широко используются в нашем повседневном взаимодействии с приложениями и сайтами. Например, Amazon использует их, чтобы рекомендовать продукты, Spotify, чтобы рекомендовать похожую музыку на основе нашей истории прослушивания, YouTube, чтобы рекомендовать похожие видео, Google для обслуживания персонализированной рекламы и результатов поиска, Netflix, чтобы рекомендовать фильмы и TasteDive, чтобы рекомендовать широкий спектр разных категорий (музыка, фильмы, шоу, книги, игры, подкасты и т. д.). Ценность рекомендательных систем огромна и часто приводит к критическому объему доходов или трафика на предприятиях. Например, 35% покупок пользователей в Amazon и 75% выбора шоу / фильмов в Netflix обусловлены результатами алгоритмов рекомендаций [источник: McKinsey & Company].

Обычно мы оцениваем качество наших рекомендаций, основываясь на том, насколько они соответствуют нашим предпочтениям и насколько неинтуитивно понятными, но интересными они могут быть. В первом случае мы оцениваем релевантность с помощью таких показателей, как отзыв и точность (которые мы расширим позже), а для второго - по таким параметрам, как разнообразие, охват, интуитивная прозорливость и новизна. Мы будем называть последние метрики вместе метриками интуитивной прозорливости. В этом посте мы сосредоточимся только на показателях релевантности, но если вы хотите прочитать отличное резюме о показателях интуитивности, пожалуйста, ознакомьтесь с этим постом: Рекомендательные системы - это еще не все о точности. Прежде чем мы более подробно остановимся на показателях релевантности, давайте кратко объясним, почему оба типа показателей одинаково важны. Когда рекомендации актуальны или, другими словами, когда они основаны на наших исторических предпочтениях, это с большей вероятностью сделает нас счастливыми и заинтересованными в услугах, которые мы используем. Например, когда кто-то является большим поклонником музыки в стиле RnB, он, скорее всего, будет получать рекомендации с похожими песнями или исполнителями в стиле RnB, а не с песнями, относящимися к музыке Heavy Metal. С другой стороны, если кому-то рекомендуют слишком очевидные вещи, не добавляя ничего нового, это несет в себе риск создания скучных, бездействующих рекомендаций. Представьте, что вы купили баскетбольные кроссовки на Amazon, и следующее, что вам порекомендуют, - это аналогичные баскетбольные кроссовки. Несмотря на то, что эта рекомендация актуальна, она не приведет к каким-либо действиям. С другой стороны, если вам рекомендуют баскетбольные носки или настоящий баскетбольный мяч, это с большей вероятностью приведет к новому действию. Хватит мотивационного жаргона, давайте перейдем к тому, о чем на самом деле этот пост ...

Что такое отзыв @ k и точность @ k?

Точность и отзыв - это метрики оценки, которые обычно используются в настройках классификации. В контексте рекомендательных систем мы используем такие показатели, как напоминание @ k и точность @ k, поскольку чаще всего предоставляется k рекомендаций для каждого примера. В нашем случае примером может быть пользовательский запрос. То есть, если пользователю нравится определенный набор фильмов (запрос), на выходе будет список из k фильмов (представляющих для него потенциальный интерес). Придерживаясь нашей парадигмы фильмов, пользователю нравится 70 из 200 тысяч фильмов (что соответствует этому примеру, имеющему 70 меток), мы можем представить это вектором 1x200000, где все элементы будут равны 0, за исключением того, что 70 равны 1 (в позициях соответствующие фильмам, к которым пользователь проявил интерес). Это называется горячим кодированием.
В этом отношении мы можем рассматривать эту проблему как проблему классификации с несколькими метками, когда пример помечается как несколько разные вещи. Похожая и более знакомая концепция, заимствованная из компьютерного зрения, - это когда у нас есть изображение, и мы пытаемся обозначить его различными животными, присутствующими на изображении. С другой стороны, мультиклассовая классификация - это когда у нас есть несколько классов, но только одна метка для каждого примера (например, изображение классифицируется только как кошка, только как собака, как лошадь и т. Д.). Перейдем к определению отзыва @ k и точности @ k.

Напоминание @ k определяется как процент отобранных истинных ярлыков, когда мы рекомендуем k ярлыков для каждого примера. Его точное определение:

С другой стороны, точность @ k определяется как процент правильных прогнозов. Его точное определение:

Давайте возьмем пример из медицины (надеюсь, не слишком наглядный), чтобы объяснить различные цели запоминания и точности. Предположим, врач удаляет пациенту металлические, не опасные для жизни имплантаты, которые используются для ускорения восстановления сломанной ноги. Напомним, необходимо удалить как можно больше этих имплантатов. Прецизионность заключается в том, чтобы удалить имплантаты с минимальным количеством попыток. Если врач будет неаккуратен, пациенту могут быть удалены все имплантаты в ходе четырех последовательных операций, что приведет к очень высокому отзыву и очень низкой точности. С другой стороны, минимально инвазивная операция, которая длится всего полчаса, но при этом удаляется только один из имплантатов, приведет к очень низкому отзыву и очень высокой точности. Обе эти ситуации недопустимы. Лучшее из обоих миров - это оптимизация для одной метрики, при которой другая метрика должна быть выше минимально допустимого порога. Об этом мы поговорим позже.

Возвращаясь к определениям отзыва @ k и точности @ k, предположим, что в примере есть три истинных метки, а алгоритм дает 5 рекомендаций. Если две из этих рекомендаций соответствуют истинным меткам, то # of true labels captured = 2, # of true labels = 3 и # of predictions made = 5. Поэтому вспомним @ k = 2/3 = 0,67, точность @ k = 2/5 = 0,4. Для простоты мы будем обозначать # of true labels captured как TP @ k, что известно как истинные положительные результаты @ k. В общем случае batch_size примеров и k рекомендаций на пример # predictions made = batch_size * k. Кроме того, # of true labels будет относиться к общему количеству этикеток в партии. И отзыв, и точность принимают значения от 0 до 1.

Обычно существует обратная связь между отзывом и точностью. Кроме того, существует монотонная взаимосвязь между отзывом @ k и k (количеством рекомендаций на пример), в то время как точность @ k имеет тенденцию к снижению с увеличением k. Монотонность между вызовом @ k и k очень легко показать. Знаменатель в отзыве @ k равен # of true labels, который остается постоянным. Чем больше рекомендаций мы добавляем для каждого примера, тем больше вероятность, что одна из них будет истинной меткой, что приведет к увеличению числителя TP@k. Теперь, когда дело доходит до точности @ k, как числитель (TP@k), так и знаменатель (# predictions made) зависят от добавления новых рекомендаций. Предположим, мы увеличиваем полученный результат до еще одной рекомендации для каждого примера. То есть мы переходим от k к k+1. Какое условие должно выполняться, чтобы точность @ (k + 1) ≥ precision @ k?

TP@(k+1)-TP@k = 1, если рекомендация k+1ᵗʰ истинная метка, и 0, в противном случае. Поскольку, 0 ≤ точность @ k ≤ 1, точность @ (k + 1) ≥ точность @ k тогда и только тогда, когда рекомендация k+1ᵗʰ является истинной меткой. В общем, если мы добавим m новых рекомендаций для каждого примера, мы сможем показать (мы избегаем доказательства здесь, но оно следует той же логике, что и доказательство выше), что точность @ (k + m) ≥ precision @ k , если есть только если

что в основном означает, что точность дополнительных рекомендаций m превышает текущую точность. Вышеприведенное уравнение также показывает, почему точность @ k с большей вероятностью уменьшается с увеличением k. Если в примере есть L истинных меток, и мы уже предсказали некоторые из них, становится все труднее обнаружить оставшиеся метки для каждой добавляемой нами рекомендации. Наконец, давайте приведем пример с TensorFlow, чтобы прояснить это.

Здесь у нас есть только один пример в пакете (мы можем легко обобщить до batch_size примеров), который имеет две истинные метки: 0 и 3. Мы предполагаем, что у нас может быть до 6 меток на пример, что составляет количество столбцов в predictions. Мы попробуем разные значения k (количество рекомендаций в примере) и проверим их влияние на отзыв @ k и точность @ k.
Результатом приведенного выше фрагмента будет:

recall@1 = 0.00, precision@1 = 0.00
recall@2 = 0.00, precision@2 = 0.00
recall@3 = 0.50, precision@3 = 0.33
recall@4 = 0.50, precision@4 = 0.25
recall@5 = 1.00, precision@5 = 0.40

Прогнозируемые метки ранжируются в соответствии с оценкой, определенной в переменной predictions. Метка 1 идет первой с наивысшим баллом (0,50), метка 2 - второй (0,30), метка 0 - третьей (0,10) и так далее. Прогнозируемые метки по убыванию баллов: 1, 2, 0, 4, 3, 5. Когда k = 1, напоминание @ 1 и точность @ 1 равны 0, потому что верхняя предсказанная метка (1) не является одной из истинных меток (0,3). То же самое при k = 2. Когда k = 3, третья верхняя прогнозируемая метка равна 0, что является одной из истинных меток. В этом случае remont@3=1/2=0.5, а precision@3=1/3=0.33. Обратите внимание, что с увеличением k напоминание @ k монотонно возрастает (или, точнее, не может уменьшаться)! При этом точность @ k может повышаться или понижаться в зависимости от актуальности добавленных рекомендаций. Например, когда мы переходим от k = 3 к k = 4, точность @ k уменьшается, но когда мы переходим от k = 4 к k = 5, она увеличивается, поскольку пятая верхняя прогнозируемая метка, которая является меткой 3, является одной из истинные ярлыки. Как показывает практика, напоминание @ k увеличивается, а точность @ k уменьшается вместе с k.

Обеспечение баланса между отзывом @ k и точностью @ k

Возникает естественный вопрос: как сравнить разные модели или определить лучший k на основе точности и полноты. Как пишет Эндрю Нг в своем черновике книги Машинное обучение стремление, более подходящий подход при рассмотрении нескольких критериев оценки состоит в том, чтобы использовать только один в качестве оптимизирующего, а остальные - в качестве удовлетворительных критериев. По сути, это означает выбор модели с наивысшим оптимизирующим показателем, если все удовлетворительные показатели превышают минимум или не превышают максимальный порог. Метрика, которую следует выбрать в качестве оптимизирующей, полностью зависит от задачи. Например, я мог бы предположить, что в Amazon (не верьте мне на слово!) Они будут больше ориентированы на более высокую точность, чем на отзыв. Другими словами, они могут быть больше заинтересованы в предоставлении пользователю короткого списка очень релевантных рекомендаций, которые хорошо отражают некоторые из его потребностей, чем в более длинном, широком (и, возможно, менее целевом) списке. Сравните это с платформой онлайн-обучения, такой как Coursera: если бы у пользователя была возможность рекомендовать курсы для формирования набора навыков (чтобы он мог хорошо пройти собеседование), отзыв может быть более подходящим в качестве оптимизирующего показателя. Например, если бы требовались навыки глубокого обучения, Python и TensorFlow при размещении вакансий в области науки о данных, и я хотел бы расширить свои знания по этим темам, не помешало бы порекомендовать более широкий набор классов, которые более целостным образом охватили бы различные концепции. из этих тем.

Кстати, метрики не обязательно должны иметь чисто математическое понятие. Показателем может быть цена за рекомендацию. В примере с Coursera одним показателем может быть ежемесячная стоимость членства. Если бы они порекомендовали классы, которые увеличивают вероятность того, что пользователь продлит свое ежемесячное членство, не обращая особого внимания на актуальность, это могло бы увеличить неудовлетворенность клиентов. В случае носимых устройств или смартфонов метрикой может быть размер модели или чувствительные ко времени настройки, такие как высокочастотная торговля, время отклика алгоритма и т. Д. Для более подробного объяснения удовлетворительных и оптимизационных показателей, пожалуйста, посмотрите видео ниже.

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

Оценка F1 принимает значения от 0 до 1 точно так же, как отзыв и точность. Он становится 0, когда одно из точности или отзыва равно 0 и 1, когда и точность, и отзыв равны 1. На рисунке ниже вы можете увидеть, как изменяется оценка F1 в отношении точности и отзыва.

Обратите внимание, что когда один из двух показателей (точность, отзыв) работает плохо, оценка F1 также работает плохо (направление с юго-запада на северо-восток на рисунке выше). Когда обе метрики получают более высокие значения, оценка F1 также получает более высокое значение.
Фактически, вы можете установить больший вес для одного из значений: отзыв или точность, в зависимости от того, что более важно для данной задачи. Для этого вы можете использовать обобщенную версию оценки F, называемую оценкой Fᵦ. Формула оценки Fᵦ:

где β - неотрицательное число. Когда β = 1, мы возвращаемся к привычной шкале F1! Значения β намного ниже 1 делают больший упор на точность, а значения β, намного превышающие 1, делают больший упор на отзыв. См., Например, изображение ниже. На левом подграфике мы установили для β очень маленькое значение (β = 0,1), которое почти нивелирует эффект отзыва (цвет контура не меняется по вертикали ось, которая представляет отзыв). С другой стороны, правая часть графика показывает случай, когда β очень велико (β = 4), что существенно нивелирует эффект точности. Фактически, когда β = 0, Fᵦ @ k = точность @ k, а когда β = ∞, Fᵦ @ k = вспомнить @ k.

Для более подробного обсуждения отдельных показателей оценки вы можете посмотреть видео Эндрю Нг ниже.

Средняя точность @ k

Показатели точности @ k и отзыва @ k очень хороши для определения того, актуальны ли наши рекомендации, но не очень хороши для определения того, насколько рано или поздно они появились в списке рекомендаций. Другими словами, они ничего не говорят нам о рейтинге рекомендаций. Например, если мы предоставим два списка по 20 рекомендаций в каждом, где в первом будут релевантны две верхние рекомендации, а во втором списке актуальны две последние рекомендации, оба этих списка приведут к одинаковому отзыву @ k и точность @ k! Очевидно, что первый список гораздо более полезен и действенен, чем второй.

Средняя точность @ k также учитывает ранжирование рекомендаций. Если бы мы дали определение, средняя точность @ k - это среднее значение всех точности в тех местах, где рекомендация становится релевантной (или, другими словами, когда рекомендация является истинно положительной). Сначала мы сконцентрируемся на одном примере, а затем расширим его до группы примеров, чтобы не упустить из виду лес за деревом. Если мы обозначим среднюю точность @ через avgpre @ k, ее формула будет иметь следующий вид:

precision @ j - это точность (для этого примера), когда мы предоставляем j лучших рекомендаций. релевантный @ j равен 1, если рекомендация jᵗʰ релевантна, и 0 в противном случае. Это означает, что релевантный @ j = 1, если верхняя jᵗʰ рекомендация является одним из истинных ярлыков (для этого примера), или, другими словами, a истинно положительный. Вы можете думать о relevant как о 1 x k векторе с единицами в тех местах, где рекомендация является истинно положительной, и 0 в противном случае. avgpre @ k принимает значения от 0 (если нет соответствующих рекомендаций) до 1 (если все рекомендации актуальны).

Поскольку у нас может быть случай, когда в примере меньше меток (L), чем максимальное количество предоставленных рекомендаций (k), вариант формулы, которая позаботится об этом является:

Таким образом, мы не наказываем наш метод за установку значения для k больше, чем L. (Мы знаем, что когда k ›L, у нас не может быть более L релевантных рекомендаций, и поэтому имеет смысл остановить наш поиск на верхних L рекомендации и вместо этого вычислите среднюю точность @ L).

Так как математика mumbo jumbo может сбивать с толку, давайте приведем пример, иллюстрирующий, как вычисляется avgpre @ k. Предположим, что у нас есть L = 3 истинных метки для примера, и мы заинтересованы в вычислении avgpre @ 6 (k = 6). Если в этих шести рекомендациях вторая и шестая релевантны (истинные положительные результаты), avgpre @ 6 будет вычисляться как:

Если мы хотим расширить приведенное выше определение до пакета примеров B, avgpre @ k определяется как среднее значение средней точности @ k в каждом примере (я знаю, что знаю ... слишком много «среднего» происходит здесь):

avgpre @ k (i) определяется точно так же, как avgpre @ k, которое мы определили для единственного примера. Единственное отличие состоит в том, что L в этом случае представляет максимальное количество этикеток на пример в этом пакете.

Если бы вы сделали только один вывод из этого определения, пусть avgpre @ k учитывает не только релевантность списка рекомендаций, но и относительный порядок рекомендаций. Если вам интересно узнать больше о средней точности @ k, вы можете прочитать эту статью: Средняя средняя точность (MAP) для рекомендательных систем.

Вот пример TensorFlow.

Результатом приведенного выше фрагмента является 0.4907. В приведенном выше коде переменная labels представляет истинные метки для пакета примеров. Строка 1 представляет метки для первого примера (1, 0, 4), строка 2 - метки для второго примера (0) и строка 3 - метки для третьего примера (0, 2). Вы заметите, что метка 0 странным образом повторяется три раза во второй строке, а метка 2 - дважды в третьей строке. Это связано с тем, что TensorFlow может поддерживать только тензоры, размеры которых одинаковы во всех примерах. Более новая версия TensorFlow (1.13) может поддерживать рваные тензоры, где тензорные срезы могут иметь разную длину.

К счастью, эта «искусственная» плитка не портит результаты. Если бы мы вычисляли отзыв @ k, TensorFlow все равно вычислял бы # of true labels как 3 + 1 + 2 = 6. Далее мы имеем, что B = 3 (количество строк в переменных labels и predictions). L = 3, поскольку максимальное количество меток на пример в этом пакете равно 3. Мы также хотим вычислить avgpre @ k, когда k = 4, и у нас может быть до 6 меток на пример (это количество столбцов в переменной predictions. ). На следующей диаграмме видно, как именно TensorFlow получает число 0.4907.

На приведенной выше диаграмме мы изображаем разные метки разными цветами для устранения неоднозначности. predicted labels представляют индексы переменной predictions в порядке убывания ее значений. Возьмем пример 1 (строка 1 predictions): метка 1 - это верхняя рекомендация (поскольку она имеет наивысший predictions балл, 0,5), метка 2 - вторая верхняя рекомендация с оценкой 0,3, метка 0 - третья верхняя рекомендация с оценка 0,1 и так далее. Теперь вектор relevant будет установлен в 1 в позиции, где предсказанная метка является истинно положительной, и 0 в противном случае. Возьмем, к примеру, вектор relevant, например 1. Это [1 0 1 1 0 0]. Первый элемент равен 1, потому что предсказанная метка в первой позиции (1) является одной из истинных меток. Второй элемент равен 0, потому что предсказанная метка, равная 2, не является истинной меткой. Третий элемент вектора relevant равен 1, потому что предсказанная метка в этой позиции (0) является одной из истинных меток. (Напоминаем, что истинные метки для примера 1 - 0, 1, 4). точность @ k определяется как процент правильных прогнозов (когда мы даем k рекомендаций). Если вы будете следовать этой логике во всех примерах, вы получите число, указанное в выводе TensorFlow.

Заключение

Рекомендательные системы играют большую роль в нашей повседневной жизни, о чем мы даже не подозреваем. Хорошие рекомендации стимулируют принятие решений, побуждают к действиям и даже помогают формировать мнение. Хорошая система рекомендаций должна быть актуальной и новаторской - достаточно персонализированной, но в то же время проницательной (чтобы дать нам этот момент «ага»)! Для этого нам нужно использовать метрики, которые предлагают объективную оценку результатов рекомендаций. В этом посте мы подробно остановились на показателях, которые проверяют актуальность рекомендаций. Мы говорили об отзыве @ k, точности @ k и необходимости использования единой объективной метрики для сравнения различных моделей. Наконец, мы объяснили концепцию средней точности @ k, которая учитывает не только релевантность, но и относительный порядок соответствующей рекомендации, и предоставили код TensorFlow для всех обсуждаемых показателей.