← Назад к вопросам

Что такое сбалансированный класс в машинном обучении?

2.0 Middle🔥 131 комментариев
#Machine Learning

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сбалансированный класс в машинном обучении

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

Что такое несбалансированность?

Если в датасете для классификации одного класса гораздо больше, чем другого, возникает дисбаланс классов (class imbalance). Например:

  • Обнаружение мошенничества: 99.9% транзакций легальны, 0.1% — мошеннические
  • Медицинская диагностика: редкое заболевание есть только у 2% пациентов
  • Предсказание оттока: 95% клиентов остаются, 5% уходят

Почему это проблема?

Модель может быть ленива. Если большинство классов относится к одной категории, модель получит высокую точность (accuracy), просто всегда предсказывая доминирующий класс:

# Плохой сценарий — точность 99%, но модель бесполезна
if fraud_percentage == 0.1:
    # Модель, которая всегда говорит "не мошенничество"
    # Accuracy = 99.9%, но не поймала ни одного мошенника!
    predict_always_legitimate()

Как достичь баланса?

1. Переагрегация (Oversampling)

Увеличить количество примеров меньшинства до уровня большинства:

from imblearn.over_sampling import RandomOverSampler

oversampler = RandomOverSampler(random_state=42)
X_balanced, y_balanced = oversampler.fit_resample(X, y)

2. Подагрегация (Undersampling)

Уменьшить количество примеров большинства:

from imblearn.under_sampling import RandomUnderSampler

undersampler = RandomUnderSampler(random_state=42)
X_balanced, y_balanced = undersampler.fit_resample(X, y)

3. SMOTE (Synthetic Minority Over-sampling Technique)

Этот метод создаёт синтетические примеры меньшинства, интерполируя между существующими:

from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state=42)
X_balanced, y_balanced = smote.fit_resample(X, y)

4. Взвешивание классов

Увеличить штраф за ошибки на редком классе:

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(class_weight='balanced')
model.fit(X, y)

Какие метрики использовать?

Для несбалансированных данных accuracy не подходит. Используй:

  • Precision & Recall — показывают баланс между ложными срабатываниями и пропусками
  • F1-score — гармоническое среднее Precision и Recall
  • ROC-AUC — площадь под кривой компромисса между TPR и FPR
from sklearn.metrics import confusion_matrix, f1_score, roc_auc_score

print(f"F1-score: {f1_score(y_true, y_pred)}")
print(f"ROC-AUC: {roc_auc_score(y_true, y_proba)}")

Итог

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