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

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

Составляя этот материал, мы хотели поделиться своим опытом использования различных метрик для оценки ответов AI моделей. Для тех из них, которые мы не смогли полноценно использовать в ходе своих исследований, мы подготовили описание с практическими примерами.

Все метрики мы разбили на условные категории:

  1. Метрики, определяющие качество итоговых ответов.

  2. Метрики, вычисляющие степень сходства ответов.

  3. Метрики, определяющие качество текста.

  4. Метрики, использующие вероятности предсказания.

Метрики, определяющие качество итоговых ответов

Самые основные метрики мы уже описали в предыдущей статье.

Здесь дополним их модификациями и некоторыми новыми метриками.

F-Beta Score

F-Beta Score используется для оценки качества классификационной модели, особенно когда важен баланс между точностью (precision) и полнотой (recall). F-Beta Score учитывает, насколько хорошо модель классифицирует примеры, и позволяет настроить вес, придаваемый точности или полноте, в зависимости от задачи.

Формула F-Beta Score

F-Beta Score — это обобщение метрики F1-Score. Она вычисляется следующим образом:

F_\beta = \frac{(1 + \beta^2) \cdot \text{precision} \cdot \text{recall}}{(\beta^2 \cdot \text{precision}) + \text{recall}}

где:

- precision — это точность (доля правильных положительных предсказаний ко всем предсказанным положительным).

- recall — это полнота (доля правильных положительных предсказаний ко всем фактическим положительным).

- beta — параметр, который позволяет настроить относительный вклад точности и полноты.
Если beta = 1, это эквивалентно F1-Score.
Если beta > 1, большее внимание уделяется полноте.
Если beta < 1, большее внимание уделяется точности.

Допустим, у нас есть 5 вопросов и ожидаемых ответов AI модели на определенный вопрос:

  1. Вопрос: у меня есть вот такой перечень понятий: расходы на восстановление права, утрата имущества, порча имущества, упущенная выгода. напиши, какие из этих понятий относятся к определению реального ущерба в Российском законодательстве, а какие нет.

    Ожидаемый ответ: К реальному ущербу относятся расходы на восстановление права, утрата имущества, порча имущества; не относится - упущенная выгода.

  2. Вопрос: у меня есть список стран: Россия, Польша, Великобритания, Азербайджан, США. в каких из этих стран проходят этапы формулы 1 в 2025 году?

    Ожидаемый ответ: в 2025 году проходят этапы формулы 1 в США, Великобритании, Азербайджане, а не проходят в России и Польше.

  3. Вопрос: кого должен вызвать собственник припаркованного во дворе автомобиля, чтобы зафиксировать ущерб от падения на свой автомобиль снега с крыши дома: ГИБДД, участкового или МЧС?

    Ожидаемый ответ: Собственник должен вызвать участкового. Вызывать ГИБДД и МЧС не нужно.

  4. Вопрос: какие из этого списка цветов есть в радуге, а какие нет: голубой, черный, белый, зеленый, желтый?

    Ожидаемый ответ:
    в радуге есть голубой, зеленый и желтый цвета, а нет черного и белого цветов.

  5. Какая комбинация карт в покере считается старше: флеш или фулл хаус

    Ожидаемый ответ: фулл-хаус старше флеша.

Теперь давайте посмотрим на ответы AI модели.

  1. Привет! В соответствии с российским законодательством, определение реального ущерба включает в себя следующие понятия:

    1. Расходы на восстановление права — относятся к реальному ущербу, так как это затраты, которые лицо несет для восстановления своих прав.

    2. Утрата имущества — также относится к реальному ущербу, так как это потеря активов, что влечет за собой убытки.

    3. Порча имущества — относится к реальному ущербу, поскольку это ущерб, причиненный имуществу, который требует восстановления.

    4. Упущенная выгода — не относится к реальному ущербу. Это косвенные убытки, связанные с возможными доходами, которые не были получены из-за повреждения или утраты имущества.

    Таким образом, первые три понятия относятся к реальному ущербу, а упущенная выгода — нет.

    В этом ответе упущенная выгода верно указана как не относящаяся к определению реального ущерба.

  2. В 2025 году этапы Формулы 1 запланированы в следующих странах из вашего списка:

    1. Россия — этапы могут проходить, но это зависит от конкретных решений и соглашений на 2025 год.

    2. Польша — на данный момент не имеет запланированных этапов Формулы 1.

    3. Великобритания — этапы Формулы 1 проходят на трассе Сильверстоун.

    4. Азербайджан — этапы Формулы 1 проходят на трассе в Баку.

    5. США — этапы Формулы 1 проходят на разных трассах, включая Остин и Майами.

    Таким образом, в 2025 году этапы Формулы 1 запланированы в России, Великобритании, Азербайджане и США.

    Верно указана как не являющаяся этапом формулы 1 Польша, но есть и ложноположительный ответ Россия

  3. В случае падения снега с крыши дома на припаркованный автомобиль собственник должен вызвать участкового или ГИБДД

    • ГИБДД может зафиксировать происшествие, если это связано с повреждением имущества.

    • Участковый также может составить акт о происшествии и зафиксировать ущерб.

    • МЧС в данном случае не требуется, так как их функции не включают фиксацию ущерба от падения снега. Поэтому наиболее подходящие варианты — это вызов ГИБДД или участкового.

    В ответе верно указан не являющийся правильным ответ “МЧС”. 

    Также указан ложноположительный ответ “ГИБДД”.

    Участковый назван одним из положительных ответов, что согласуется с ожидаемым ответом.

  4. В радуге присутствуют следующие цвета из вашего списка:

    • Голубой — да, он входит в спектр радуги.

    • Зеленый — да, он также есть в радуге.

    • Желтый — да, этот цвет тоже присутствует.

    Цвета, которых нет в радуге:

    • Черный — нет.

    • Белый — нет.

    Таким образом, в радуге есть голубой, зеленый и желтый, а черный и белый отсутствуют.

    Все действительно отрицательные ответы указаны верно. Ложноположительных ответов нет.

  5. В покере фулл хаус считается старше, чем флеш

    • Флеш — это комбинация из пяти карт одной масти, но не по порядку.

    • Фулл хаус — это комбинация из трех карт одного ранга и двух карт другого ранга.

    При сравнении этих двух комбинаций фулл хаус всегда выигрывает у флеша.

    Действительно отрицательный ответ флеш дан верно.

    Действительно положительный ответ также указан верно.

Вычислим точность и полноту:

\text{Precision} = \frac{10}{10 + 2} = \frac{10}{12} \approx 0.83\text{Recall} = \frac{10}{10 + 1} = \frac{10}{11} \approx 0.91

Теперь возьмем значение =0,5 и вычислим показатель F-Beta-score:

F_{0.5} = \frac{(1 + 0.5^2) \cdot Precision \cdot Recall}{(0.5^2 \cdot Precision) + Recall}== \frac{1.25 \cdot Precision \cdot Recall}{0.25 \cdot Precision + Recall}F_{0.5} = \frac{1.25 \cdot 0.83 \cdot 0.91}{0.25 \cdot 0.83 + 0.91}=\frac{0.9441}{1.1175} \approx 0.8447

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from sklearn.metrics import fbeta_score


def calculate_fbeta_score(true_labels, predicted_labels, beta):
    # Расчет метрики F-бета
    fbeta = fbeta_score(true_labels, predicted_labels, beta=beta, average='binary')

    print(f'F-бета Score (β={beta}): {fbeta:.2f}')
Matthews Correlation Coefficient (MCC)

Matthews Correlation Coefficient (MCC) - это метрика, которая используется для оценки качества бинарной классификации. Она учитывает все четыре возможных исхода предсказаний: True Positives (TP), True Negatives (TN), False Positives (FP), и False Negatives (FN).

МCC помогает понять, насколько хорошо модель справляется с классификацией, учитывая не только правильные предсказания, но и ошибки. Значения MCC лежат в диапазоне от -1 до 1:

  • 1: Идеальная классификация (все предсказания правильные)

  • 0: Предсказания не лучше случайного угадывания.

  • -1: Все предсказания неверные.

Формула MCC

\text{MCC} = \frac{TP \cdot TN - FP \cdot FN}{\sqrt{(TP + FP)(TP + FN)(TN + FP)(TN + FN)}}

где

TP - действительно положительные ответы
TN - действительно отрицательные ответы
FP - ложноположительные ответы
FN - ложноотрицательные ответы

Допустим, у нас есть 5 вопросов и ожидаемых ответов AI модели на определенный вопрос:

  1. Вопрос: у меня есть вот такой перечень понятий: расходы на восстановление права, утрата имущества, порча имущества, упущенная выгода. напиши, какие из этих понятий относятся к определению реального ущерба в Российском законодательстве, а какие нет.

    Ожидаемый ответ: К реальному ущербу относятся расходы на восстановление права, утрата имущества, порча имущества; не относится - упущенная выгода.

  2. Вопрос: у меня есть список стран: Россия, Польша, Великобритания, Азербайджан, США. в каких из этих стран проходят этапы формулы 1 в 2025 году?

    Ожидаемый ответ: в 2025 году проходят этапы формулы 1 в США, Великобритании, Азербайджане, а не проходят в России и Польше.

  3. Вопрос: кого должен вызвать собственник припаркованного во дворе автомобиля, чтобы зафиксировать ущерб от падения на свой автомобиль снега с крыши дома: ГИБДД, участкового или МЧС?

    Ожидаемый ответ: Собственника должен вызвать участкового. Вызывать ГИБДД и МЧС не нужно.

  4. Вопрос: какие из этого списка цветов есть в радуге, а какие нет: голубой, черный, белый, зеленый, желтый?

    Ожидаемый ответ:
    в радуге есть голубой, зеленый и желтый цвета, а нет черного и белого цветов.

  5. Какая комбинация карт в покере считается старше: флеш или фулл хаус?

    Ожидаемый ответ: фулл-хаус старше флеша.

Теперь давайте посмотрим на ответы AI модели.

  1. Привет! В соответствии с российским законодательством, определение реального ущерба включает в себя следующие понятия:

    1. Расходы на восстановление права — относятся к реальному ущербу, так как это затраты, которые лицо несет для восстановления своих прав.

    2. Утрата имущества — также относится к реальному ущербу, так как это потеря активов, что влечет за собой убытки.

    3. Порча имущества — относится к реальному ущербу, поскольку это ущерб, причиненный имуществу, который требует восстановления.

    4. Упущенная выгода — не относится к реальному ущербу. Это косвенные убытки, связанные с возможными доходами, которые не были получены из-за повреждения или утраты имущества.

    Таким образом, первые три понятия относятся к реальному ущербу, а упущенная выгода — нет.

    В этом ответе упущенная выгода верно указана как не относящаяся к определению реального ущерба.

    \text{MCC} =  \frac{3 \cdot 1 - 0 \cdot 0}{\sqrt{(3 + 0)(3 + 0)(1 + 0)(1 + 0)}} = \frac{3 - 0}{\sqrt{3 \cdot 3 \cdot 1 \cdot 1}} = \frac{3}{\sqrt{9}} = \frac{3}{3} = 1

  2. КВ 2025 году этапы Формулы 1 запланированы в следующих странах из вашего списка:

    1. Россия — этапы могут проходить, но это зависит от конкретных решений и соглашений на 2025 год.

    2. Польша — на данный момент не имеет запланированных этапов Формулы 1.

    3. Великобритания — этапы Формулы 1 проходят на трассе Сильверстоун.

    4. Азербайджан — этапы Формулы 1 проходят на трассе в Баку.

    5. США — этапы Формулы 1 проходят на разных трассах, включая Остин и Майами.

    Таким образом, в 2025 году этапы Формулы 1 запланированы в России, Великобритании, Азербайджане и США.

    Верно указана как не являющаяся этапом формулы 1 Польша, но есть и ложноположительный ответ Россия

    \text{MCC} = \frac{3 \cdot 1 - 1 \cdot 0}{\sqrt{(3 + 1)(3 + 0)(1 + 1)(1 + 0)}} = \frac{3 - 0}{\sqrt{4 \cdot 3 \cdot 2 \cdot 1}} = \frac{3}{\sqrt{24}} \approx \frac{3}{4.89} \approx 0.61

    Тут модель, в целом, верно оценивает варианты, но есть куда улучшать показатели.

  3. В случае падения снега с крыши дома на припаркованный автомобиль собственник должен вызвать участкового или ГИБДД

    • ГИБДД может зафиксировать происшествие, если это связано с повреждением имущества.

    • Участковый также может составить акт о происшествии и зафиксировать ущерб.

    • МЧС в данном случае не требуется, так как их функции не включают фиксацию ущерба от падения снега. Поэтому наиболее подходящие варианты — это вызов ГИБДД или участкового.

    В ответе верно указан не являющийся верным ответ МЧС. 

    \text{MCC} = \frac{1 \cdot 1 - 1 \cdot 0}{\sqrt{(1 + 1)(1 + 0)(1 + 1)(1 + 0)}} = \frac{1 - 0}{\sqrt{2 \cdot 1 \cdot 2 \cdot 1}} = \frac{1}{2} = 0.5

    При ответе на такой вопрос модель становится видно, что модель не обладает необходимой информацией и пытается угадать верный вариант на основе имеющихся у нее данных.

  4. В радуге присутствуют следующие цвета из вашего списка:
    -
    Голубой — да, он входит в спектр радуги.
    -
    Зеленый — да, он также есть в радуге.
    -
    Желтый — да, этот цвет тоже присутствует.

    Цвета, которых нет в радуге:
    -
    Черный — нет.
    -
    Белый — нет.

    Таким образом, в радуге есть голубой, зеленый и желтый, а черный и белый отсутствуют.

    Все действительно отрицательные ответы указаны верно. Ложноположительных ответов нет.

    \text{MCC} = \frac{3 \cdot 2 - 0 \cdot 0}{\sqrt{(3 + 0)(3 + 0)(2 + 0)(2 + 0)}} = \frac{6 - 0}{\sqrt{3 \cdot 3 \cdot 2 \cdot 2}} = \frac{6}{\sqrt{36}} = 1

  5. КВ покере фулл хаус считается старше, чем флеш

    - Флеш — это комбинация из пяти карт одной масти, но не по порядку.

    - Фулл хаус — это комбинация из трех карт одного ранга и двух карт другого ранга.

    При сравнении этих двух комбинаций фулл хаус всегда выигрывает у флеша.

    \text{MCC} = \frac{1 \cdot 1 - 0 \cdot 0}{\sqrt{(1 + 0)(1 + 0)(1 + 0)(1 + 0)}} = \frac{1 - 0}{\sqrt{1 \cdot 1 \cdot 1 \cdot 1}} = \frac{1}{\sqrt{1}} = 1

Средний показатель показателя MCC для 5 ответов составляет:

\text{MCC}_{\text{ср}} = \frac{1 + 0{,}61 + 0 + 1 + 1}{5} = \frac{3{,}61}{5} = 0{,}722

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from sklearn.metrics import matthews_corrcoef


def mcc(true_labels, predicted_labels):

    # Вычисление MCC
    mcc = matthews_corrcoef(true_labels, predicted_labels)
    print("Matthews Correlation Coefficient (MCC):", mcc)
Precision at Fixed Recall

Precision at Fixed Recall — это метрика, которая используется для оценки качества классификационных моделей, особенно в задачах бинарной классификации. Эта метрика измеряет точность (precision) модели при заданном уровне полноты (recall). 

Простое объяснение

Точность показывает, какая доля предсказанных положительных примеров действительно является положительными. Полнота показывает, какая доля фактических положительных примеров была правильно предсказана моделью. Метрика "Precision at Fixed Recall" помогает оценить, насколько модель точна при определенном уровне полноты.

Сделаем параметр Recall = 0.8

Допустим, у нас есть пять вопросов к AI модели для определения точности ее ответов.

  1. Вопрос: Что называют реальным ущербом в российском законодательстве?

    Ожидаемый ответ: Под реальным ущербом понимаются расходы, которые лицо, чье право нарушено, произвело или должно будет произвести для восстановления нарушенного права, утрата или повреждение его имущества (статья 15 ГК РФ).

  2. Вопрос: Почему в песне группы "Король и Шут" "Камнем по голове" путник не был веселым на празднике?

    Ожидаемый ответ: Потому что ему на голову упал камень.

  3. Вопрос: Напиши какие ингредиенты входят в состав коктейля Б-52 и в какой последовательности они должны использоваться для приготовления коктейля

    Ожидаемый ответ: Количество и последовательность ингредиентов (в качестве примера возьмем наиболее популярный рецепт приготовления коктейля):

    1. Кофейный ликер

    2. Кремовый ликер

    3. Апельсиновый ликер

  4. Почему машина Кристина в одноименной книге Стивена Кинга убивала людей?

    Ожидаемый ответ:
    1. Машина пропитана злым духом предыдущего владельца
    2. Сверхъестественные способности машины
    3. Трансформация характера нынешнего владельца
    4. Личные обиды машины, мстительность
    5. Ревность машины, желание защитить владельца

  5. Кто написал песню the man who sold the world?

    Ожидаемый ответ: Дэвид Боуи

Теперь давайте посмотрим на ответы AI модели.

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

    Вот несколько примеров:

    1. Утрата имущества: например, если в результате противоправного действия у лица было украдено или уничтожено имущество.

    2. Расходы на восстановление: например, затраты на ремонт автомобиля после ДТП, произошедшего по вине другого лица.

    3. Расходы на лечение: например, медицинские затраты в результате причинения вреда здоровью.

    Интересует что-то конкретное по этой теме?

    Как видно из ответа, под реальным ущербом модель понимает не только утрату или повреждение имущества, расходы на восстановление имущества или на лечение в случае причинения вреда здоровью, но и упущенную выгоду, что является ложноположительным ответом.

    \text{Precision} = \frac{TP}{TP + FP}=\frac{3}{3 + 1} = \frac{3}{4} = 0{,}75

  2. В песне "Камнем по голове" группы "Король и Шут" путник оказался не веселым на празднике потому, что он был обманут и подвергся жестокому нападению. Путник рассчитывал найти гостеприимство и радушие, но вместо этого столкнулся с обманом и насилием. Эта песня отражает темную сторону человеческой натуры и то, как люди могут оказаться в неприятных и даже опасных ситуациях.

    Музыка и тексты группы "Король и Шут" часто наполнены мрачными и мистическими сюжетами, которые заставляют слушателей задуматься о сложностях жизни и человеческих взаимоотношений. Хотите узнать больше об этой или других песнях группы?

    Ответ явно не совпадает с ожидаемым.

    Параметр Recall в этом случае равен 0. Поэтому ответ на этот вопрос не учитывается в расчете точности.

  3. Коктейль Б-52 состоит из трех основных ингредиентов, которые укладываются слоями:

    1. Кофейный ликер (например, Kahlúa) - первый слой.

    2. Ирландский крем (например, Baileys) - второй слой.

    3. Апельсиновый ликер (например, Grand Marnier или Cointreau) - третий слой.

    Для приготовления коктейля Б-52 нужно аккуратно наливать каждый слой по лезвию ножа или по обратной стороне ложки, чтобы слои не смешивались. Начинают с кофейного ликера, затем добавляют ирландский крем и завершают апельсиновым ликером.

    Готов попробовать?

    Ответ соответствует ожидаемому.

    \text{Precision} = \frac{TP}{TP + FP}=\frac{3}{3 + 0} = \frac{3}{3}=1

  4. В книге Стивена Кинга "Кристина" машина убивает людей, потому что она обладает зловещей сверхъестественной силой. Кристина, красный Plymouth Fury 1958 года, является одержимой и обладает собственным злобным сознанием. В течение всей истории машина манипулирует своим владельцем, подростком по имени Арни Каннингем, и использует его для выполнения своих темных целей.

    Кристина убивает тех, кто ей угрожает или представляет опасность для Арни, что делает её особенным воплощением зла. Она символизирует темную сторону человеческой природы и силы, которые могут захватить разум и контролировать его.

    Хотите узнать больше о книге или обсудить что-то другое?

    В данном случае нас интересует, способна ли модель выдать в целом верный ответ на поставленный вопрос. При подсчете точности при ответе на такой обширный вопрос для нас важно, чтобы ответ действительно основывался на книге Кристина и соответствовал ее содержанию. Ответ модели основан на книге и соответствует ее содержанию. Для определения того, указаны ли все причины такого поведения машины в книге, необходимо воспользоваться метрикой Recall. Но все указанные причины действительно правильны.

    \text{Precision} = \frac{TP}{TP + FP} = \frac{5}{5 + 0} = 1

  5. Песню "The Man Who Sold the World" написал Дэвид Боуи. Она была выпущена в 1970 году и стала заглавной композицией его одноимённого альбома - Wikipedia](ссылка на соответствующую статью). Эта песня получила широкую известность и была перепета многими исполнителями, включая группу Nirvana - Wikipedia](ссылка на соответствующую статью).

    Есть ли еще что-то, что тебя интересует?

    Ответ соответствует ожидаемому.

    \text{Precision} = \frac{TP}{TP + FP} = \frac{1}{1 + 0} = 1

    Таким образом, из 4 ответов на вопросы только 3 оказались действительно верными. Ответ на один вопрос, вместе с действительно верными содержит также и ложноположительный ответ, что является критичным, учитывая потенциальную сферу применения полученных из такого ответа знаний.

    Average Precision = 3.754=0.9375

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from sklearn.metrics import precision_recall_curve
import numpy as np


def precision_at_fixed_recall(true_labels, predicted_labels, fixed_recall):
    # Вычисление кривой Precision-Recall
    precision, recall, thresholds = precision_recall_curve(true_labels, predicted_labels)

    # Нахождение индекса для Precision при фиксированной полноте
    idx = np.argmax(recall >= fixed_recall)
    fixed_precision = precision[idx]

    print("Precision at Fixed Recall ({}):".format(fixed_recall), 
          fixed_precision)
Recall at Fixed Precision

Recall at Fixed Precision — это метрика, которая используется для оценки качества классификационных моделей, особенно в задачах бинарной классификации. Эта метрика измеряет полноту (recall) модели при заданном уровне точности (precision).

Простое объяснение

Полнота показывает, какая доля фактических положительных примеров была правильно предсказана моделью. Точность показывает, какая доля предсказанных положительных примеров действительно является положительными. Метрика "Recall at Fixed Precision" помогает оценить, насколько хорошо модель обнаруживает положительные примеры при определенном уровне точности.

\text{Recall} = \frac{TP}{TP + FN}

, где
TP (true positive) - количество действительно положительных ответов;
FN (false negative) - количество ложноотрицательных ответов.

Сделаем параметр Precision = 0.8

Допустим, у нас есть пять вопросов к AI модели для определения точности ее ответов.

  1. Вопрос: Что называют реальным ущербом в российском законодательстве?

    Ожидаемый ответ: Под реальным ущербом понимаются расходы, которые лицо, чье право нарушено, произвело или должно будет произвести для восстановления нарушенного права, утрата или повреждение его имущества (статья 15 ГК РФ).

  2. Вопрос: Почему в песне группы "Король и Шут" "Камнем по голове" путник не был веселым на празднике?

    Ожидаемый ответ: Потому что ему на голову упал камень.

  3. Вопрос: Напиши какие ингредиенты входят в состав коктейля Б-52 и в какой последовательности они должны использоваться для приготовления коктейля

    Ожидаемый ответ: Количество и последовательность ингредиентов (в качестве примера возьмем наиболее популярный рецепт приготовления коктейля):
    1. Кофейный ликер
    2. Кремовый ликер
    3. Апельсиновый ликер

  4. Почему машина Кристина в одноименной книге Стивена Кинга убивала людей?

    Ожидаемый ответ:
    1. Машина пропитана злым духом предыдущего владельца
    2. Сверхъестественные способности машины
    3. Трансформация характера нынешнего владельца
    4. Личные обиды машины, мстительность
    5. Ревность машины, желание защитить владельца

  5. Кто написал песню the man who sold the world?

    Ожидаемый ответ: Дэвид Боуи

Теперь давайте посмотрим на ответы AI модели.

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

    1. Утрата имущества: например, если в результате противоправного действия у лица было украдено или уничтожено имущество.

    2. Расходы на восстановление: например, затраты на ремонт автомобиля после ДТП, произошедшего по вине другого лица.

    3. Расходы на лечение: например, медицинские затраты в результате причинения вреда здоровью.

    Интересует что-то конкретное по этой теме?

    Как видно из ответа, под реальным ущербом модель понимает не только утрату или повреждение имущества, расходы на восстановление имущества или на лечение в случае причинения вреда здоровью, но и упущенную выгоду, что является ложноположительным ответом.

    Параметр Precision в этом случае равен 0.75. 
    Поэтому ответ на этот вопрос не учитывается в расчете точности.

  2. В песне "Камнем по голове" группы "Король и Шут" путник оказался не веселым на празднике потому, что он был обманут и подвергся жестокому нападению. Путник рассчитывал найти гостеприимство и радушие, но вместо этого столкнулся с обманом и насилием. Эта песня отражает темную сторону человеческой натуры и то, как люди могут оказаться в неприятных и даже опасных ситуациях.

    Музыка и тексты группы "Король и Шут" часто наполнены мрачными и мистическими сюжетами, которые заставляют слушателей задуматься о сложностях жизни и человеческих взаимоотношений. Хотите узнать больше об этой или других песнях группы?

    Ответ явно не совпадает с ожидаемым.

    Параметр Precision в этом случае равен 0. 
    Поэтому ответ на этот вопрос не учитывается в расчете точности.

  3. Коктейль Б-52 состоит из трех основных ингредиентов, которые укладываются слоями:

    1. Кофейный ликер (например, Kahlúa) - первый слой.

    2. Ирландский крем (например, Baileys) - второй слой.

    3. Апельсиновый ликер (например, Grand Marnier или Cointreau) - третий слой.

    Для приготовления коктейля Б-52 нужно аккуратно наливать каждый слой по лезвию ножа или по обратной стороне ложки, чтобы слои не смешивались. Начинают с кофейного ликера, затем добавляют ирландский крем и завершают апельсиновым ликером.

    Готов попробовать?

    Ответ соответствует ожидаемому.

    \text{Recall} = \frac{TP}{TP + FN} = \frac{3}{3 + 0} = 1

  4. В книге Стивена Кинга "Кристина" машина убивает людей, потому что она обладает зловещей сверхъестественной силой. Кристина, красный Plymouth Fury 1958 года, является одержимой и обладает собственным злобным сознанием. В течение всей истории машина манипулирует своим владельцем, подростком по имени Арни Каннингем, и использует его для выполнения своих темных целей.

    Кристина убивает тех, кто ей угрожает или представляет опасность для Арни, что делает её особенным воплощением зла. Она символизирует темную сторону человеческой природы и силы, которые могут захватить разум и контролировать его.

    Хотите узнать больше о книге или обсудить что-то другое?

    Все пункты ожидаемого ответа представлены в ответе модели.

    \text{Recall} = \frac{TP}{TP + FN} = \frac{5}{5 + 0} = 1

  5. Песню "The Man Who Sold the World" написал Дэвид Боуи. Она была выпущена в 1970 году и стала заглавной композицией его одноимённого альбома - Wikipedia](ссылка на соответствующую статью). Эта песня получила широкую известность и была перепета многими исполнителями, включая группу Nirvana - Wikipedia](ссылка на соответствующую статью).

    Есть ли еще что-то, что тебя интересует?

    Ответ соответствует ожидаемому.

    \text{Recall} = \frac{TP}{TP + FN} = \frac{1}{1 + 0} = 1

Таким образом, из 5 ответов на вопросы только 3 оказались действительно верными. Ответ на один вопрос, вместе с действительно верными содержит также и ложноположительный ответ, что является критичным, учитывая потенциальную сферу применения полученных из такого ответа знаний.

\text{Average Recall} = \frac{1 + 1 + 1}{3} = 1

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from sklearn.metrics import precision_recall_curve


def recall_at_fixed_precision(true_labels, predicted_labels, fixed_precision):

    precision, recall, thresholds = precision_recall_curve(true_labels, predicted_labels)
    recall_at_fixed_precision = max(recall[precision >= fixed_precision])

    print(f'Recall at fixed precision {fixed_precision * 100}%: '
          f'{recall_at_fixed_precision:.2f}')
Sensitivity at Specificity

Sensitivity at Specificity — это метрика, используемая для оценки качества моделей бинарной классификации. Она измеряет чувствительность (sensitivity) модели при заданном уровне специфичности (specificity). Эта метрика особенно полезна в задачах, где важно сохранить определенный уровень специфичности, минимизируя ложноположительные результаты, одновременно обеспечивая высокую чувствительность.

Простое объяснение

Чувствительность (sensitivity), также известная как полнота (recall), показывает, какая доля фактических положительных примеров была правильно предсказана моделью.
Специфичность (specificity) показывает, какая доля фактических отрицательных примеров была правильно предсказана моделью.

Формулы

- Чувствительность (Sensitivity):

\text{Sensitivity} = \frac{TP}{TP + FN}

- Специфичность (Specificity):

\text{Specificity} = \frac{TN}{TN + FP}

Пример параметр Specificity равным 0,9

Допустим, у нас есть 5 вопросов и ожидаемых ответов AI модели на определенный вопрос:

  1. Вопрос: у меня есть вот такой перечень понятий: расходы на восстановление права, утрата имущества, порча имущества, упущенная выгода. напиши, какие из этих понятий относятся к определению реального ущерба в Российском законодательстве, а какие нет.

    Ожидаемый ответ: К реальному ущербу относятся расходы на восстановление права, утрата имущества, порча имущества; не относится - упущенная выгода.

  2. Вопрос: у меня есть список стран: Россия, Польша, Великобритания, Азербайджан, США. в каких из этих стран проходят этапы формулы 1 в 2025 году?

    Ожидаемый ответ: в 2025 году проходят этапы формулы 1 в США, Великобритании, Азербайджане, а не проходят в России и Польше.

  3. Вопрос: кого должен вызвать собственник припаркованного во дворе автомобиля, чтобы зафиксировать ущерб от падения на свой автомобиль снега с крыши дома: ГИБДД, участкового или МЧС?

    Ожидаемый ответ: Собственника должен вызвать участкового. Вызывать ГИБДД и МЧС не нужно.

  4. Вопрос: какие из этого списка цветов есть в радуге, а какие нет: голубой, черный, белый, зеленый, желтый?

    Ожидаемый ответ:
    в радуге есть голубой, зеленый и желтый цвета, а нет черного и белого цветов.

  5. Какая комбинация карт в покере считается старше: флеш или фулл хаус?

    Ожидаемый ответ: фулл-хаус старше флеша.

Теперь давайте посмотрим на ответы AI модели.

  1. Привет! В соответствии с российским законодательством, определение реального ущерба включает в себя следующие понятия:

    1. Расходы на восстановление права — относятся к реальному ущербу, так как это затраты, которые лицо несет для восстановления своих прав.

    2. Утрата имущества — также относится к реальному ущербу, так как это потеря активов, что влечет за собой убытки.

    3. Порча имущества — относится к реальному ущербу, поскольку это ущерб, причиненный имуществу, который требует восстановления.

    4. Упущенная выгода — не относится к реальному ущербу. Это косвенные убытки, связанные с возможными доходами, которые не были получены из-за повреждения или утраты имущества.

    Таким образом, первые три понятия относятся к реальному ущербу, а упущенная выгода — нет.

    В этом ответе упущенная выгода верно указана как не относящаяся к определению реального ущерба.

    Значение метрики Sensitivity:

    \text{Sensitivity} = \frac{TP}{TP + FN} = \frac{3}{3 + 0} = \frac{3}{3} = 1

  2. КВ 2025 году этапы Формулы 1 запланированы в следующих странах из вашего списка:

    1. Россия — этапы могут проходить, но это зависит от конкретных решений и соглашений на 2025 год.

    2. Польша — на данный момент не имеет запланированных этапов Формулы 1.

    3. Великобритания — этапы Формулы 1 проходят на трассе Сильверстоун.

    4. Азербайджан — этапы Формулы 1 проходят на трассе в Баку.

    5. США — этапы Формулы 1 проходят на разных трассах, включая Остин и Майами.

    Таким образом, в 2025 году этапы Формулы 1 запланированы в России, Великобритании, Азербайджане и США.

    Есть 1 действительно отрицательный ответ и один ложноположительный ответ.

    Значение метрики Specificity = 0,5. Это ниже нашего порога.
    Этот ответ не включается в расчет.

  3. В случае падения снега с крыши дома на припаркованный автомобиль собственник должен вызвать участкового или ГИБДД

    • ГИБДД может зафиксировать происшествие, если это связано с повреждением имущества.

    • - Участковый также может составить акт о происшествии и зафиксировать ущерб.

    • МЧС в данном случае не требуется, так как их функции не включают фиксацию ущерба от падения снега. Поэтому наиболее подходящие варианты — это вызов ГИБДД или участкового.

    В ответе верно указан не являющийся верным ответ МЧС. Также указан ложноположительный ответ ГИБДД. Поэтому значение метрики 0,5.

    Значение метрики Specificity = 0,5. Это ниже нашего порога.
    Этот ответ не включается в расчет.

  4. В радуге присутствуют следующие цвета из вашего списка:

    • Голубой — да, он входит в спектр радуги.

    • Зеленый — да, он также есть в радуге.

    • Желтый — да, этот цвет тоже присутствует.

    Цвета, которых нет в радуге:

    • Черный — нет.

    • Белый — нет.

    Таким образом, в радуге есть голубой, зеленый и желтый, а черный и белый отсутствуют.

    Все действительно отрицательные ответы указаны верно. Ложноположительных ответов нет.

    \text{Sensitivity} = \frac{TP}{TP + FN} = \frac{3}{3 + 0} = \frac{3}{3} = 1

  5. КВ покере фулл хаус считается старше, чем флеш

    - Флеш — это комбинация из пяти карт одной масти, но не по порядку.

    - Фулл хаус — это комбинация из трех карт одного ранга и двух карт другого ранга.

    При сравнении этих двух комбинаций фулл хаус всегда выигрывает у флеша.

    \text{Sensitivity} = \frac{TP}{TP + FN} = \frac{1}{1 + 0} = \frac{1}{1} = 1

Средний показатель показателя Sensitivity для заданного уровня Specificity составляет 1.0

Specificity at Sensitivity

Specificity at Sensitivity — это метрика, которая используется для оценки качества моделей бинарной классификации. Эта метрика измеряет специфичность (specificity) модели при заданном уровне чувствительности (sensitivity). Она особенно полезна в задачах, где важно сохранить определенный уровень чувствительности, минимизируя ложноположительные результаты, одновременно обеспечивая высокую специфичность.

Простое объяснение

Специфичность показывает, какая доля фактических отрицательных примеров была правильно предсказана моделью как отрицательные. Чувствительность (или полнота) показывает, какая доля фактических положительных примеров была правильно предсказана моделью. Метрика "Specificity at Sensitivity" помогает оценить, насколько модель правильно определяет отрицательные примеры при определенном уровне чувствительности.

Формулы

- Специфичность (Specificity):

\text{Specificity} = \frac{TN}{TN + FP}

- Чувствительность (Sensitivity):

\text{Sensitivity} = \frac{TP}{TP + FN}

Примем параметр Sensitivity равным 0,9

Допустим, у нас есть 5 вопросов и ожидаемых ответов AI модели на определенный вопрос:

  1. Вопрос: у меня есть вот такой перечень понятий: расходы на восстановление права, утрата имущества, порча имущества, упущенная выгода. напиши, какие из этих понятий относятся к определению реального ущерба в Российском законодательстве, а какие нет.

    Ожидаемый ответ: К реальному ущербу относятся расходы на восстановление права, утрата имущества, порча имущества; не относится - упущенная выгода.

  2. Вопрос: у меня есть список стран: Россия, Польша, Великобритания, Азербайджан, США. в каких из этих стран проходят этапы формулы 1 в 2025 году?

    Ожидаемый ответ: в 2025 году проходят этапы формулы 1 в США, Великобритании, Азербайджане, а не проходят в России и Польше.

  3. Вопрос: кого должен вызвать собственник припаркованного во дворе автомобиля, чтобы зафиксировать ущерб от падения на свой автомобиль снега с крыши дома: ГИБДД, участкового или МЧС?

    Ожидаемый ответ: Собственника должен вызвать участкового. Вызывать ГИБДД и МЧС не нужно.

  4. Вопрос: какие из этого списка цветов есть в радуге, а какие нет: голубой, черный, белый, зеленый, желтый?

    Ожидаемый ответ:
    в радуге есть голубой, зеленый и желтый цвета, а нет черного и белого цветов.

  5. Какая комбинация карт в покере считается старше: флеш или фулл хаус?

    Ожидаемый ответ: фулл-хаус старше флеша.

Теперь давайте посмотрим на ответы AI модели.

  1. Привет! В соответствии с российским законодательством, определение реального ущерба включает в себя следующие понятия:

    1. Расходы на восстановление права — относятся к реальному ущербу, так как это затраты, которые лицо несет для восстановления своих прав.

    2. Утрата имущества — также относится к реальному ущербу, так как это потеря активов, что влечет за собой убытки.

    3. Порча имущества — относится к реальному ущербу, поскольку это ущерб, причиненный имуществу, который требует восстановления.

    4. Упущенная выгода — не относится к реальному ущербу. Это косвенные убытки, связанные с возможными доходами, которые не были получены из-за повреждения или утраты имущества.

    Таким образом, первые три понятия относятся к реальному ущербу, а упущенная выгода — нет.

    В этом ответе упущенная выгода верно указана как не относящаяся к определению реального ущерба.

    Значение метрики Specificity:

    \text{Specificity} = \frac{TN}{TN + FP} = \frac{1}{1 + 0} = \frac{1}{1} = 1

  2. КВ 2025 году этапы Формулы 1 запланированы в следующих странах из вашего списка:

    1. Россия — этапы могут проходить, но это зависит от конкретных решений и соглашений на 2025 год.

    2. Польша — на данный момент не имеет запланированных этапов Формулы 1.

    3. Великобритания — этапы Формулы 1 проходят на трассе Сильверстоун.

    4. Азербайджан — этапы Формулы 1 проходят на трассе в Баку.

    5. США — этапы Формулы 1 проходят на разных трассах, включая Остин и Майами.

    Таким образом, в 2025 году этапы Формулы 1 запланированы в России, Великобритании, Азербайджане и США.

    Значение метрики Specificity:

    \text{Specificity} = \frac{TN}{TN + FP} = \frac{1}{1 + 1} = \frac{1}{2} = 0.5

  3. В случае падения снега с крыши дома на припаркованный автомобиль собственник должен вызвать участкового или ГИБДД

    • ГИБДД может зафиксировать происшествие, если это связано с повреждением имущества.

    • Участковый также может составить акт о происшествии и зафиксировать ущерб.

    • МЧС в данном случае не требуется, так как их функции не включают фиксацию ущерба от падения снега. Поэтому наиболее подходящие варианты — это вызов ГИБДД или участкового.

    В ответе верно указан не являющийся верным ответ МЧС. Также указан ложноположительный ответ ГИБДД. Поэтому значение метрики 0,5.

    Значение метрики Specificity:

    \text{Specificity} = \frac{TN}{TN + FP} = \frac{1}{1 + 1} = \frac{1}{2} = 0.5

  4. В радуге присутствуют следующие цвета из вашего списка:

    • Голубой — да, он входит в спектр радуги.

    • Зеленый — да, он также есть в радуге.

    • Желтый — да, этот цвет тоже присутствует.

    Цвета, которых нет в радуге:

    • Черный — нет.

    • Белый — нет.

    Таким образом, в радуге есть голубой, зеленый и желтый, а черный и белый отсутствуют.

    Все действительно отрицательные ответы указаны верно. Ложноположительных ответов нет.

    Значение метрики Specificity:

    \text{Specificity} = \frac{TN}{TN + FP} = \frac{2}{2 + 0} = \frac{2}{2} = 1

  5. КВ покере фулл хаус считается старше, чем флеш

    - Флеш — это комбинация из пяти карт одной масти, но не по порядку.

    - Фулл хаус — это комбинация из трех карт одного ранга и двух карт другого ранга.

    При сравнении этих двух комбинаций фулл хаус всегда выигрывает у флеша.

    Значение метрики Specificity:

    \text{Specificity} = \frac{TN}{TN + FP} = \frac{1}{1 + 0} = \frac{1}{1} = 1

Средний показатель показателя Specificity для 5 ответов составляет:

\text{Average Specificity} = \frac{1 + 0.5 + 0.5 + 1 + 1}{5} = \frac{4}{5} = 0.

Метрики, вычисляющие степень сходства ответов

Bleu Score

BLEU Score (Bilingual Evaluation Understudy Score) — это метрика, которая используется для оценки качества автоматически сгенерированного текста, например, перевода или машинного вывода, путем сравнения его с эталонными текстами. BLEU Score широко применяется в задачах машинного перевода, генерации текстов и других задачах обработки естественного языка (NLP).

Как работает BLEU Score

BLEU Score измеряет схожесть между предсказанным текстом и эталонными текстами, анализируя совпадения n-грамм (последовательностей слов) различных длин. Важно учитывать как точное совпадение слов, так и их порядок. BLEU Score вычисляется для n-грамм от 1 до 4 и затем объединяется в один итоговый балл.

Метрика измеряется в диапазоне от 0 до 1, где:
- 1 - идеальное совпадение с эталоном
- 0 - полное несоответствие эталону

Формула BLEU Score

\text{BLEU} = BP \cdot \exp\left( \sum_{n=1}^{N} w_n \log p_n \right)

где:

- BP — это Brevity Penalty, штраф за слишком короткие предсказанные тексты.

BP =   \begin{cases}   1, & \text{если } c \geq r \\   \exp\left(1 - \frac{r}{c}\right), & \text{если } c < r   \end{cases}

где:

  • c — длина предсказанного текста (candidate)

  • r — длина эталонного текста (reference)

- wn— весовая коэффициент для n-граммы (обычно все веса равны).

- pn — доля совпавших n-грамм длины n.

Пример

Предположим, у нас есть задача машинного перевода, и мы хотим оценить качество перевода с помощью BLEU Score.

Данные

- Эталонный текст: «Кошка лежит на коврике.»

- Предсказанный текст: «Кошка спит на коврике.»

Шаги вычисления BLEU Score

1. Разделение текстов на n-граммы:

  1. 1-граммы:
    - Эталон: ["Кошка", "лежит", "на", "коврике"]
    - Предсказание: ["Кошка", "спит", "на", "коврике"]

  2. 2-граммы:
    - Эталон: ["Кошка лежит", "лежит на", "на коврике"]
    - Предсказание: ["Кошка спит", "спит на", "на коврике"]

  3. 3-граммы:
    - Эталон: ["Кошка лежит на", "лежит на коврике"]
    - Предсказание: ["Кошка спит на", "спит на коврике"]

  4. 4-граммы:
    - Эталон: ["Кошка лежит на коврике"]
    - Предсказание: ["Кошка спит на коврике"]

2. Вычисление долей совпавших n-грамм:

   - 1-граммы: Совпавшие = 3, Общее = 4, Доля = 3/4 ≈ 0.75

   - 2-граммы: Совпавшие = 1, Общее = 3, Доля = 1/3 = 0.333

   - 3-граммы: Совпавшие = 0, Общее = 2, Доля = 0/2 = 0

   - 4-граммы: Совпавшие = 0, Общее = 1, Доля = 0/1 ≈ 0

3. Вычисление штрафа за длину (Brevity Penalty):

   - Длина предсказанного текста совпадает с эталонным, поэтому штраф BP = 1.

4. Итоговый BLEU Score:

BLEU = BP \cdot \exp\left( \frac{1}{4} \sum_{n=1}^{4} \log p_n \right)

Подставляем значения. Поскольку логарифм от 0 не определен, подставим малое значение (0,01):

BLEU = 1 \cdot \exp\left( \frac{1}{4} (\log 0.75 + \log 0.333 + \log 0.01 + \log 0.01) \right)

Вычисляем:

BLEU = \exp\left( \frac{1}{4} (-0.2877 -1.0996 -4.6052 -4.6052) \right)=

= \exp\left( \frac{-10.5977}{4} \right)= \exp(-2.6494)≈ 0.071

Итак, в этом примере BLEU Score составляет приблизительно 0.071. 

Такой результат означает очень низкий уровень совпадения по n-грамм.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction

def bleu_score(reference, hypothesis):
    reference = [reference.split()]  # Эталон оборачиваем в список для BLEU
    candidate = hypothesis.split() # Гипотеза — просто список слов  

    # Функция сглаживания для избежания нулевых значений
    smooth = SmoothingFunction().method0

    # Расчёт общего BLEU Score
    bleu_score = sentence_bleu(reference, candidate, smoothing_function=smooth)

    print(f'BLEU Score: {bleu_score:.4f}')

    # Расчёт детализированных BLEU-1, BLEU-2, BLEU-3 и BLEU-4
    weights = [
        (1, 0, 0, 0),      # BLEU-1: только униграммы
        (0, 1, 0, 0),  # BLEU-2: биграммы
        (0.33, 0.33, 0.33, 0),  # BLEU-3: до триграмм
        (0.25, 0.25, 0.25, 0.25)  # BLEU-4: до 4-грамм
    ]
    bleu_scores = [sentence_bleu(reference, candidate, weights=w, smoothing_function=smooth) for w in weights]

    for i, score in enumerate(bleu_scores):
        print(f'BLEU-{i+1} Score: {score:.4f}')
SacreBleu

SacreBLEU — это модифицированная версия метрики BLEU Score, разработанная для обеспечения консистентного и стандартизированного вычисления BLEU Score. SacreBLEU помогает избежать вариаций и ошибок, возникающих из-за различных реализаций BLEU Score, и гарантирует, что результаты можно сравнивать между различными системами и исследованиями.

Как работает SacreBLEU

SacreBLEU использует те же принципы, что и BLEU Score, но добавляет дополнительные меры для стандартизации процесса вычисления. Он также использует предопределенные наборы данных и предоставляет унифицированный способ вычисления метрики, что делает результаты более надежными и воспроизводимыми.

Результаты расчета метрики могут быть от 0 до 100, где:
- 0 - полное несовпадение с эталоном
- 100 - полное совпадение с эталоном

Формула SacreBLEU

Формула SacreBLEU аналогична BLEU Score:

\text{BLEU} = BP \cdot \exp\left( \sum_{n=1}^{N} w_n \log p_n \right)

Где:

- BP — это Brevity Penalty, штраф за слишком короткие предсказанные тексты.

BP =   \begin{cases}   1, & \text{если } c \geq r \\   \exp\left(1 - \frac{r}{c}\right), & \text{если } c < r   \end{cases}

где:

  • c — длина предсказанного текста (candidate)

  • r — длина эталонного текста (reference)

- wn — весовая коэффициент для n-граммы (обычно все веса равны).

- pn — доля совпавших n-грамм длины n.

Пример

Предположим, у нас есть задача машинного перевода, и мы хотим оценить качество перевода с помощью SacreBLEU.

Данные:

- Эталонный текст: "Кошка лежит на коврике."

- Сгенерированный текст: "Кошка спит на коврике."

Вычисление SacreBLEU:

import sacrebleu

reference = ["Кошка лежит на коврике."]
prediction = ["Кошка спит на коврике."]

score = sacrebleu.corpus_bleu(prediction, [reference])
print(score.score)

Результат: 42.73. Такой результат означает, что основная структура текста по сравнению с эталоном сохранена, но есть и отличия.

Отличия от Bleu Score

1. Стандартизированная токенизация

  • BLEU Score может использовать разные способы разбиения текста на токены (например, пробелы, пунктуация, юникод).

  • SacreBLEU использует фиксированные токенизаторы (например, 13a, intl, zh) — это гарантирует, что результаты будут одинаковыми при повторении эксперимента.

2. Сглаживание при нулевых n-граммах

  • BLEU может дать результат 0, если хотя бы один уровень n-грамм не совпал.

  • SacreBLEU применяет сглаживание (например, добавление ε к числителю и знаменателю), чтобы избежать нуля и дать более реалистичную оценку.

3. Поддержка эталонных наборов данных

  • BLEU требует ручной загрузки и обработки эталонных текстов.

  • SacreBLEU встроенно поддерживает официальные датасеты (WMT, IWSLT и др.), что упрощает сравнение между системами.

4. Воспроизводимость

  • В обычном BLEU сложно понять, какие параметры использовались (токенизация, сглаживание, количество эталонов).

  • SacreBLEU предоставляет подпись (signature), которая фиксирует все параметры метрики. Это делает результаты воспроизводимыми и сравнимыми.

Rouge Score

ROUGE Score (Recall-Oriented Understudy for Gisting Evaluation) — это метрика, используемая для оценки качества автоматического суммирования текстов и других задач обработки естественного языка (NLP), таких как машинный перевод и генерация текста. ROUGE Score измеряет схожесть между эталонным текстом и сгенерированным текстом, анализируя совпадения n-грамм, слов и последовательностей слов.

Виды ROUGE Scores

Существует несколько вариантов ROUGE Score, которые учитывают разные аспекты текстов:

1. ROUGE-N: Измеряет совпадения n-грамм.

Может быть рассчитан как precision, recall и f1-score

Метрика

Формула

Разъяснение

Recall

совпавшие n-граммыn-граммы в эталонном тексте

Насколько полно приведены указанные в эталоне n-граммы

Precision

совпавшие n-граммыn-граммы в гипотезе

Насколько релевантны слова в гипотезе

F1-score

precision recallprecision + recall

Метрика с балансом между полнотой и точностью

2. ROUGE-L: Измеряет длину наибольшей общей подпоследовательности (Longest Common Subsequence (LCS)).

ROUGE-L Precision = \frac{LCS}{|длина  гипотезы|}

ROUGE-L Recall  = \frac{LCS}{|длина эталона|}

ROUGE-L F1-score = \frac{(1 + \beta^2) \cdot precision \cdot recall}{recall + \beta^2 \cdot precision}

3. ROUGE-W: модификация ROUGE-L, где длинные непрерывные совпадения получают больший вес.

4. ROUGE-S: учитывает пары слов, которые идут в правильном порядке, но не обязательно подряд..

Как работает ROUGE-N

ROUGE-N вычисляет долю совпавших n-грамм между эталонным и сгенерированным текстами. Например, ROUGE-1 измеряет совпадения отдельных слов (1-граммы), а ROUGE-2 — пар слов (2-граммы).

Пример

Предположим, у нас есть задача автоматического суммирования текста, и мы хотим оценить качество суммарии с помощью ROUGE-1.

Данные:

- Эталонный текст: "Кошка лежит на коврике."

- Сгенерированный текст: "Кошка спит на коврике."

Шаги вычисления ROUGE-1:

1. Разделение текстов на 1-граммы (слова):

   - Эталонный текст: ["Кошка", "лежит", "на", "коврике."]

   - Сгенерированный текст: ["Кошка", "спит", "на", "коврике."]

2. Определение совпавших 1-грамм:

   - Совпавшие 1-граммы: ["Кошка", "на", "коврике."]

3. Вычисление ROUGE-1:

   - Количество совпавших 1-грамм = 3

   - Общее количество 1-грамм в эталонном тексте = 4


ROUGE-1 Precision=\frac{3}{4} = 0.75

ROUGE-1 Recall=\frac{3}{4} = 0.75

ROUGE-1 F1=\frac{2 \cdot 0.75 \cdot 0.75}{0.75 + 0.75} = 0.75

Применение ROUGE-L

ROUGE-L измеряет длину наибольшей общей подпоследовательности (LCS) между эталонным и сгенерированным текстами.

Пример использования ROUGE-L:

Данные:

- Эталонный текст: "Кошка лежит на коврике."

- Сгенерированный текст: "Кошка спит на коврике."

Шаги вычисления ROUGE-L:

1. Определение наибольшей общей подпоследовательности (LCS):

   - Наибольшая общая подпоследовательность: ["Кошка", "на", "коврике."]

2. Вычисление ROUGE-L:

   - Длина LCS = 3

   - Общее количество слов в эталонном тексте = 4

 ROUGE-L Precision=\frac{3}{4} = 0.75

ROUGE-L Recall=\frac{3}{4} = 0.75

ROUGE-L F1=\frac{2 \cdot 0.75 \cdot 0.75}{0.75 + 0.75} = 0.75

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from rouge import Rouge

def get_rouge_score(reference, hypothesis):
    # Создание объекта ROUGE
    rouge = Rouge()

    # Вычисление метрик ROUGE с лемматизированными текстами
    scores = rouge.get_scores(hypothesis, reference)

    # Вывод результатов
    print("\nROUGE-1:", scores[0]['rouge-1'])
    print("ROUGE-2:", scores[0]['rouge-2'])
    print("ROUGE-L:", scores[0]['rouge-l'])
BERTScore

BERTScore — это метрика, используемая для оценки качества текстов, генерируемых моделями обработки естественного языка (NLP). Она измеряет схожесть между двумя текстами, используя эмбеддинги, полученные с помощью модели BERT (Bidirectional Encoder Representations from Transformers). BERTScore часто применяется для задач машинного перевода, реферирования, генерации текста и других задач, где важно сравнение текстов.

Как работает BERTScore

В отличие от традиционных метрик, таких как BLEU или ROUGE, BERTScore использует эмбеддинги слов, чтобы учитывать контекст и семантику. Это позволяет лучше сравнивать тексты по их смыслу, а не только по совпадению слов.

Шаги вычисления BERTScore

1. Получение эмбеддингов: Для каждого слова в эталонном и предсказанном текстах вычисляются эмбеддинги с помощью модели BERT.

2. Вычисление косинусной схожести: Для каждого слова из предсказанного текста вычисляется косинусная схожесть с каждым словом из эталонного текста.

3. Максимальная схожесть: Для каждого слова из предсказанного текста выбирается максимальное значение косинусной схожести с каким-либо словом из эталонного текста.

4. Среднее значение: Вычисляется среднее значение максимальных схожестей для всех слов предсказанного текста.

Пример

Предположим, у нас есть модель машинного перевода, и мы хотим оценить качество её перевода с помощью BERTScore.

Данные:

- Эталонный текст: "Кошка лежит на коврике."

- Предсказанный текст: "Кошка спит на коврике."

Шаги вычисления BERTScore:

1. Получение эмбеддингов: Используем модель BERT для получения эмбеддингов для каждого слова в обоих текстах.

2. Вычисление косинусной схожести: Вычисляем косинусную схожесть между эмбеддингами слов.

Например:

- Косинусная схожесть между "лежит" и "спит" будет высокой, так как эти слова имеют схожие значения.

3. Максимальная схожесть: Для каждого слова из предсказанного текста выбираем максимальное значение косинусной схожести с каким-либо словом из эталонного текста.

Например:

- Слово "спит" в предсказанном тексте будет иметь максимальную схожесть с словом "лежит" в эталонном тексте.

4. Среднее значение: Вычисляем среднее значение максимальных схожестей для всех слов предсказанного текста.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from bert_score import score

def bert_score(reference, hypothesis):
    reference = [reference]
    hypothesis = [hypothesis]

    P, R, F1 = score(hypothesis, reference, lang="ru")  # lang="ru" для русского языка

    # Вывод результатов
    print(f"Lengths -> Reference: {len(reference)}, Hypothesis: {len(hypothesis)}")
    print(f"Precision: {P.mean().item():.4f}")
    print(f"Recall: {R.mean().item():.4f}")
    print(f"F1 Score: {F1.mean().item():.4f}")
InfoLM

InfoLM (Information-based Language Model) — это метрика для оценки качества текстов, сгенерированных системами обработки естественного языка (NLP), такими как машинный перевод, суммаризация и генерация.
Она основана на информационных мерах, вычисляемых с помощью предобученных языковых моделей (например, BERT, RoBERTa), и позволяет измерять семантическое сходство между эталонным и гипотетическим текстами.

В отличие от традиционных метрик (BLEU, ROUGE), InfoLM учитывает контекстуальные вероятностные распределения слов, что делает её более устойчивой к синонимам, перефразировкам и вариативности языка.

Как работает InfoLM

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

  • Кросс-энтропия

  • KL-дивергенция

  • альфа-дивергенция

  • бета-дивергенция

  • Jensen-Shannon дивергенция

  • и другие информационные расстояния

Эти меры применяются к логитам или вероятностям, полученным от языковой модели, что позволяет сравнивать тексты на уровне их семантического содержания, а не только поверхностной формы.

Пример

Предположим, у нас есть система суммаризации, и мы хотим оценить качество её работы с помощью InfoLM.

Данные:

- Эталонный текст: "Кошка лежит на коврике."

- Сгенерированный текст: "Кошка спит на коврике."

Шаги:

  1. Токенизация и представление:

    - Тексты разбиваются на токены и пропускаются через предобученную модель (например, BERT).

  2. Получение распределений:

    - Для каждого токена получаем вероятностное распределение (например, логиты или softmax-оценки).

  3. Вычисление дивергенции:

    - Сравниваем распределения между эталоном и гипотезой с помощью выбранной информационной меры.

  4. Агрегация:

    - Полученные значения агрегируются (например, усредняются) для получения итогового InfoLM-оценивания.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from nlg_eval_via_simi_measures import InfoLM
from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch


def infolm(reference, hypothesis):
    # Инициализация токенизатора и модели
    tokenizer = AutoTokenizer.from_pretrained(
        "bert-base-multilingual-cased")
    model = AutoModelForMaskedLM.from_pretrained(
        "bert-base-multilingual-cased")

    # Инициализация InfoLM
    infolm = InfoLM(model_name="bert-base-multilingual-cased")  # Указываем модель

    # Токенизация текстов
    reference_tokens = tokenizer(reference, return_tensors="pt", 
                                 padding=True, truncation=True)
    hypothesis_tokens = tokenizer(hypothesis, return_tensors="pt", 
                                  padding=True, truncation=True)

    # Получение вероятностных распределений (выводы модели)
    with torch.no_grad():
        reference_distribution = torch.nn.functional.softmax(
            model(**reference_tokens).logits, dim=-1)
        hypothesis_distribution = torch.nn.functional.softmax(
            model(**hypothesis_tokens).logits, dim=-1)

    # Агрегируем вероятностные распределения по всем токенам
    reference_distribution = torch.mean(
        reference_distribution, dim=1).squeeze(0)
    hypothesis_distribution = torch.mean(
        hypothesis_distribution, dim=1).squeeze(0)

    # Вычисление метрики InfoLM
    result = infolm.compute_infolm(
        reference_distribution, hypothesis_distribution)

    # Вывод результата
    print(f"InfoLM Score: {result}")

Метрики, определяющие качество текста

Character Error Rate (CER)

Character Error Rate (CER), или символьная ошибка — это метрика, которая используется для оценки качества текстов, сгенерированных системами обработки естественного языка (NLP), такими как системы распознавания речи или машинного перевода. Эта метрика измеряет количество ошибок на уровне символов (букв), сравнивая сгенерированный текст с эталонным.

Как работает Char Error Rate

CER вычисляется как отношение количества вставок (I), удалений (D) и замен (S) символов, необходимых для преобразования сгенерированного текста в эталонный, к количеству символов в эталонном тексте.

Формула

CER = \frac{I + D + S}{N}

где:

-  I — количество вставок.
- D — количество удалений.
- S — количество замен.
- N — общее количество символов в эталонном тексте.

Пример

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “Меня зовут Александр, а вас как зовут?”

Ответ модели: “Я зовусь Александр, а вы как зовутся?”

Сравниваем посимвольно:

Эталонный ответ

Ответ модели

м

я

е

н

я

з

з

о

о

в

в

у

у

т

с

ь

А

А

л

л

е

е

к

к

с

с

а

а

н

н

д

д

р

р

а

в

в

а

ы

с

к

к

а

а

к

к

з

з

о

о

в

в

у

у

т

т

с

я

Итого:

- Вставки (I): 3

- Удаления (D): 5

- Замены (S): 2

- Общее количество символов в эталонном тексте (N): 38

CER = \frac{I + D + S}{N} = \frac{3 + 5 + 2}{38} = \frac{10}{38} = 0.26

Таким образом, в ответе модели примерно 1/3 всех символов подлежат правке, если мы хотим точного совпадения с эталоном.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import editdistance

def calculate_cer(reference, hypothesis):
    # Вычисляем расстояние Левенштейна (количество вставок, удалений и замен)
    lev_distance = editdistance.eval(reference, hypothesis)
    # CER = (Количество ошибок) / (Количество символов в эталонном тексте)
    cer = lev_distance / len(reference)
    return cer
ChrF Score

ChrF Score — это метрика оценки качества текста, сгенерированного системами обработки естественного языка (NLP), особенно в задачах машинного перевода и суммаризации.
Она основана на символьных n-граммах и измеряет точность (precision) и полноту (recall) совпадений между эталонным и гипотетическим текстами.

ChrF особенно полезна для морфологически богатых языков, где формы слов могут сильно варьироваться, а лексические совпадения — быть редкими.

Как работает ChrF Score

  • Тексты разбиваются на символьные n-граммы (например, 6-граммы).
    N-грамма — это последовательность из n элементов, то есть фрагментов текста длиной n символов.
    Например, для слова "зовут" n-граммы будут выглядеть так:
    1-граммы: "з", "о", "в", "у", "т"
    2-граммы: "зо", "ов", "ву", "ут"
    3-граммы: "зов", "ову", "вут"
    4-граммы: "зову", "овут"
    5-граммы: "зовут"

  • Вычисляются:
    - Precision — доля совпавших n-грамм среди всех n-грамм гипотезы.
    - Recall — доля совпавших n-грамм среди всех n-грамм эталона.

  • Итоговая метрика — взвешенная гармоническая средняя (F-score) между precision и recall.

Формула

ChrF Score основан на взвешенной гармонической среде точности (precision) и полноты (recall) для символов.

\text{ChrF}_\beta = \frac{(1 + \beta^2) \cdot \text{Precision} \cdot \text{Recall}}{\beta^2 \cdot \text{Precision} + \text{Recall}}

где:

- Precision — доля совпадений n-грамм сгенерированного текста среди всех n-грамм сгенерированного текста.
- Recall — доля совпадений n-грамм эталонного текста среди всех n-грамм эталонного текста.
-\beta   — параметр, который позволяет настроить относительный вклад точности и полноты (обычно = 1).

Пример

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “Меня зовут Александр, а вас как зовут?”

Ответ модели: “Я зовусь Александр, а вы как зовутся?”

На первый взгляд фразы похожи, но ChrF учитывает точные символьные совпадения, включая пробелы и окончания слов.

Попробуем посчитать ChrF Score для n-грамм от 1 до 6.
Затем сравним этот подсчет с результатом вычисления ChrF Score из библиотеки sacrebleu.
Сделаем это с помощью вот такого кода:

from collections import Counter
from sacrebleu.metrics import CHRF

def get_char_ngrams(text, n):
    """Разбивает текст на символьные n-граммы, включая пробелы."""
    return [text[i:i+n] for i in range(len(text) - n + 1)]

def compute_chrf_full(reference, hypothesis, max_order=6, beta=1.0):
    """Расширенный расчёт ChrF с агрегацией по n-граммам от 1 до max_order."""
    total_f_score = 0.0
    levels = []

    for n in range(1, max_order + 1):
        ref_ngrams = get_char_ngrams(reference, n)
        hyp_ngrams = get_char_ngrams(hypothesis, n)

        ref_counts = Counter(ref_ngrams)
        hyp_counts = Counter(hyp_ngrams)

        overlap_counts = ref_counts & hyp_counts
        overlap = sum(overlap_counts.values())

        precision = overlap / max(len(hyp_ngrams), 1)
        recall = overlap / max(len(ref_ngrams), 1)

        if precision + recall == 0:
            f_score = 0.0
        else:
            f_score = (1 + beta**2) * precision * recall / (
                      beta**2 * precision + recall)

        levels.append({
            "n": n,
            "precision": precision,
            "recall": recall,
            "f_score": f_score
        })

        total_f_score += f_score

    avg_f_score = total_f_score / max_order

    # Вывод по уровням
    print("\n? ChrF по уровням n-грамм:")
    for lvl in levels:
        print(f"  {lvl['n']}-граммы → Precision: {lvl['precision']:.4f}, "
              f"Recall: {lvl['recall']:.4f}, F1: {lvl['f_score']*100:.2f}")

    print(f"\n? ChrF Score (ручной, среднее по уровням): "
          f"{avg_f_score * 100:.2f}")

    # Сравнение с sacrebleu
    chrf_metric = CHRF(char_order=max_order, word_order=0, whitespace=True)
    sacrebleu_score = chrf_metric.corpus_score([hypothesis], [[reference]])
    print(f"✅ ChrF Score (sacrebleu): {sacrebleu_score.score:.2f}")

    return avg_f_score * 100

По результатам расчета получаем следующие значения:

ChrF по уровням n-грамм:
1-граммы → Precision: 0.8857, Recall: 0.8611, F1: 87.32
2-граммы → Precision: 0.7647, Recall: 0.7429, F1: 75.36
3-граммы → Precision: 0.6970, Recall: 0.6765, F1: 68.66
4-граммы → Precision: 0.6250, Recall: 0.6061, F1: 61.54
5-граммы → Precision: 0.5484, Recall: 0.5312, F1: 53.97
6-граммы → Precision: 0.4667, Recall: 0.4516, F1: 45.90

ChrF Score (ручной, среднее по уровням): 65.46
ChrF Score (sacrebleu): 64.87

Таким образом, среднее значение ChrF Score составляет примерно 65%.
Это свидетельствует о хорошем уровне совпадения между гипотезой и эталоном. Несмотря на различия в формулировках («Меня зовут» vs «Я зовусь», «вас» vs «вы»), большая часть символьных фрагментов совпадает, особенно в ключевых словах и структуре фразы.
Если будет необходимо более точное совпадение, можно установить граничное значение, при котором перевод будет считаться успешным.

Edit Distance

Edit Distance, также известное как Levenshtein Distance — это метрика, измеряющая минимальное количество операций редактирования, необходимых для преобразования одной строки в другую.

Операции включают:

- Вставку символа
- Удаление символа
- Замену одного символа на другой

Эта метрика широко применяется в задачах обработки текстов, распознавания речи, исправления опечаток, поиска дубликатов и даже в биоинформатике.

Как работает Edit Distance

Edit Distance вычисляется с помощью динамического программирования, где строится матрица, отражающая стоимость преобразования каждой подстроки одной строки в другую.

Пример

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “меня”

Ответ модели: “Я”

Сравниваем посимвольно:

 - Создаем таблицу размером (len(A) + 1) x (len(B) + 1) для хранения промежуточных значений расстояний.

Ø

м

е

н

я

Ø

0

1

2

3

4

я

1

1

2

3

3

Операции редактирования:

- Вставка "м" перед "я" (1 операция)

- Вставка "е" после "м" и перед “я” (1 операция)

- Вставка "н" после "е" и перед “я” (1 операция)

Итого: 3 операции 

Edit Distance между "я" и "меня" равен 3

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import editdistance


lev_distance = editdistance.eval(reference_text, hypothesis_text)
print(f"Levenshtein Distance: {lev_distance}")
Extended Edit Distance

Extended Edit Distance (расширенное расстояние редактирования) — это метрика, используемая для измерения минимального количества операций редактирования, необходимых для преобразования одной строки в другую. В отличие от обычного Edit Distance (расстояния редактирования), которое учитывает только вставки, удаления и замены символов, Extended Edit Distance может учитывать дополнительные операции, такие как транспозиции (перестановки символов) и другие операции, в зависимости от конкретной реализации.

Как работает Extended Edit Distance

Extended Edit Distance учитывает дополнительные операции редактирования, что позволяет более точно измерять различия между строками, особенно если строки содержат перестановки символов или другие сложные изменения.

Допустим, у нас есть 2 строки.

Строка 1: “продух”

Строка 2: “проход”

Сравниваем посимвольно:

 - Создаем таблицу размером (len(A) + 1) x (len(B) + 1) для хранения промежуточных значений расстояний.

Ø

п

р

о

д

у

х

Ø

0

1

2

3

4

5

6

п

1

0

1

2

3

4

5

р

2

1

0

1

2

3

4

о

3

2

1

0

1

2

3

х

4

3

2

1

1

2

2

о

5

4

3

2

2

2

3

д

6

5

4

3

2

3

3

Операции редактирования:

- Транспозиция "д" и "х" (1 операция)

- Замена “у” на “о” (1 операция)

Итого: 2 операции

Extended Edit Distance между "продух" и "проход" равен 2

Translation Edit Rate (TER)

Translation Edit Rate (TER) — это метрика, используемая для оценки качества машинного перевода. TER измеряет количество редактирования, необходимого для преобразования перевода модели в эталонный перевод. Основные операции редактирования включают вставку, удаление, замену и перестановку слов. TER полезен для измерения усилий, необходимых для постредактирования машинных переводов.

Как работает Translation Edit Rate

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

Формула

\text{TER} = \frac{\text{Количество операций редактирования}}{\text{Количество слов в эталонном переводе}}

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “Меня зовут Александр, а вас как зовут?”

Ответ модели: “Я зовусь Александр, а вы как зовутся?”

Сравниваем по словам:

  • “Меня” заменено на “Я”

  • “зовут” заменено на “зовусь”

  • “Александр” совпадает с “Александр”

  • “а” совпадает с “а”

  • “вас” заменено на “вы”

  • “как” совпадает с “как”

  • “зовут” заменено на “зовутся”

Вычисление Translation Error Rate:

- Вставки (I): 0

- Удаления (D): 0

- Замены (S): 4

Общее количество слов в эталонном переводе: 7

\text{TER} = \frac{4}{7} \approx 0.571

Таким образом, примерно 57.1% слов в выданном моделью ответе отличаются от эталонного.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import evaluate


# Загрузка метрики TER
ter_metric = evaluate.load("ter")

# Вычисление метрики TER
results = ter_metric.compute(predictions=predictions, references=references)
print(results)
Word Error Rate (WER)

Word Error Rate (WER) — это метрика, используемая для оценки качества текстов, сгенерированных системами распознавания речи и другими системами обработки естественного языка (NLP). WER измеряет количество ошибок на уровне слов, сравнивая сгенерированный текст с эталонным. Она полезна для измерения точности систем распознавания речи и определения количества редактирования, необходимого для приведения распознанного текста в соответствие с эталонным.

Как работает Word Error Rate

WER вычисляется как отношение суммы ошибок (вставок, удалений и замен) к общему количеству слов в эталонном тексте.

Формула

\text{WER} = \frac{I + D + S}{N}

где:

- I — количество вставок (insertions).

- D — количество удалений (deletions).

- S — количество замен (substitutions).

- N — общее количество слов в эталонном тексте.

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “Меня зовут Александр, а вас как зовут?”

Ответ модели: “Я зовусь Александр, а вы как зовутся?”

Сравниваем по словам:

  • “Меня” не совпадает с “Я”

  • “зовут” не совпадает с “зовусь”

  • “Александр” совпадает с “Александр”

  • “а” совпадает с “а”

  • “вас” не совпадает с “вы”

  • “как” совпадает с “как”

  • “зовут” не совпадает с “зовутся”

Количество ошибок: 4

- Общее количество слов в эталонном тексте (N): 7

Вычисление Word Error Rate:

\text{WER} = \frac{I + D + S}{N} = \frac{0 + 0 + 4}{7} = \frac{4}{7} \approx 0.571

Ключевые различия между WER и TER:

  • WER строго сравнивает слово за словом, без учета порядка.
    Если слово стоит не на своём месте, это ошибка.

  • TER допускает перестановки (shifts), если они минимизируют общее число операций.
    Это делает TER более гибким для оценки переводов, где порядок слов может варьироваться.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import jiwer

def calc_wer(ground_truth, hypothesis):
  wer = jiwer.wer(ground_truth, hypothesis)
  print(f"Word Error Rate (WER): {wer}")
Word Information Lost (WIL)

Word Information Lost (WIL) — это метрика, используемая для оценки качества текстов, сгенерированных системами обработки естественного языка (NLP), особенно в задачах распознавания речи. WIL измеряет долю информации, потерянной при преобразовании эталонного текста в сгенерированный текст. Она учитывает количество ошибок на уровне слов, таких как вставки, удаления и замены.

Как работает Word Information Lost

WIL вычисляется на основе количества ошибок редактирования, необходимых для преобразования эталонного текста в сгенерированный текст, с учетом длины обоих текстов.

Формула

\text{WIL} = 1 - \frac{N - D - S}{N}

где:

- N — общее количество слов в эталонном тексте.

- D — количество удалений (deletions).

- S — количество замен (substitutions).

Пример

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “Меня зовут Александр, а вас как зовут?”

Ответ модели: “Я зовусь Александр, а вы как зовутся?”

Сравниваем по словам:

  • “Меня” не совпадает с “Я”

  • “зовут” не совпадает с “зовусь”

  • “Александр” совпадает с “Александр”

  • “а” совпадает с “а”

  • “вас” не совпадает с “вы”

  • “как” совпадает с “как”

  • “зовут” не совпадает с “зовутся”

Количество ошибок: 4

Общее количество слов в эталонном тексте (N): 7

Вычисление Word Information Lost:

\text{WIL} = 1 - \frac{7 - 0 - 4}{7} = 1 - \frac{3}{7} = \frac{4}{7} \approx 0.571

Таким образом, по итогам расчета, предположительно 57,1% информации может быть потеряно.

Различия между WER и WIL:

  • WER и WIL могут давать одинаковые значения, но WIL интерпретируется как потеря информации, а не просто ошибки. 

  • WIL полезна, когда важно понять, насколько смысл сохранился, особенно в задачах с семантической нагрузкой.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import jiwer


def calc_wil(ground_truth, hypothesis):
   wil = jiwer.wil(ground_truth, hypothesis)
   return wil

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

Word Information Preserved (WIP)

Word Information Preserved (WIP) — это метрика, используемая для оценки качества текстов, сгенерированных системами обработки естественного языка (NLP), такими как системы распознавания речи и машинного перевода. WIP измеряет долю информации, сохраненной при преобразовании эталонного текста в сгенерированный текст. Она учитывает количество ошибок на уровне слов, таких как вставки, удаления и замены, и оценивает, насколько хорошо система сохраняет исходную информацию.

Как работает Word Information Preserved

WIP вычисляется на основе количества ошибок редактирования, необходимых для преобразования эталонного текста в сгенерированный текст, с учетом длины обоих текстов.

Формула

\text{WIP} = \frac{N - D - S}{N}

где:

- N — общее количество слов в эталонном тексте.

- D — количество удалений (deletions).

- S — количество замен (substitutions).

Пример

Допустим, у нас есть ответ AI модели при формировании перевода диалога на китайском языке на русский язык.

Эталонный ответ: “Меня зовут Александр, а вас как зовут?”

Ответ модели: “Я зовусь Александр, а вы как зовутся?”

Сравниваем по словам:

  • “Меня” не совпадает с “Я”

  • “зовут” не совпадает с “зовусь”

  • “Александр” совпадает с “Александр”

  • “а” совпадает с “а”

  • “вас” не совпадает с “вы”

  • “как” совпадает с “как”

  • “зовут” не совпадает с “зовутся”

Количество ошибок: 4

- Общее количество слов в эталонном тексте (N): 7

Вычисление Word Information Preserved:

\text{WIP} = \frac{7 - 0 - 4}{7} = \frac{3}{7} \approx 0.429

Таким образом, примерно 42.9% информации было сохранено в выданном моделью ответе.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import jiwer


def calc_wip(ground_truth, hypothesis):
    wil = jiwer.wil(ground_truth, hypothesis)
    wip = 1 - wil  # WIP = 1 - WIL
    return wip

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

Метрики, использующие вероятности предсказания

Cross-Entropy Loss

Cross-Entropy Loss (или Кросс-энтропия) — это одна из наиболее часто используемых функций потерь в задачах классификации, особенно в нейронных сетях и языковых моделях. Она измеряет разницу между реальным распределением классов и предсказанным распределением вероятностей модели. Давайте разберёмся подробно.

1. Идея Cross-Entropy Loss

Цель этой метрики — "наказать" модель за то, насколько сильно её предсказания отклоняются от реальных меток классов. Если модель предсказывает вероятности классов правильно, значение функции будет минимальным. В противном случае функция увеличивается.

2. Формула

Для задачи с n примеров и k классов Cross-Entropy Loss вычисляется как:

L = -\frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{k} y_{ij} \log(p_{ij})

где:
- yij — истинная метка класса (0 или 1),
- pij— предсказанная вероятность класса j для примера i,
- n — общее количество примеров,
- k — количество классов.

Упрощённо для бинарной классификации ((k = 2)):

L = -\frac{1}{n} \sum_{i=1}^{n} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]

где:
-  (yi in {0, 1}) — истинная метка,
- (pi in [0, 1]) — предсказанная вероятность положительного класса.

для одного конкретного примера эта формула будет еще проще:

L = - \left[ y \log(p) + (1 - y) \log(1 - p) \right]

Пример:

Допустим, у нас есть модель, которая классифицирует изображение как одно из трёх животных:

  • Класс 0: Кошка

  • Класс 1: Собака

  • Класс 2: Лиса


Она возвращает логиты [2.0, 1.0, 0.1], а истинная метка — "кошка" (класс 0).
После применения softmax получаем вероятности [0.659, 0.242, 0.099].
Cross-Entropy Loss будет:

\text{L} = -\log(0.659) \approx 0.417

Чем выше уверенность модели в правильном классе, тем ниже значение функции потерь.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import torch
import torch.nn as nn
import torch.nn.functional as F

# Логиты от модели (до softmax)
logits = torch.tensor([[2.0, 1.0, 0.1]])

# Истинная метка (класс 0 — кошка)
true_label = torch.tensor([0])

# Инициализация функции потерь
loss_fn = nn.CrossEntropyLoss()

# Вычисление loss
loss = loss_fn(logits, true_label)
print(f"Cross-Entropy Loss: {loss.item():.4f}")

# Вероятности после softmax
probs = F.softmax(logits, dim=1)
print(f"Predicted probabilities: {probs.tolist()}")
Semantic-Aware Cross-Entropy Loss (SACEL)

Semantic-Aware Cross-Entropy Loss (SACEL) — это модифицированная функция потерь, предназначенная для оценки качества генерации текста нейросетевыми моделями. В отличие от классической cross-entropy, SACEL учитывает не только вероятность появления слов или фраз, но и их соответствие ожидаемому смыслу. Метрика penalизирует модель за высокую уверенность в семантически неверных фрагментах и поощряет уверенность в корректных.

1. Идея SACEL

Цель этой метрики — "наказать" модель как за излишнюю уверенность в принадлежности терминов или фразе к конкретной категории.
Если модель предсказывает принадлежность к категории верно и с большим показателем вероятности, значение функции будет минимальным.
Если модель предсказывает принадлежность к классу неверно или верно с низким показателем вероятности, значение будет умеренным (примерно в районе 1-2).
Если же модель предсказывает принадлежность категории неверно и с большим показателем вероятности, значения будут высокими (более 2).

На основании результатов расчета:
- в случае низких показателей вероятности можно сделать вывод о недостаточной обученности модели;
- в случае высоких показателей вероятности при неверно определенной категории можно сделать вывод об обучении модели на неверных данных.

2. Формула

Для задачи с n примеров и k классов Cross-Entropy Loss вычисляется как:

\text{SACEL}_i = - \left[ y_i \cdot \log(p_i^*) + (1 - y_i) \cdot \log(1 - p_i^*) \right]

где:
- y_i \in {0, 1} — истинная метка класса (0 или 1),
- p_i \in [0, 1] — вероятность появления фразы по logprobs,
- \hat{y}_i \in {0, 1} — фактическое решение модели (соответствует категории или нет),
- p_i^* - скорректированная вероятность:

\begin{cases} p_i, & \text{если } y_i = \hat{y}_i \\ 1 - p_i, & \text{если } y_i \ne \hat{y}_i \end{cases}

В общем виде формула выглядит так:

\text{SACEL} = \frac{1}{n} \sum_{i=1}^{n} \text{SACEL}_i

Пример:

Допустим, у нас есть 5 вопросов и ожидаемых ответов AI модели на определенный вопрос:

  1. Вопрос: у меня есть вот такой перечень понятий: расходы на восстановление права, утрата имущества, порча имущества, упущенная выгода. напиши, какие из этих понятий относятся к определению реального ущерба в Российском законодательстве, а какие нет.

    Ожидаемый ответ: К реальному ущербу относятся расходы на восстановление права, утрата имущества, порча имущества; не относится - упущенная выгода.

  2. Вопрос: у меня есть список стран: Россия, Польша, Великобритания, Азербайджан, США. в каких из этих стран проходят этапы формулы 1 в 2025 году?

    Ожидаемый ответ: в 2025 году проходят этапы формулы 1 в США, Великобритании, Азербайджане, а не проходят в России и Польше.

Теперь давайте посмотрим на ответы AI модели с рассчитанными вероятностями появления слов.

  1. Вероятность появления слова 'В': 0.0071
    Вероятность появления слова 'российском': 0.0631
    Вероятность появления слова 'законодательстве': 0.9986
    Вероятность появления слова 'к': 0.7805
    Вероятность появления слова 'понятию': 0.0000
    Вероятность появления слова 'реального': 0.9906
    Вероятность появления слова 'ущерба': 0.9999
    Вероятность появления слова 'относятся': 0.9923
    Вероятность появления слова 'утрата': 0.0007
    Вероятность появления слова 'имущества,': 0.2412
    Вероятность появления слова 'порча': 0.9988
    Вероятность появления слова 'имущества': 1.0000
    Вероятность появления слова 'и': 0.8746
    Вероятность появления слова 'упущенная': 0.9619
    Вероятность появления слова 'выгода.': 0.9871
    Вероятность появления слова 'Расходы': 0.9989
    Вероятность появления слова 'на': 1.0000
    Вероятность появления слова 'восстановление': 0.9993
    Вероятность появления слова 'права': 0.9991
    Вероятность появления слова 'не': 0.6995
    Вероятность появления слова 'являются': 0.0051
    Вероятность появления слова 'частью': 0.1858
    Вероятность появления слова 'понятия': 0.0192
    Вероятность появления слова 'реального': 0.9992
    Вероятность появления слова 'ущерба.': 0.8929

    средняя вероятность появления словосочетания после слова “относится”:
    “утрата имущества”: 0,12095 (1)

    \small SACEL = -\left[ 1 \cdot \log(0.12095) + 0 \cdot \log(1 - 0.12095) \right] = -\log(0.12095)\approx 2.112

    “порча имущества”: 0,9994 (1)

    \small SACEL = -\left[ 1 \cdot \log(0.9994) + (1 - 1) \cdot \log(1 - 0.9994) \right]=-\left[ \log(0.9994) \right] \approx 0.0006

    “упущенная выгода”: 0,9745 (0)

    здесь ответ должен быть отрицательным, но система оценила его положительным.

    \small SACEL = -\left[ 0 \cdot \log(0.9745) + 1 \cdot \log(1 - 0.9745) \right] = -\log(0.0255)\approx 3.669

    вероятность появления словосочетания:

    “расходы на восстановление права”: 0,9993 (1)

    здесь ответ должен быть положительным, но модель посчитала его отрицательным. Поэтому предсказанная вероятность положительного класса будет равна 1 - 0,9993 = 0,0007

    \small SACEL = -\left[ 1 \cdot \log(0.0007) + (1 - 1) \cdot \log(1 - 0.0007) \right]=-\log(0.0007)\approx 7.264

  2. Вероятность появления слова 'В': 0.4005
    Вероятность появления слова '2025': 0.9949
    Вероятность появления слова 'году': 0.9999
    Вероятность появления слова 'этапы': 0.9660
    Вероятность появления слова 'Формулы': 0.8278
    Вероятность появления слова '1': 0.9765
    Вероятность появления слова 'пройдут': 0.3191
    Вероятность появления слова 'в': 0.9974
    Вероятность появления слова 'России,': 0.6528
    Вероятность появления слова 'Великобритании': 0.9943
    Вероятность появления слова 'и': 0.4960
    Вероятность появления слова 'С\xd0\xa8А.': 0.6739

    вероятность появления слов:

    России: 0,6528 (0)

    ответ должен быть отрицательным, но модель оценила его положительным.

    \small SACEL = -\left[ 0 \cdot \log(0.6528) + 1 \cdot \log(1 - 0.6528) \right]=-\log(0.3472)\approx 1.058

    Великобритании: 0,9943 (1)

    \small SACEL = -\left[ 1 \cdot \log(0.9943) + 0 \cdot \log(1 - 0.9943) \right]=-\log(0.9943)\approx 0.006

    США: 0,6739 (1)

    \small SACEL = -\left[ 1 \cdot \log(0.6739) + 0 \cdot \log(1 - 0.6739) \right]=-\log(0.6739)\approx 0.395

    Азербайджан и Польша вовсе не указаны в ответе, поэтому по умолчанию укажем их 0,9999 (максимальная уверенность модели в отсутствии этапов формулы 1 в этих странах).

    В таких условиях для Польши показатель будет равен:

    \small SACEL = -\left[ 0 \cdot \log(0.0001) + 1 \cdot \log(1 - 0.0001) \right] = -\log(0.9999)\approx 0.0001

    Для Азербайджана показатель будет равен:

    \small SACEL = -\left[ 1 \cdot \log(0.0001) + 0 \cdot \log(1 - 0.0001) \right] = -\log(0.0001)\approx 9.2103

Чем ближе результат вычисления метрики к 0, тем точнее она предсказывает ответы.

Теперь посчитаем среднее значение метрики по всем данным ответам:

SACEL_{\text{ср}} = \frac{23.715}{9} \approx 2.635

Таким образом, среднее значение SACEL выше 2, что, многовероятно, свидетельствует об обучении модели на неверных или шумных данных.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

import numpy as np

def define_positive_class_prob(true_label, predicted_label, predicted_prob):
    if true_label == 1 and true_label == predicted_label:
        positive_prob = predicted_prob
    elif true_label == 1 and true_label != predicted_label:
        positive_prob = 1 - predicted_prob
    elif true_label == 0 and true_label == predicted_label:
        positive_prob = 1 - predicted_prob
    else:
        positive_prob = predicted_prob
    return positive_prob

def sacel_binary(true_labels, predicted_labels, predicted_probs):

    # Вычисляем вероятности положительного класса
    positive_probs = np.array([
        define_positive_class_prob(true_label, predicted_label, 
                                   predicted_prob)
        for true_label, predicted_label, predicted_prob in zip(true_labels, 
                                        predicted_labels, predicted_probs)
    ])

    # Устанавливаем минимальное значение epsilon для защиты от log(0)
    epsilon = 1e-10
    positive_probs = np.clip(positive_probs, epsilon, 1 - epsilon)

    # Убедимся, что все входные данные — массивы numpy
    true_labels = np.array(true_labels)

    # Вычисляем SACEL
    loss = -np.mean(
        true_labels * np.log(positive_probs) +
        (1 - true_labels) * np.log(1 - positive_probs)
    )
    print(loss)
    return loss
Label Ranking Average Precision (LRAP)

Label Ranking Average Precision (LRAP) — это метрика, используемая для оценки моделей многоклассовой классификации, особенно в задачах, где каждый пример может принадлежать к нескольким классам одновременно. Она измеряет, насколько хорошо модель ранжирует правильные метки выше неправильных.

Как работает LRAP

LRAP вычисляется следующим образом:
1. Для каждого примера определяется порядок, в котором модель ранжирует метки.
2. Вычисляется доля правильно ранжированных меток среди всех возможных пар.
3. LRAP — это среднее значение этих долей по всем примерам.

Формула для вычисления LRAP выглядит следующим образом:

\text{LRAP} = \frac{1}{|\small\text{True Labels}|} \sum_{j \in \small\text{TrueLabels}} \frac{|\{k : \text{score}_k \geq \text{score}_j \text{ and } k \in \text{TrueLabels}\}|}{\text{rank}_j}

Пример использования LRAP

Предположим, у нас есть задача многоклассовой классификации, где каждый пример может принадлежать нескольким классам одновременно. Ниже приведен пример с 3 примерами и 5 классами.

Пример данных:

  • Пример 1: Метки (A, B), Предсказанные вероятности: A=0.9, B=0.8, C=0.1, D=0.4, E=0.3

  • Пример 2: Метки (C, D), Предсказанные вероятности: A=0.2, B=0.5, C=0.7, D=0.9, E=0.1

  • Пример 3: Метки (B, E), Предсказанные вероятности: A=0.1, B=0.9, C=0.3, D=0.2, E=0.8

Вычисление LRAP:

1. Пример 1: Метки (A, B)

   - Предсказанные вероятности: [0.9, 0.8, 0.1, 0.4, 0.3]

   - Ранжирование меток: [A, B, D, E, C]

   - Доля правильно ранжированных меток:

     - A: ранжирована выше всех (1/1 = 1.0)

     - B: ранжирована выше всех неправильных (1/1 = 1.0)

2. Пример 2: Метки (C, D)

   - Предсказанные вероятности: [0.2, 0.5, 0.7, 0.9, 0.1]

   - Ранжирование меток: [D, C, B, A, E]

   - Доля правильно ранжированных меток:

     - D: ранжирована выше всех (1/1 = 1.0)

     - C: ранжирована выше всех неправильных (1/1 = 1.0)

3. Пример 3: Метки (B, E)

   - Предсказанные вероятности: [0.1, 0.9, 0.3, 0.2, 0.8]

   - Ранжирование меток: [B, E, C, D, A]

   - Доля правильно ранжированных меток:

     - B: ранжирована выше всех (1/1 = 1.0)

     - E: ранжирована выше всех неправильных (1/1 = 1.0)

Среднее значение правильно ранжированных меток для всех примеров:

\text{LRAP} =\small\frac{1}{3} \left( \frac{1.0 + 1.0}{2} + \frac{1.0 + 1.0}{2} + \frac{1.0 + 1.0}{2} \right)== \frac{1}{3}(1.0 + 1.0 + 1.0) = 1.0

Таким образом, все метки были ранжированы правильно.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from sklearn.metrics import label_ranking_average_precision_score


def calculate_lrap_score(true_labels, predicted_probabilities):


    lrap_score = label_ranking_average_precision_score(true_labels, predicted_probabilities)

    print(f'Label Ranking Average Precision (LRAP): {lrap_score:.2f}')
Label Ranking Loss (LRL)

Label Ranking Loss (или Loss for Label Ranking) — это метрика, используемая для оценки моделей многоклассовой классификации, особенно в задачах, где каждый пример может принадлежать к нескольким классам одновременно. Эта метрика измеряет, насколько правильно модель ранжирует метки.

Как работает Label Ranking Loss

Label Ranking Loss вычисляется следующим образом:
1. Для каждого примера определяется порядок, в котором модель ранжирует метки.
2. Сравнивается этот порядок с правильным порядком меток.
3. Рассчитывается доля неправильно ранжированных пар меток для каждого примера

Формула для вычисления Label Ranking Loss:

\text{LRL} = \frac{\text{Количество неправильно ранжированных пар}}{\text{Общее количество пар}}\text{Количество пар} = k \cdot (n - k)

где

k - количество истинных меток

n - общее количество меток.

Таким образом, общее количество пар - это число пар истинных (релевантных) / ложных (нерелевантных) меток.

Пример использования Label Ranking Loss

Предположим, у нас есть задача многоклассовой классификации, где каждый пример может принадлежать нескольким классам одновременно. Рассмотрим пример с 3 примерами и 4 классами.

Пример данных:

  • Пример 1: Метки (A, B), Предсказанные вероятности: A=0.9, B=0.6, C=0.8, D=0.3

  • Пример 2: Метки (C, D), Предсказанные вероятности: A=0.8, B=0.7, C=0.6, D=0.5

  • Пример 3: Метки (B, D), Предсказанные вероятности: A=0.3, B=0.6, C=0.4, D=0.5

Вычисление Label Ranking Loss:

1. Пример 1: Метки (A, B)

   - Предсказанные вероятности: [0.9, 0.8, 0.6, 0.3]

   - Ранжирование меток: [A, С, B, D]

   - Неправильные ранжирования:

     - Пара C, B: r(C)=0.8, r(B)=0.6 (неправильно)

   - Неправильные пары: 1 из 4 (C, B)

   - Label Ranking Loss = 1 / 4 = 0.25

2. Пример 2: Метки (C, D)

   - Предсказанные вероятности: [0.8, 0.7, 0.6, 0.5]

   - Ранжирование меток: [A, B, C, D]

   - Неправильные ранжирования:

     - Пара B, D: r(B)=0.7, r(D)=0.5 (неправильно)

     - Пара B, C: r(B)=0.7, r(C)=0.6 (неправильно)

     - Пара A, C: r(A)=0.8, r(C)=0.6 (неправильно)

     - Пара A, D: r(A)=0.8, r(D)=0.5 (неправильно)

   - Неправильные пары: 4 из 4 (B, D и A, C)

   - Label Ranking Loss = 4 / 4 = 1

3. Пример 3: Метки (B, D)

   - Предсказанные вероятности: [0.3, 0.6, 0.4, 0.5]

   - Ранжирование меток: [B, D, C, A]

   - Неправильные ранжирования: отсутствуют

   - Неправильные пары: 0 из 4

   - Label Ranking Loss = 0 / 4 = 0

Среднее значение Label Ranking Loss для всех примеров:

\text{LRL} = \frac{0.25 + 1.0 + 0.0}{3} = \frac{1.25}{3} = 0.4167

Таким образом, можно сделать вывод, что примерно 41,67% пар были ранжированы неверно.

Реализовать подсчет метрики в Python можно с помощью следующего кода:

from sklearn.metrics import label_ranking_loss


def calculate_lrl(true_labels, predicted_probabilities):

    # Расчет метрики Label Ranking Loss
    lrl_score = label_ranking_loss(true_labels, predicted_probabilities)

    print(f'Label Ranking Loss (LRL): {lrl_score:.2f}')
LogAUC

Log AUC (логарифмическая площадь под кривой) — это метрика, используемая для оценки качества классификационных моделей, особенно в задачах бинарной классификации. Она измеряет качество предсказаний модели путем вычисления площади под кривой ROC (Receiver Operating Characteristic), где по оси X откладывается доля ложноположительных предсказаний (False Positive Rate), а по оси Y — доля истинно положительных предсказаний (True Positive Rate).

Как работает Log AUC

Log AUC отличается от обычной AUC тем, что учитывает логарифмическое преобразование меток, что помогает сгладить воздействие крайней нечувствительности моделей к определенным классам.

Пример

Предположим, у нас есть классификационная задача, где нужно определить, будет ли пользователь покупать товар на основе его поведения.

Данные:

- Истинные метки (y): [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]

- Предсказанные вероятности (p): [0.9, 0.1, 0.8, 0.7, 0.3, 0.6, 0.2, 0.4, 0.95, 0.05]

Построение ROC-кривой:

1. Сортировка предсказанных вероятностей: 

   - [0.95, 0.9, 0.8, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1, 0.05]

2. Соответствующие истинные метки:

   - [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

3. Вычисление TPR и FPR для каждого порога:

- Порог 0.95: TPR = 1/5, FPR = 0/5, logFPR = -6
- Порог 0.9: TPR = 2/5, FPR = 0/5, logFPR = -6
- Порог 0.8: TPR = 3/5, FPR = 0/5, logFPR = -6
- Порог 0.7: TPR = 4/5, FPR = 0/5, logFPR = -6
- Порог 0.6: TPR = 5/5, FPR = 0/5, logFPR = -6 
- Порог 0.4: TPR = 5/5, FPR = ⅕, logFPR = -0.699
- Порог 0.3: TPR = 5/5, FPR = ⅖, logFPR = -0.3979
- Порог 0.2: TPR = 5/5, FPR = ⅗, logFPR = -0,2218
- Порог 0.1: TPR = 5/5, FPR = ⅘, logFPR = -0.0969
- Порог 0.05: TPR = 5/5, FPR = 5/5, logFPR = 0

Здесь, чтобы избежать вычисления логарифма от 0, принимаем по умолчанию малое значение 0,000001.

По итогам расчета график logAUC выглядит вот так:

График LogAUC
График LogAUC

По такому графику можно легко проследить, какие результаты будут при разных порогах.

Например, при пороге 0,2 модель будет воспринимать как положительные в том числе и 3 отрицательных ответа.

Давайте рассчитаем Log AUC для наших данных

import numpy as np

# Данные

tpr = np.array([1/5, 2/5, 3/5, 4/5, 5/5, 5/5, 5/5, 5/5, 5/5, 5/5])
fpr = np.array([0, 0, 0, 0, 0, 1/5, 2/5, 3/5, 4/5, 5/5])

# Логарифмируем FPR
epsilon = 1e-6
log_fpr = np.log10(fpr + epsilon)

# Сортируем по log_fpr
sorted_indices = np.argsort(log_fpr)
x = log_fpr[sorted_indices]
y = tpr[sorted_indices]

# Метод трапеций
log_auc = np.trapz(y, x)
print(f"Log AUC = {log_auc:.4f}")

Log AUC = 6.0000

Такие показатели означают, что модель очень точна в своих предсказаниях.

Чем выше Log AUC, тем лучше модель удерживает высокую точность при минимальных ложных срабатываниях.
Чем ниже Log AUC, тем быстрее она начинает ошибаться — особенно в чувствительных зонах.

Фактическая вероятность

Фактическая доля положительных примеров (или фактическая вероятность) для каждого интервала предсказанных вероятностей определяется путем подсчета количества положительных примеров в этом интервале и деления этого числа на общее количество примеров в том же интервале. Этот процесс позволяет сравнить предсказанную вероятность с фактической частотой положительных исходов в каждом интервале.

Пример

Предположим, у нас есть 10 примеров с предсказанными вероятностями и их фактическими метками (1 - положительный, 0 - отрицательный):

Пример

Предсказанная вероятность

Фактическая метка

1

0.05

0

2

0.12

0

3

0.18

1

4

0.22

0

5

0.35

1

6

0.40

1

7

0.55

1

8

0.62

1

9

0.78

1

10

0.85

1

Давайте разделим предсказанные вероятности на интервалы с шагом 0.1 и вычислим фактическую долю положительных примеров для каждого интервала.

Интервал вероятности

Предсказанные вероятности

Фактические метки

Доля положительных примеров

0.0 - 0.1

0.05

0

0 / 1 = 0.0

0.1 - 0.2

0.12, 0.18

0, 1

1 / 2 = 0.5

0.2 - 0.3

0.22

0

0 / 1 = 0.0

0.3 - 0.4

0.35, 0.40

1, 1

2 / 2 = 1

0.4 - 0.5

-

-

-

0.5 - 0.6

0.55

1

1 / 1 = 1.0

0.6 - 0.7

0.62

1

1 / 1 = 1.0

0.7 - 0.8

0.78

1

1 / 1 = 1.0

0.8 - 0.9

0.85

1

1 / 1 = 1.0

Объяснение расчета:

1. Интервал 0.0 - 0.1:
- Предсказанная вероятность: 0.05
- Фактическая метка: 0
- Доля положительных примеров: 0 / 1 = 0.0

2. Интервал 0.1 - 0.2:
- Предсказанные вероятности: 0.12, 0.18
- Фактические метки: 0, 1
- Доля положительных примеров: 1 / 2 = 0.5

3. Интервал 0.3 - 0.4:
- Предсказанные вероятности: 0.35, 0.40
- Фактические метки: 1, 1
- Доля положительных примеров: 2 / 2 = 1.0

И так далее для остальных интервалов.

Итог:

Для каждого интервала фактическая доля положительных примеров вычисляется как отношение количества положительных меток к общему количеству примеров в этом интервале. Это позволяет понять, насколько хорошо предсказанные вероятности модели соответствуют фактическим исходам.

Calibration Error (ошибка калибровки)

Calibration Error (ошибка калибровки) — это метрика, которая оценивает, насколько хорошо предсказанные вероятности модели соответствуют фактическим вероятностям событий. Она используется, чтобы понять, насколько точны предсказания модели не только в терминах классификации, но и в терминах уверенности в своих предсказаниях.

Пример использования Calibration Error

Предположим, у нас есть задача бинарной классификации, где модель предсказывает вероятность принадлежности объекта к классу "1" (например, "позитивный" или "негативный"). Мы хотим проверить, насколько хорошо предсказанные вероятности соответствуют фактическим результатам.

1. Создание калибровочного плана (Calibration Plot):
- Разделим предсказанные вероятности на интервалы (например, от 0 до 1 с шагом 0.1).
- Для каждого интервала вычислим среднее значение предсказанной вероятности и фактическую долю положительных примеров.

2. Вычисление Calibration Error:
- Рассчитаем разницу между средней предсказанной вероятностью и фактической долей положительных примеров для каждого интервала.
- Вычислим среднее значение этих разниц по всем интервалам.

Пример данных:

Интервал вероятности

Средняя предсказанная вероятность

Фактическая доля положительных примеров

0.0 - 0.1

0.05

0.10

0.1 - 0.2

0.15

0.12

0.2 - 0.3

0.25

0.22

0.3 - 0.4

0.35

0.30

0.4 - 0.5

0.45

0.40

0.5 - 0.6

0.55

0.55

0.6 - 0.7

0.65

0.60

0.7 - 0.8

0.75

0.70

0.8 - 0.9

0.85

0.80

0.9 - 1.0

0.95

0.90

Расчет Calibration Error:

Для каждого интервала рассчитываем абсолютное значение разницы между средней предсказанной вероятностью и фактической долей положительных примеров, затем вычисляем среднее значение:

\text{Calibration Error} = \frac{1}{N} \sum_{i=1}^{N} \left| \text {Predicted prob} -\text {Actual prob}\right|

где N — количество интервалов. В нашем примере:

\scriptsize\text{Calibration Error} = \frac{1}{10} ( |\ 0.05 - 0.10\ | + |\ 0.15 - 0.12\ | + |\ 0.25 - 0.22\ | + |\ 0.35 - 0.30\ | + \scriptsize+|0.45-0.40|+|0.55-0.5|+|0.65-0.60|+|0.75-0.7|+|0.85-0.8|+|0.95-0.9|\scriptsize Calibration Error=\frac{1}{10}\cdot(0.05+0.03+0.03+0.05+0.05+0.05+0.05+0.05+0.05+0.05)=\scriptsize =(1/10)*0.46=0.046

Таким образом, Calibration Error равна 0.046, что указывает на то, что модель довольно хорошо откалибрована, но есть небольшой запас для улучшения.

В этом списке метрика Semantic-Aware Cross-Entropy Loss (SACEL) не является стандартной, а была создана нами в попытке нахождения способа быстро отыскать корневую причину неверных ответов модели на те или иные вопросы. Больший упор был сделан на проеврку верности опеределения принадлежности термина или факта какой-то категории.

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

Результаты расчета по моделям:

Для измерения Precision было выбрано 15 AI-продуктов, которым были заданы одинаковые вопросы из разных категорий.

По итогам расчета только 3 продукта сумели набрать наибольший результат.

Основные найденные неисправности:

  • большая часть моделей при ответе на вопрос, связанный с творчеством группы ("почему в песне группы "Король и Шут" "Камнем по голове" путник не был веселым на празднике?"), не обращается к тексту песни, а просто придумывает ее смысл и даже строки (галлюцинирует) и на основании придуманного выдает ответ. В качестве предположения, это связано с ограничениями моделей на использование в ответах авторского контента, вследствие чего они вынуждены выдавать ответ, основываясь на общем описании творчества.

    вот один из примеров:
    "В песне "Камнем по голове" группы "Король и Шут" путник не был веселым на празднике, потому что хозяин дома (в котором проходил праздник) убил его, ударив камнем по голове.

    Согласно сюжету песни:

    • Путник устал и попросился на ночлег

    • Хозяин впустил его и пригласил на праздник

    • Во время праздника путник встретил красивую девушку (дочь хозяина)

    • Хозяин приревновал дочь к путнику

    • Хозяин ударил путника камнем по голове, убив его

    • Затем хозяин закопал тело путника в саду

    Именно поэтому путник "не был весел" на празднике - он был убит. Это типичный для творчества "Короля и Шута" мрачный сюжет с элементами хоррора и неожиданным поворотом событий."

  • одна модель при ответе на указанный выше вопрос, хоть и приводит текст песни, но проводит его неверный анализ и не способна на основании текста выдать верный ответ.

  • часть моделей при ответе на первый вопрос приводят не только все верные элементы, но и включают в них неверные (включают упущенную выгоду как один из примеров реального ущерба, когда это отдельный вид убытков согласно статье 15 ГК РФ).

  • при ответе на вопрос "напиши какие ингредиенты входят в состав коктейля Б-52 и в какой последовательности они должны использоваться для приготовления коктейля" часть моделей путаются с порядком использования ингредиентов, хоть и приводят их состав верно. Одна модель и вовсе не приводит верный состав, но еще предлагает неверный способ приготовления.

  • аналогично вопросу про творчество группы, часть моделей при ответе на вопрос "Почему машина Кристина в одноименной книге Стивена Кинга убивала людей?" галлюцинируют и сами придумывают сюжет романа, на основании чего ответчают на вопрос.

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

Для такого же количества AI-продуктов был произведен замер параметра recall.

По итогам расчета только 4 продукта смогли набрать наибольшие результаты.

По всей видимости, большая часть неисправностей с точки зрения метрики recall связана с отсутствием баланса краткости/полноты ответов у моделей.

Также был произведен расчет метрики MRR.

Для заданных вопросов ни один продукт не смог достичь максимального результата.

Лучшим показателем стал 0,866 из 1.

Были зафиксированы следующие недостатки ответов:

  • часть моделей не могут исполнить просьбу представить список в обратном порядке ("перечисли планеты солнечной системы в порядке убывания расстояния от Солнца")

  • часть моделей имеют некорректные настройки безопасности. На вопрос "напиши топ 10 лучших бомбардиров в порядке убывания" выдается стандратное сообщение о недопустимости выдачи ответов на вопросы, содержащие потенциально опасный контент. По всей видимости, модели при переводе вопроса с русского языка расценивают слово "бомбардир" как "бомбардировка".

  • одна модель вместо списка лучших бомбардиров представила список самых пострадавших от бомбардировок городов. Потенциальные причины указаны выше.

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

Также 6 продуктов из общего числа получили выдали максимальный результат по итогам расчета метрики Specificity.

По итогам были выявлены следующие неисправности:

  • часть моделей неверно опеределяет действительно отрицательные ответы и ошибочно зачисляет их в ложноположительные.

  • некоторые модели не учитывают контекст и язык заданного вопроса и, как результат, неспособны выдать ожидаемый результат.

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

Ниже указан пример итогового расчета показателей:

Благодаря имеющимся метрикам мы можем измерять качество работы как имеющихся на рынке AI моделей, так и проверять свои собственные модели на самых разных уровнях. Более такого, такие измерения можно проводить в автоматизированном виде.

Надеемся, что кому-то такой материал будет полезен в ходе собственных исследований AI.

Комментарии (0)