Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#913

Как работает scikit-learn для классификации текстов (TfidfVectorizer + LogisticRegression)? Когда такой пайплайн лучше нейросети?

Краткий тезис

Классический пайплайн TfidfVectorizer + LogisticRegression из библиотеки scikit-learn остаётся эффективным инструментом для задач классификации текстов при ограниченных данных, требованиях к интерпретируемости и необходимости быстрого прототипирования. Он уступает нейросетевым подходам (трансформеры, BERT) при наличии больших размеченных корпусов и потребности в глубоком учёте семантики и контекста. Разбор параметров векторизации, регуляризации и балансировки классов позволяет инженеру осознанно выбирать между «классическим ML» и глубоким обучением.

2. LogisticRegression: регуляризация и баланс классов

LogisticRegression — линейная модель бинарной или многоклассовой классификации. В контексте текстов она эффективна, так как пространство TF-IDF часто линейно разделимо для многих задач.

2.1 Параметр C (регуляризация)

Обратная сила регуляризации (по умолчанию C=1.0).

  • Малое C (например, 0.1) → сильная регуляризация, модель менее склонна к переобучению, упрощает границу решения.
  • Большое C (например, 10) → слабая регуляризация, модель подстраивается под данные, риск переобучения выше.

Для текстов с высокой разреженностью рекомендуется начинать с C=1.0 и подбирать через GridSearchCV.

2.2 Параметр penalty

  • 'l2' (по умолчанию) — добавляет штраф по квадрату весов (Ridge). Работает хорошо при мультиколлинеарности признаков.
  • 'l1' — добавляет штраф по абсолютному значению (Lasso), порождает разреженные веса (многие признаки получают нулевой коэффициент). Полезен, если нужно автоматическое отсеивание неинформативных n-грамм. Требует другого решателя (solver='liblinear').
  • 'elasticnet' — комбинация L1+L2, редко используется в текстовой классификации.

2.3 Баланс классов через class_weight

  • class_weight='balanced' — автоматически подбирает веса обратно пропорционально частотам классов. Критически важен при сильном дисбалансе (например, спам 90% / не спам 10%).
  • Можно задать вручную словарём.

2.4 Многоклассовая настройка

  • multi_class='multinomial' — лог-линейная модель (softmax). Более корректна, чем one-vs-rest (по умолчанию), если классы взаимоисключающие.
  • solver — для 'multinomial' и L2 хорошо работает 'lbfgs''.

Полный пример пайплайна:

from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

pipeline = Pipeline([
    ('vec', TfidfVectorizer(ngram_range=(1,2), max_features=10000, min_df=2)),
    ('clf', LogisticRegression(C=1.0, penalty='l2', class_weight='balanced',
                                solver='lbfgs', multi_class='multinomial',
                                max_iter=1000))
])
pipeline.fit(X_train, y_train)

3. Когда такой пайплайн лучше нейросети?

Классический пайплайн TF‑IDF + LogisticRegression обладает рядом преимуществ перед нейросетями (в т.ч. трансформерами):

КритерийКогда лучше классика
Объём данныхМеньше 5 000 – 10 000 размеченных примеров. Нейросеть переобучится или не сможет обучиться.
ИнтерпретируемостьКоэффициенты логистической регрессии — это вес каждого токена. Их можно визуализировать: топ-положительные и топ-отрицательные слова для каждого класса. Нейросеть даёт лишь attention, который не всегда корректен.
Скорость и ресурсыОбучение за секунды-минуты, инференс – миллисекунды. CPU достаточно. Нейросети требуют GPU и больше времени.
ПрототипированиеБыстрая проверка гипотез (достаточно 10⁴ документов). Можно посмотреть baseline уже через 5 минут.
Простота воспроизведенияМинимум зависимостей, воспроизводимость детерминированная (если задан random_state).

Типичные задачи, где классика доминирует:

  • Классификация коротких текстов (заголовки, категории товаров).
  • Скоринг тональности (3–5 классов) на небольших корпусах (Twitter, отзывы).
  • Детекция спама/флуда.
  • Определение языка текста.

4. Когда уступает нейросети?

АспектОграничения TF‑IDF + LogRegЧем лучше нейросеть
СемантикаСкрытый смысл (синонимия, перефразирование) не учитывается.Word2Vec/BERT/LaBSE дают семантически близкие векторы.
КонтекстTF‑IDF — «мешок слов» (bag-of-words). Порядок слов игнорируется, n-gram ограничен 3–5.Трансформеры через self-attention учитывают позицию и контекст, разрешая многозначность.
Перенос обучения (transfer learning)Нет. Модель учится только на заданном корпусе.Предобученные модели (RuBERT, ruT5) не требуют больших размеченных данных для downstream задачи.
Обработка OOV (out-of-vocabulary)Слова, не вошедшие в словарь (новые, опечатки, морфологические формы) игнорируются.Subword токенизация (BPE, WordPiece) покрывает любые редкие токены.
Глубокие зависимости (long-range)Биграммы/триграммы не улавливают зависимости между далёкими словами (напр., согласование в начале и конце предложения).Self-attention обрабатывает всю последовательность.

Когда выбирать нейросеть:

  • Есть более 20 000–50 000 размеченных документов (или можно использовать few-shot с предобучением).
  • Важна семантическая близость (например, рекламная классификация: «купить» и «приобрести» должны быть близкими).
  • Задача требует понимания контекста (например, анализ тональности с учётом отрицаний, иронии).

5. Пет-проект для закрепления

Задача: Сравнить пайплайн TF‑IDF + LogisticRegression и BERT-классификатор на задаче бинарной тональности русскоязычных отзывов (коротких, ≤100 слов). Определить, при каком размере выборки классика перестаёт уступать нейросети.

Инструменты:

  • Python + scikit-learn (пайплайн)
  • 🤗 Transformers (RuBERT-tiny2 для быстрой проверки)
  • Данные: SentiRuEval_2015 или любая коллекция отзывов с метками «положительно/отрицательно» (например, отзывы с kinopoisk)

Шаги:

  1. Загрузить и предобработать (привести к нижнему регистру, удалить лишние символы — не лемматизировать, так как TF‑IDF справится с морфологией за счёт n-gram).
  2. Разбить на 3 набора: 100, 500, 2000, 10 000 сбалансированных примеров (уменьшать случайной выборкой).
  3. Обучить TF‑IDF + LogReg (C=1, ngram=(1,2), max_features=5000, class_weight=balanced).
  4. Обучить RuBERT-tiny2 (2 эпохи, batch_size=16, learning_rate=2e-5). Заморозить большие BERT для ускорения.
  5. Оценить F1-score (macro) на отложенной тестовой выборке для каждой подвыборки.

Ожидаемый результат:

  • При 100–500 примерах классика выигрывает по F1 (0.70–0.75 vs 0.50–0.65 для BERT).
  • При 2000+ примерах нейросеть начинает догонять, при 10 000+ обгоняет классику на 2–5 пунктов (если данные разнообразны).
  • Вывод: граница перехода — около 5 000–10 000 размеченных документов при отсутствии предобучения на домене.

Связь с другими вопросами

ВопросТема
914Сравнение Naive Bayes, SVM и LogisticRegression для текстов

Навигация

  • Предыдущий: 912
  • Следующий: 914
  • Индекс: 00. Индекс разборов