Метрики и оценка качества

Учимся честно измерять качество модели и не обманываться одной метрикой.

Метрика — число, которое измеряет, насколько хорошо модель решает задачу на отложенных данных.

Зачем нужны метрики

Без измерения нельзя понять, стало ли лучше после дообучения. Метрики считают на валидации или тесте — данных, которые модель не видела при обучении. Иначе оценка будет завышенной (модель просто запомнила обучающую выборку).

Основные метрики классификации

МетрикаСмысл
accuracyдоля верных ответов от всех
precisionиз помеченных «да» — сколько действительно «да»
recallиз всех настоящих «да» — сколько нашли
F1баланс precision и recall

Почему accuracy обманчива

Если 95% писем — не спам, модель, которая всегда отвечает «не спам», даст accuracy 95% — и при этом бесполезна. Посчитаем метрики честно на чистом Python (реально запускается):

y_true = [1, 0, 1, 1, 0, 0, 1, 0]
y_pred = [1, 0, 0, 1, 0, 1, 1, 0]

tp = sum(t == 1 and p == 1 for t, p in zip(y_true, y_pred))
fp = sum(t == 0 and p == 1 for t, p in zip(y_true, y_pred))
fn = sum(t == 1 and p == 0 for t, p in zip(y_true, y_pred))
tn = sum(t == 0 and p == 0 for t, p in zip(y_true, y_pred))

acc = (tp + tn) / len(y_true)
prec = tp / (tp + fp)
rec = tp / (tp + fn)
f1 = 2 * prec * rec / (prec + rec)

print("accuracy :", round(acc, 2))
print("precision:", round(prec, 2))
print("recall   :", round(rec, 2))
print("F1       :", round(f1, 2))

Вывод:

accuracy : 0.75
precision: 0.75
recall   : 0.75
F1       : 0.75

Как работает под капотом

В transformers метрики подключают к Trainer через функцию compute_metrics, которая получает предсказания и истинные метки и возвращает словарь чисел. Часто используют библиотеку evaluate от Hugging Face — в ней десятки готовых метрик (accuracy, f1, BLEU для перевода, ROUGE для суммаризации). Trainer вызывает compute_metrics на каждой оценке и логирует результат, чтобы вы видели прогресс по эпохам.

Частые ошибки

  • Оценивать на обучающей выборке. Это даёт ложно высокие числа; нужен отдельный тест.
  • Смотреть только на accuracy при дисбалансе. При редком классе важнее precision/recall/F1.
  • Путать метрику с loss. Loss оптимизируют при обучении, метрики — для понятной оценки качества.

Итог

  • Метрики считают на отложенных данных, а не на обучающих.
  • accuracy обманчива при дисбалансе классов.
  • precision, recall и F1 дают более полную картину.
  • В Trainer метрики подключают через compute_metrics; готовые есть в evaluate.
Проверьте себя
1. Почему accuracy может вводить в заблуждение?
AОна всегда занижена
BПри дисбалансе классов модель-«заглушка» даёт высокую accuracy, будучи бесполезной
CЕё нельзя посчитать
DОна работает только для текста
2. Что измеряет recall?
AДолю верных среди помеченных «да»
BКакую часть всех настоящих «да» модель нашла
CСкорость инференса
DРазмер модели
3. На каких данных нужно считать метрики качества?
AНа обучающих
BНа отложенных (валидация/тест), которые модель не видела
CНа случайных числах
DНа словаре токенизатора