Классовый дисбаланс в Machine Learning: почему accuracy может обманывать

Классовый дисбаланс без мифов: почему accuracy может быть обманчивой, какие метрики смотреть и как менять постановку задачи под редкие события.

Содержание Следующие статьи
Содержание Классовый дисбаланс в Machine Learning: почему accuracy может обманывать
  1. Почему на неравных классах модель легко кажется умной
  2. Что именно ломается при дисбалансе
  3. На что тогда смотреть
  4. Как это почувствовать на Python-примере

Почему на неравных классах модель легко кажется умной

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

Поэтому первая взрослая реакция на дисбаланс — перестать доверять accuracy как главному критерию.

Что именно ломается при дисбалансе

Формула: раздел математики — математическая статистика
$$ Accuracy = \frac{TP + TN}{TP + TN + FP + FN} $$
Что означает эта формула

Accuracy складывает все правильные ответы вместе. При сильном дисбалансе большая масса true negatives может спрятать тот факт, что модель почти не находит редкий, но важный класс.

Что означает каждый символ
  • TP — верно найденные объекты редкого класса
  • TN — верно распознанные объекты частого класса
  • FP — ложные тревоги по редкому классу
  • FN — пропущенные объекты редкого класса

Как только видишь эту формулу в задаче с редким классом, становится ясно, почему проблема системная. Большое количество TN может сделать accuracy высокой даже у модели, которая плохо решает главную задачу.

На что тогда смотреть

Обычно полезнее смотреть precision, recall, F1, ROC-AUC, PR-AUC и саму confusion matrix. Если особенно важно не пропустить редкий класс, ключевой становится recall. Если дорого часто ошибаться ложными тревогами, нужен precision. Иногда меняют не только метрику, но и саму стратегию обучения: class weights, resampling, threshold tuning, а иногда и саму постановку бизнес-решения.

Как это почувствовать на Python-примере

example.pyPython
from sklearn.metrics import accuracy_score  # считаем наивную общую долю правильных ответов
from sklearn.metrics import recall_score  # отдельно измеряем полноту по редкому классу
from sklearn.metrics import precision_score  # оцениваем чистоту положительных срабатываний

y_true = [0, 0, 0, 0, 0, 0, 0, 1]  # только один объект относится к редкому классу
y_pred = [0, 0, 0, 0, 0, 0, 0, 0]  # модель всегда отвечает частым классом

print('accuracy', accuracy_score(y_true, y_pred))  # видим высокую accuracy даже у плохой модели
print('recall', recall_score(y_true, y_pred, zero_division=0))  # обнаруживаем, что редкий класс вообще не найден
print('precision', precision_score(y_true, y_pred, zero_division=0))  # положительных срабатываний нет совсем

Такой короткий пример очень отрезвляет. Он показывает, что дисбаланс — это не частный corner case, а полноценная задача выбора правильной метрики и стратегии обучения.

Что читать дальше

Связанные статьи по этой теме

Canary deployment для моделей: как выкатывать новую версию без лишнего риска Latency в ML API: почему быстрая модель важна не меньше точной Batch inference и real-time inference: как выбирать режим работы модели
Вернуться в блог