Объясните задачу Text Classification (Sentiment, Topic, Intent). Как бороться с дисбалансом классов в текстовых датасетах?
Краткий тезис
Text Classification — базовая задача NLP, в которой модели присваивают тексту одну или несколько меток из фиксированного набора. На практике чаще всего встречаются три подзадачи: анализ тональности (Sentiment), тематическое моделирование (Topic) и классификация интентов (Intent). Ключевая проблема при обучении — дисбаланс классов, когда одних меток в десятки раз больше, чем других. Без коррекции модель игнорирует редкие классы, что делает её бесполезной для реальных сценариев. Для борьбы применяют взвешивание потерь (class_weight), ресемплинг (оверсемплинг, андерсемплинг) и специальные метрики (macro/micro F1).
2. Проблема дисбаланса классов
Дисбаланс возникает, когда распределение меток в датасете неравномерно. Например, в задаче тональности 90% отзывов — позитивные, 5% — негативные, 5% — нейтральные. Модель, предсказывающая всегда «позитив», получит accuracy 90%, но не сможет выявить негатив.
Последствия:
- Смещение решающей границы в сторону мажоритарного класса.
- Низкий recall и precision на миноритарных классах.
- Неадекватная оценка качества по accuracy.
Причины дисбаланса:
- Естественное распределение (например, редкие интенты в чат-ботах).
- Стоимость разметки (сложно собрать много примеров редкого класса).
- Ошибки сбора данных (например, только позитивные отзывы на сайте).
3. Техники борьбы с дисбалансом
3.1 Взвешивание потерь (class_weight)
Модификация функции потерь: каждому классу присваивается вес, обратно пропорциональный его частоте.
Формула: weight_i = N / (n_classes * n_i), где N — общее число примеров, n_i — число примеров класса i.
Реализация: параметр class_weight='balanced' в scikit-learn (LogisticRegression, SVM, RandomForest) или ручное задание весов в PyTorch/TensorFlow.
Плюсы: не меняет распределение данных, легко добавить.
Минусы: может привести к переобучению на редких классах, если их слишком мало.
3.2 Оверсемплинг (Oversampling)
Увеличение числа примеров миноритарных классов путём дублирования или генерации синтетических данных.
- Random Oversampling: случайное копирование существующих примеров. Просто, но ведёт к переобучению.
- SMOTE (Synthetic Minority Over-sampling Technique): создаёт синтетические примеры путём интерполяции между соседями в пространстве признаков.
Для текста: SMOTE применяется не к сырым текстам, а к эмбеддингам (Word2Vec, BERT embeddings). Однако интерполяция в векторном пространстве может порождать неосмысленные комбинации. Альтернатива — генерация текстов с помощью LLM (например, GPT), но это дорого. - ADASYN: адаптивный SMOTE, генерирует больше примеров для классов, которые сложнее классифицировать.
Плюсы: увеличивает представительство редких классов.
Минусы: риск шума, увеличение размера датасета, время обучения.
3.3 Андерсемплинг (Undersampling)
Уменьшение числа примеров мажоритарных классов до уровня миноритарных.
- Random Undersampling: случайное удаление примеров мажоритарного класса. Просто, но теряется информация.
- Cluster-based Undersampling: кластеризация мажоритарного класса (например, K-means) и выбор центроидов или ближайших к ним точек.
- Tomek Links: удаление пар разноимённых примеров, которые являются ближайшими соседями — очищает границу.
Плюсы: уменьшает размер датасета, ускоряет обучение.
Минусы: потеря полезных данных, возможное смещение.
3.4 Комбинированные методы
- SMOTE + Tomek Links: сначала оверсемплинг SMOTE, затем удаление шумовых примеров Tomek.
- SMOTE + ENN (Edited Nearest Neighbors): после SMOTE удаляются примеры, неправильно классифицированные kNN.
3.5 Дополнительные приёмы
- Аугментация текста: синонимическая замена, back-translation, случайные вставки/удаления (NLPAug). Увеличивает разнообразие миноритарных классов без генерации шума.
- Использование предобученных моделей: zero-shot или few-shot с LLM (например, GPT-4) может обойти дисбаланс, если редкий класс описан промптом.
4. Метрики: macro/micro F1 вместо accuracy
Accuracy (доля правильных ответов) вводит в заблуждение при дисбалансе. Например, при 95% мажоритарного класса accuracy = 95%, но recall на миноритарном = 0%.
Основные метрики для несбалансированных задач:
| Метрика | Описание | Когда использовать |
|---|---|---|
| Precision | Доля истинно положительных среди всех предсказанных положительных | Когда важна точность предсказания редкого класса (например, спам) |
| Recall | Доля истинно положительных среди всех реальных положительных | Когда важно не пропустить редкий класс (например, болезни) |
| F1-score | Гармоническое среднее precision и recall | Баланс между точностью и полнотой |
| Macro F1 | Среднее F1 по всем классам (каждый класс учитывается одинаково) | Рекомендуется при дисбалансе — даёт равный вес редким классам |
| Micro F1 | Глобальное F1, агрегированное по всем классам (учитывает частоту) | Когда важна общая производительность, но редкие классы вносят малый вклад |
| Weighted F1 | Среднее F1, взвешенное по числу примеров в каждом классе | Компромисс между macro и micro |
Почему macro F1 лучше accuracy?
Accuracy = (TP+TN)/(TP+TN+FP+FN). Если классы несбалансированы, accuracy может быть высокой за счёт мажоритарного класса, скрывая провал на миноритарных. Macro F1 усредняет F1 по каждому классу, поэтому низкое качество на редком классе резко снижает метрику.
Дополнительно: ROC-AUC и PR-AUC (Precision-Recall AUC) — более информативны, чем accuracy, особенно PR-AUC для сильно несбалансированных задач.
5. Пет-проект для закрепления
Задача: Обучить классификатор тональности на датасете с сильным дисбалансом (например, 90% позитив, 10% негатив) и применить техники борьбы с дисбалансом.
Инструменты:
- Python, Pandas, scikit-learn
- NLTK или SpaCy для предобработки
- imbalanced-learn (SMOTE, RandomUnderSampler)
- Matplotlib/Seaborn для визуализации
Шаги:
- Загрузить датасет (например, SST-2 или RuSentiment для русского языка).
- Выполнить предобработку: токенизация, удаление стоп-слов, лемматизация.
- Преобразовать текст в числовые признаки (TF-IDF или FastText эмбеддинги).
- Разделить на train/test (стратифицированное разбиение).
- Обучить базовую модель (LogisticRegression) без коррекции дисбаланса — оценить accuracy и macro F1.
- Применить class_weight='balanced' — сравнить метрики.
- Применить SMOTE к эмбеддингам (использовать
make_pipelineсSMOTEиз imbalanced-learn) — обучить модель, сравнить. - Применить RandomUnderSampler — сравнить.
- Построить confusion matrix для каждой модели.
- Выбрать лучшую модель по macro F1 на тесте.
Ожидаемый результат:
- Базовая модель покажет high accuracy (~90%) но low macro F1 (~0.5).
- После применения техник macro F1 вырастет до 0.7–0.8, accuracy может немного упасть.
- Вывод: macro F1 — адекватная метрика для несбалансированных данных.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 913 | Общие принципы классификации текстов, метрики |
Навигация
- Предыдущий: 913
- Следующий: 915
- Индекс: 00. Индекс разборов