Многоклассовая классификация — это задача машинного обучения с учителем, в которой модель должна отнести каждый объект ровно к одному классу из трёх или более возможных. В отличие от бинарной классификации, где ответ всегда один из двух вариантов («да/нет», «спам/не спам»), здесь пространство ответов шире: например, определение породы собаки по фотографии, распознавание языка текста или выбор категории товара в интернет-магазине.
Ключевое допущение многоклассовой задачи — взаимоисключаемость классов: один объект не может одновременно принадлежать двум категориям. Если объект может иметь несколько меток сразу, речь идёт о мультиклассовой классификации (multilabel classification) — это отдельная задача со своей механикой и метриками.
Как это работает
Большинство алгоритмов машинного обучения изначально проектировались для бинарной классификации. Чтобы адаптировать их под многоклассовую задачу, применяют две основные стратегии.
One-vs-Rest (OvR, один против всех). Для каждого класса обучается отдельный бинарный классификатор, который отвечает на вопрос: «этот объект принадлежит данному классу или всем остальным вместе взятым?» Если классов три — A, B и C, — создаются три классификатора: A против (B+C), B против (A+C) и C против (A+B). Итоговый прогноз — класс, чей классификатор дал наибольшую вероятность.
Многономиальный подход (multinomial). Вместо набора бинарных моделей обучается одна модель, которая на выходе выдаёт вектор вероятностей для всех классов сразу. Сумма вероятностей равна единице. В нейросетях для этого используется слой Softmax, преобразующий «сырые» выходы последнего слоя в распределение вероятностей. Например, при классификации рукописных цифр (0–9) модель может выдать: «цифра 7 — вероятность 0.92, цифра 1 — 0.05, цифра 4 — 0.02, остальные — близко к нулю».
Современные библиотеки, включая scikit-learn, поддерживают многоклассовую классификацию «из коробки»: все классификаторы автоматически применяют OvR, если задача выходит за рамки двух классов. Явное использование мета-оценщиков имеет смысл, когда нужно поэкспериментировать со стратегией — например, попробовать One-vs-One (OvO), где обучается по одному классификатору на каждую пару классов.
Зачем это нужно
Многоклассовая классификация — одна из самых востребованных задач в прикладном машинном обучении:
- Компьютерное зрение: распознавание объектов на изображениях (кошка, собака, лиса), определение дефектов на производстве (царапина, вмятина, трещина).
- Обработка текста: классификация тональности отзыва (позитив / нейтрал / негатив), определение тематики статьи, автоматическая маршрутизация обращений в поддержку.
- Медицина: диагностика заболеваний по снимкам или анализам, где модель выбирает одну из нескольких патологий.
- Финансы: категоризация транзакций, оценка кредитного риска по нескольким уровням.
От корректности выбора стратегии и метрик зависит, насколько модель будет полезна в реальном продукте: для одних задач важнее не пропустить редкий класс, для других — минимизировать ложные срабатывания.
Примеры
- Классификация пингвинов. По длине ласта (одному числовому признаку) модель предсказывает вид: Adelie, Gentoo или Chinstrap. Microsoft приводит этот пример для демонстрации OvR: для каждого вида обучается отдельный бинарный классификатор, а итоговый прогноз — класс с наибольшей вероятностью.
- Распознавание рукописных цифр. Модель получает изображение цифры и выбирает один из десяти классов (0–9). Это классический пример многоклассовой задачи с многономиальным выходом: слой Softmax выдаёт вероятность для каждой цифры.
- Классификация фруктов. По признакам, извлечённым из фотографии, модель определяет, что на изображении: апельсин, яблоко или груша. Каждое изображение — один объект, и он относится ровно к одному классу.
- Маршрутизация обращений. В службе поддержки текст клиента автоматически относится к одной из категорий: «оплата», «доставка», «возврат», «техническая проблема». Модель обучается на исторических тикетах и направляет новые обращения нужному специалисту.
Формула и метрики
Для оценки качества многоклассовой модели используют несколько метрик. Базовые из них:
- Accuracy (доля правильных ответов) — отношение числа верных прогнозов к общему числу объектов. Подходит, когда классы сбалансированы.
\[ Accuracy = \frac{\text{число верных прогнозов}}{\text{общее число объектов}} \]
- Precision (точность) — для каждого класса показывает, какая доля объектов, отнесённых моделью к этому классу, действительно ему принадлежит.
\[ Precision_k = \frac{TP_k}{TP_k + FP_k} \]
- Recall (полнота) — для каждого класса показывает, какую долю объектов этого класса модель смогла найти.
\[ Recall_k = \frac{TP_k}{TP_k + FN_k} \]
- F1-score — гармоническое среднее precision и recall, удобно, когда нужно учесть оба показателя.
\[ F1_k = 2 \cdot \frac{Precision_k \cdot Recall_k}{Precision_k + Recall_k} \]
В многоклассовой задаче метрики считаются для каждого класса отдельно, а затем усредняются. Различают macro-average (простое среднее по классам) и weighted-average (среднее с учётом размера класса). При сильном дисбалансе классов weighted-average даёт более честную картину. Также применяется MCC (коэффициент корреляции Мэтьюса), который учитывает все четыре элемента матрицы ошибок и хорошо работает при больших различиях в размерах классов.
Типичные ошибки
- Использование accuracy при сильном дисбалансе. Если один класс занимает 95% данных, модель может всегда предсказывать его и получать accuracy = 0.95, но быть бесполезной. В таких случаях смотрят на recall и F1 для миноритарных классов.
- Игнорирование взаимоисключаемости. Попытка применить многоклассовый подход к задаче, где объект может иметь несколько меток, приводит к неверным прогнозам. Для таких случаев нужна мультиклассовая классификация (multilabel).
- Обучение OvR без нормализации вероятностей. В некоторых реализациях OvR-классификаторы выдают несопоставимые оценки, и выбор класса по максимальному «сырому» выходу может быть некорректным. Нужно проверять, что вероятности откалиброваны.
- Недостаточное количество примеров редкого класса. Если у одного класса мало данных, модель будет плохо его распознавать. Решение — аугментация данных, взвешивание классов или генерация синтетических примеров.
Как улучшить
- Проверьте баланс классов. Постройте распределение меток. Если один класс доминирует, используйте взвешенную функцию потерь (class_weight в scikit-learn), oversampling редких классов или генерацию синтетических примеров (SMOTE).
- Экспериментируйте со стратегией. Попробуйте OvR, OvO и многономиальный подход. Для некоторых моделей (например, SVM) OvO может работать быстрее и точнее на небольших выборках.
- Настройте порог принятия решения. Вместо argmax по вероятностям можно задать пороги для каждого класса, если цена ошибки для разных классов неодинакова. Например, в медицинской диагностике лучше «перестраховаться» и направить пациента на дополнительное обследование.
- Используйте ансамбли. Объединение нескольких моделей (бэггинг, бустинг) часто даёт прирост качества на многоклассовых задачах, особенно при сложных границах между классами.
- Анализируйте матрицу ошибок. Она показывает, какие классы модель путает чаще всего. Это может подсказать, что признаки недостаточно различают именно эти категории, и нужно добавить новые данные или признаки.