Как решать проблему недостатка примеров для редких классов?

«Как решать проблему недостатка примеров для редких классов?» — вопрос из категории Предобработка данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Мои практические шаги:

  1. Пересэмплинг данных:

    • Oversampling редкого класса: Использую SMOTE (Synthetic Minority Over-sampling Technique) или его вариации (Borderline-SMOTE, ADASYN), чтобы синтезировать правдоподобные примеры в пространстве признаков.
    • Undersampling частого класса: Случайно удаляю часть примеров мажоритарного класса, если данных достаточно много.
      from imblearn.over_sampling import SMOTE
      smote = SMOTE(random_state=42, k_neighbors=5)
      X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
  2. Взвешивание классов: Настраиваю параметр class_weight в алгоритмах (логистическая регрессия, SVM, деревья), чтобы увеличить штраф за ошибку на редком классе.

    from sklearn.ensemble import RandomForestClassifier
    model = RandomForestClassifier(class_weight='balanced')
  3. Выбор и адаптация метрик:

    • Игнорирую accuracy. Фокусируюсь на Precision-Recall кривой, F1-score (особенно для редкого класса) и ROC-AUC.
    • Часто использую Average Precision (PR-AUC), так как она более информативна при сильном дисбалансе.
  4. Аугментация данных (для специфичных доменов):

    • Для изображений: повороты, сдвиги, изменение яркости/контраста.
    • Для текста: synonym replacement, back translation.
    • Для временных рядов: добавление шума, временные сдвиги.
  5. Ансамблирование и специальные алгоритмы:

    • Пробую алгоритмы, устойчивые к дисбалансу (например, BalancedRandomForest из imbalanced-learn).
    • Использую ансамбли, где каждый базовый классификатор обучается на сбалансированной подвыборке (EasyEnsemble).
  6. Сбор дополнительных данных: Если возможно, приоритетом является целенаправленный сбор данных по редкому классу или использование слаборазмеченных данных (weak supervision).

Важный нюанс: Все преобразования данных (вроде SMOTE) применяются только к тренировочному набору, чтобы избежать утечки информации и получить честную оценку на валидации/тесте.