В прошлой статье мы погрузились в оценку самых популярных AI продуктов.
По итогам ручного тестирования и попытки автоматизации по выбранным критериям был сделан вполне себе ожидаемый вывод о невозможности применения одних и тех же метрик к оценке задач разного рода.
Поэтому было принято решение ознакомиться с основными метриками для оценки качества ответов AI продуктов.
Такими метриками стали: Precision, Recall, Specificity и Confusion matrix, а также MAP и MRR.
Для чего такие метрики нужны?

Precision (точность) - показывает, какой процент ответов, выданных AI как положительные ответы на вопрос, действительно являются положительными.
Для получения максимального результата важно, чтобы ответ не только содержал в себе все верные элементы, но также чтобы не содержал неверных элементов.
где
TP (true positive) - действительно правильные(положительные) ответы
FP (false positive) - ложноположительные ответы.
Чем может быть полезна такая метрика?
С помощью Precision мы можем определить, насколько модель способна разделить ответы на верные и неверные в случае, если получает такое задание.
Давайте рассмотрим один пример.
Допустим, нам нужно понять, насколько хорошо разбирается модель в юридической терминологии.
Задаем вопрос: Что называют реальным ущербом в российском законодательстве?
Ожидаемый ответ: Под реальным ущербом понимаются расходы, которые лицо, чье право нарушено, произвело или должно будет произвести для восстановления нарушенного права, утрата или повреждение его имущества (статья 15 ГК РФ).
Полученный ответ:
В российском законодательстве под реальным ущербом понимаются убытки, которые лицо понесло или которые оно должно понести для восстановления нарушенного права. Это может включать в себя утрату или повреждение имущества, расходы на восстановление имущества или на лечение в случае причинения вреда здоровью, а также упущенную выгоду.
Вот несколько примеров:
1. Утрата имущества: например, если в результате противоправного действия у лица было украдено или уничтожено имущество.
2. Расходы на восстановление: например, затраты на ремонт автомобиля после ДТП, произошедшего по вине другого лица.
3. Расходы на лечение: например, медицинские затраты в результате причинения вреда здоровью.
Интересует что-то конкретное по этой теме?
Как видно из ответа, под реальным ущербом модель понимает не только утрату или повреждение имущества, расходы на восстановление имущества или на лечение в случае причинения вреда здоровью, но и упущенную выгоду.
Если мы посмотрим на текст статьи 15 ГК РФ, то увидим, что упущенная выгода и реальный ущерб являются самостоятельными видами убытков и не могут быть составляющими друг друга.
Поэтому такой ответ модели нельзя считать действительно правильным, хоть он и содержит основные атрибуты понятия реальный ущерб.
Метрика precision будет рассчитана следующим образом:

Recall (полнота) - показывает, какой процент от общего числа положительных ответов был выдан моделью при ответе на вопрос.
Важно отметить, что ложноположительные ответы этой метрикой не учитываются.
, где
TP (true positive) - количество действительно положительных ответов;
FN (false negative) - количество ложноотрицательных ответов.
Как использовать такую метрику с пользой для себя?
С помощью такой метрики мы можем понять, способна ли модель привести все интересующие нас элементы из заданной выборки, полностью соответствовать ожиданиям пользователя или нет.
Давайте рассмотрим примеры и для этой метрики.
Ради интереса подсчитаем метрику recall при ответе на вопрос про принадлежность составляющих реальному ущербу.
Поскольку метрика считает только количество выданных моделью правильных ответов от общего числа правильных ответов, значение такой метрики будет равно 1.
Рассмотрим еще один пример.
Вопрос: Помоги мне выучить испанский: составь 10 предложений с глаголами в прошедшем времени.
Вопрос задан довольно широко. Предполагается, что большая часть вопросов от пользователей будут без серьезных уточнений. Хоть сам вопрос такого указания напрямую не содержит, сама его постановка явно свидетельствует о том, что пользователь только приступил к изучению языка и еще может не знать перевода большого количества слов (“помоги мне выучить испанский”).
Поэтому таким вопросом проверяем, сможет ли модель привести еще и перевод с испанского на 10 составленных предложений, даже при отсутствии прямого указания на это.
Ожидаемый ответ:
Список из 10 предложений на испанском с глаголами в прошедшем времени.
Список из 10 предложений с переводом с испанского языка на язык, на котором задавался вопрос.
Действительный ответ:
Claro, aquí tienes 10 frases en español con verbos en el tiempo pasado (pretérito):
1. Ayer fui al cine con mis amigos.
2. Ellos comieron en un restaurante italiano la semana pasada.
3. María leyó un libro muy interesante el mes pasado.
4. Nosotros visitamos a nuestros abuelos el fin de semana pasado.
5. Tú escribiste una carta a tu profesor el lunes.
6. Él compró un coche nuevo hace dos días.
7. Yo viajé a España el verano pasado.
8. Vosotros jugasteis al fútbol en el parque ayer.
9. Los niños durmieron durante toda la tarde.
10. Ana y Pedro bailaron toda la noche en la fiesta.
¡Espero que esto te ayude a practicar! Si necesitas más примеры o tienes вопросы, házmelo saber. ¡Buena suerte con tu aprendizaje de español!
В таком виде ответ создаст дополнительные сложности для пользователя с необходимостью искать перевод предложений и потом постоянно переходить из одного окна в другое для сверки предложений и их перевода, что влечет за собой формирование негативного опыта использования AI модели.
Таким образом, поскольку удовлетворен только 1 критерий ожидаемого ответа, параметр полноты составляет 0,5.

Specificity (специфичность) - показывает процент выданных AI моделью правильных отрицательных ответов от общего числа правильных отрицательных и ложноположительных ответов на определенный вопрос.
, где
TN (true negative) - количество действительно отрицательных ответов;
FP (false positive) - количество ложноположительных ответов.
Как использовать такую метрику с пользой для себя?
С помощью такой метрики мы можем понять, способна ли модель верно определять отрицательные ответы.
Для этой метрики рассмотрим следующий пример:
Вопрос: У меня есть список стран: Россия, Польша, Великобритания, Азербайджан, США. в каких из этих стран проходят этапы формулы 1 в 2025 году?
Ожидаемый ответ: в 2025 году проходят этапы формулы 1 в США, Великобритании, Азербайджане, а не проходят в России и Польше.
Ответ модели:
В 2025 году этапы Формулы 1 запланированы в следующих странах из вашего списка:
1. Россия — этапы могут проходить, но это зависит от конкретных решений и соглашений на 2025 год.
2. Польша — на данный момент не имеет запланированных этапов Формулы 1.
3. Великобритания — этапы Формулы 1 проходят на трассе Сильверстоун.
4. Азербайджан — этапы Формулы 1 проходят на трассе в Баку.
5. США — этапы Формулы 1 проходят на разных трассах, включая Остин и Майами.
Таким образом, в 2025 году этапы Формулы 1 запланированы в России, Великобритании, Азербайджане и США.
Верно указана как не являющаяся этапом формулы 1 Польша, но есть и ложноположительный ответ Россия.
Поэтому значение метрики равно:
Итак, мы уже выяснили, как именно тестировать ответы AI моделей на предмет выдачи действительно положительных или действительно отрицательных, а также ложноположительных и ложноотрицательных ответов.
Но что делать, если нам хочется проверить, насколько велика точность ответов в выданной выборке или насколько высоко в выборке располагаются релевантные ответы по сравнению с нерелевантными.
Здесь нам помогут следующие метрики:
MAP(Mean Average Precision) - показывает, насколько релевантными являются результаты, которые модель предлагает в ответ на запросы. MAP используется для измерения средней точности (precision) найденных релевантных ответов для множества запросов.
Например, если для первого запроса релевантные ответы на 1 и 3 месте, то подсчет AP (average precision) будет таким:
для 1 релевантного ответа: 1/1 = 1 (один из одного релевантного ответа)
для 2 релевантного ответа на 3 строке: ⅔ = 0,67 (два релевантных ответа на третьей строке)
Приведем пример:
Вопрос: Перечисли планеты солнечной системы в порядке убывания массы.
Ожидаемый ответ:
1. Юпитер
2. Сатурн
3. Нептун
4. Уран
5. Земля
6. Венера
7. Марс
8. Меркурий
Полученный от модели ответ:
1. Юпитер
2. Сатурн
3. Нептун
4. Уран
5. Земля
6. Венера
7. Марс
8. Меркурий
Порядок подсчета:
Релевантный результат на 1 месте: Precision = 1
Релевантный результат на 2 месте: Precision = 1
Релевантный результат на 3 месте: Precision = 1
Релевантный результат на 4 месте: Precision = 1
Релевантный результат на 5 месте: Precision = 1
Релевантный результат на 6 месте: Precision = 1
Релевантный результат на 7 месте: Precision = 1
Релевантный результат на 8 месте: Precision = 1
Релевантный результат на 9 месте: Precision = 1
Релевантный результат на 10 месте: Precision = 1
Теперь возьмем ответ на вопрос, где есть, на наш взгляд, нерелевантные ответы:
Вопрос: Составь по годам хронологию появления электрического освещения в странах начиная с самого раннего.
Ожидаемый ответ:
1809 год
1870-е годы
1878 год
1879 год
1881 год США
1881 год Великобритания
1882 год Россия
1882 год Германия
1885 год
1886 год
Полученный от модели ответ:
История электрического освещения началась в начале XIX века, но широкое распространение оно получило лишь во второй половине столетия. Вот хронология основных событий:
* 1802 год: Русский учёный Василий Петров открыл эффект электрической дуги, что стало основой для первых электрических ламп.
* 1809 год: Английский химик Хэмфри Дэви продемонстрировал дуговую лампу в Королевском обществе в Лондоне.
* 1870-е годы: Появление «электрической свечи Яблочкова», изобретённой русским инженером Павлом Яблочковым. Это изобретение сделало электрическое освещение более практичным и доступным.
* 1878 год: В Париже на площади Опера установили дуговые лампы Яблочкова, и город стал первым в мире, где улицы освещались электричеством.
* 1879 год: Томас Эдисон изобрёл лампу накаливания с угольной нитью, что стало важным шагом в развитии электрического освещения.
* 1882 год: В Нью-Йорке была запущена первая центральная электростанция Эдисона, что позволило обеспечить электрическим освещением целые районы города.
* 1900 год: На Всемирной выставке в Париже были представлены лампы накаливания Лодыгина с металлической нитью.
* 1910-е годы: Широкое распространение получили лампы с вольфрамовой нитью, которые были более эффективными и долговечными.
Таким образом, электрическое освещение начало появляться в разных странах в конце XIX - начале XX века, начиная с крупных городов Европы и США.
Здесь открытие эффекта электрической дуги не является релевантным ответом на вопрос о появлении освещения. Также последние две даты связаны с модификациями ламп накаливания, что также не является релевантным ответом на поставленный вопрос. Все остальные ответы посчитаем релевантными вопросу.
Подсчет результата:
Нерелевантный результат
Релевантный результат на 2 месте: Precision = ½ = 0,5
Релевантный результат на 3 месте: Precision = ⅔ = 0,67
Релевантный результат на 4 месте: Precision = ¾ = 0,75
Релевантный результат на 5 месте: Precision = ⅘ = 0,8
Релевантный результат на 6 месте: Precision = ⅚ = 0,83
Нерелевантный результат
Нерелевантный результат
Для двух указанных выше примеров метрика MAP будет равна:
Для формирования вывода по итогам подсчета метрики необходимо заранее определить, какой уровень средней точности вам необходим при работе вашей AI модели.
MRR (Mean Reciprocal Rank) призвана показать, насколько высоко в списке результатов модель располагает правильные ответы, что позволяет оценить ее эффективность в решении задач поиска и рекомендаций.
Когда нам требуется проверить качество поиска, выдачу рекомендаций или выполнение иных задач с извлечением информации, метрика MRR представляется наиболее оптимальным вариантом для применения.
Рассчитывается метрика следующим образом:
, где RR - отношение местонахождения в выдаче модели ожидаемого правильного ответа к 1.
RR = 1/rank
rank - место в выдаче ожидаемого правильного ответа.
Вычисление ранга (RR). Для каждого запроса определяется ранг первого правильного ответа в списке предсказанных результатов. Если правильный ответ находится на первом месте, ранг равен 1. Если на втором, то ранг равен 1/2, на третьем – 1/3, и так далее.
Рассмотрим пример.
Напиши топ 10 лучших бомбардиров в порядке убывания.
Ожидаемый ответ на 1 месте списка: Пеле (в данном случае есть информация о более 1000 забитых голов за карьеру в Бразилии в Сантосе. Было множество товарищеских матчей)
Полученный от модели ответ:
Топ-10 лучших бомбардиров в истории футбола (по состоянию на ноябрь 2023 года):
1. Криштиану Роналду (Португалия) — 873 гола
2. Лионель Месси (Аргентина) — 819 голов
3. Йозеф Бицан (Австрия/Чехословакия) — 805 голов
4. Ромарио (Бразилия) — 772 гола
5. Пеле (Бразилия) — 757 голов
6. Ференц Пушкаш (Венгрия/Испания) — 746 голов
7. Герд Мюллер (Германия) — 735 голов
8. Ференц Деак (Венгрия) — 576 голов
9. Уве Зеелер (Германия) — 575 голов
10. Тулио Марвилиа (Бразилия) — 575 голов
Ожидаемый первый ответ находится на 5 месте в выдаче.
Поэтому показатель RR равен ⅕ или 0,2.
Такое значение показателя связано с тем, что AI модель формирует выдачу на основе данных FIFA по количеству забитых футболистами голов в официальных подтвержденных матчах.
Пеле за свою карьеру провел множество товарищеских матчей, и забитые в этих играх мячи в такую статистику FIFA не входят.
Рассмотрим еще один пример.
Вопрос: Составь по годам хронологию появления электрического освещения в странах начиная с самого раннего
Ожидаемый ответ на 1 месте в выдаче: 1809.
Как видно из приведенного выше ответа модели, ожидаемый первый ответ находится на 2 месте в выдаче.
Поэтому показатель RR равен ½ или 0,5.
Причина такого положения ответа в выдаче в том, что модель считает началом отсчета момент открытия эффекта электрической дуги.
Не являясь специалистом в этой сфере, все же, предположу, что открытие самого эффекта еще не означает его реализации в готовую продукцию. Поэтому в качестве ожидаемого первого ответа выбран 1809 год. Будем для нашего примера считать именно этот год искомым.
Давайте рассчитаем MRR:
Таким образом, за счет таких метрик, как MAP и MRR, можно эффективно производить измерение средней точности и ранжирования верных ответов в решении задач поиска и рекомендаций.
Проверки по указанным выше метрикам можно использовать при автоматизации тестирования ответов моделей.
Например, библиотека scikit-learn в Python содержит часть указанных выше и многие другие метрики для оценки качества ответов моделей.
В частности, для расчета метрики precision можно использовать precision_score, принимающую два аргумента: реальные значения, предсказанные значения.
В качестве примера давайте возьмем пример с ответом модели на вопрос о том, что является реальным ущербом в российском законодательстве.
Допустим, у нас список из потенциальных составляющих понятия “реальный ущерб”:
Terms = [
"утрата имущества",
"повреждение его имущества",
(
"расходы, которые лицо, чье право нарушено, произвело "
"или должно будет произвести для восстановления нарушенного права"
),
"упущенная выгода"
]
Если какой-то термин относится к определению реального ущерба, то обозначаем этот термин цифрой 1, если нет - обозначаем такой термин как 0.
По предсказанным ответам выходит следующее:
Predicted_labels = [1, 1, 1, 1]
Реальные ответы должны быть такие:
True_labels = [1, 1, 1, 0]
Далее передаем эти значения в формулу для расчета precision score и получаем такой же результат, как и при расчете вручную.
Вот пример функции для расчета precision:
from sklearn.metrics import precision_score
def precision(true_labels, predicted_labels):
# Вычисление метрики Precision
precision = precision_score(true_labels, predicted_labels)
return precision
Для расчета метрики recall можно воспользоваться recall_score. Алгоритм расчета будет тот же, и, поскольку для таких данных все верные ответы в списке, выданном моделью, присутствуют, результат расчета будет 1, что также совпадает с ручным расчетом.
Вот пример расчета метрики recall:
from sklearn.metrics import recall_score
def recall(true_labels, predicted_labels):
recall = recall_score(true_labels, predicted_labels)
# Вычисление recall
recall = recall_score(true_labels, predicted_labels)
return recall
Для расчета specificity можно использовать данные из confusion matrix.
Confusion Matrix (Матрица Ошибок) — это таблица, которая используется для оценки качества классификаторов и моделей машинного обучения. Она показывает, насколько точны предсказания модели по сравнению с реальными метками, и помогает выявить, где модель делает ошибки. Матрица ошибок состоит из четырех основных компонентов:
1. True Positive (TP): Количество правильных положительных предсказаний (модель правильно классифицировала положительный случай).
2. False Positive (FP): Количество ложноположительных предсказаний (модель ошибочно классифицировала отрицательный случай как положительный).
3. True Negative (TN): Количество правильных отрицательных предсказаний (модель правильно классифицировала отрицательный случай).
4. False Negative (FN): Количество ложноотрицательных предсказаний (модель ошибочно классифицировала положительный случай как отрицательный).
Predicted Positive |
Predicted Negative |
|
Actual Positive |
True Positive |
False Negative |
Actual Negative |
False Positive |
True Negative |
В свою очередь, собранные таким образом данные можно использовать впоследствии для более детального изучения статистики.
В Python реализовать confusion matrix можно вот таким образом:
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
def calculate_confusion_matrix(true_labels, predicted_labels):
# Расчет матрицы ошибок
conf_matrix = confusion_matrix(true_labels, predicted_labels)
unique_answers = ['Класс 1', 'Класс 0']
print("Матрица ошибок:")
print(conf_matrix)
# Вывод отчета по классификации
class_report = classification_report(true_labels, predicted_labels, target_names=unique_answers)
print("\nОтчет по классификации:")
print(class_report)
В свою очередь, для расчета specificity можно использовать confusion matrix:
from sklearn.metrics import confusion_matrix
def specificity(true_labels, predicted_labels):
# Вычисление матрицы ошибок (confusion matrix)
cm = confusion_matrix(true_labels, predicted_labels)
# Извлечение элементов матрицы ошибок
TN = cm[0, 0] # True Negative
FP = cm[0, 1] # False Positive
FN = cm[1, 0] # False Negative
TP = cm[1, 1] # True Positive
# Вычисление специфичности
specificity = TN / (TN + FP)
return specificity
Библиотека scikit-learn не содержит реализации MRR и MAP, но функции для вычисления таких метрик можно написать самостоятельно.
Собрав все основные метрики, мы уже можем собирать более-менее содержательную информацию об ответах моделей.
Но тут неизбежно возникает вопрос: все ли это возможности по проверке ответов?
Об этом в следующей статье.
Maslukhin
Ребята, учитывая, что это ваши первые статьи на Хабре, позвольте дать совет - не надо делить одну, пусть и большую, статью так мелко. Я бы еще понял, подели вы их на 2 части, поморщился, но понял.
Но такое деление как сейчас, не интригует, а раздражает. Это же не сериал. Первая часть - была довольно краткая. Эта - имеет малую ценность без результатов
EZlogic Автор
Добрый день!
Большое спасибо за ваш комментарий.
Действительно, это первые статьи на Хабре, и пока нет четкого представления о принятых размерах статей.
Постараюсь скорректировать подход с учетом замечаний.