Классификация: базовые алгоритмы и оценка результатов
В предыдущих статьях мы разобрали жизненный цикл ML-проекта, подготовку данных (включая защиту от утечки с помощью Pipeline) и регрессию, где модель предсказывает число.
В этой статье переходим ко второй большой группе задач обучения с учителем — классификации, где модель выбирает класс (категорию). Мы разберём:
какие бывают задачи классификации
базовые алгоритмы в scikit-learn
как правильно оценивать результат (и почему одной accuracy часто недостаточно)
как работать с порогом решения и дисбалансом классовЧто такое классификация
Классификация — это задача, где целевая переменная принимает значения из набора классов.
Примеры:
спам / не спам
мошенническая операция / нормальная
клиент уйдёт / не уйдёт
тип цветка: setosa / versicolor / virginicaОсновные типы задач классификации
Бинарная классификация: 2 класса (например, 0/1).
Многоклассовая классификация: 3 и более классов (например, 0/1/2).
Мульти-лейбл: у объекта может быть несколько меток сразу (например, у статьи несколько тем).В этой статье основной фокус — на бинарной и многоклассовой классификации в scikit-learn.
Что именно выдаёт классификатор
Многие классификаторы умеют выдавать не только класс, но и оценку уверенности.
Чаще всего есть два метода:
predict(X) возвращает предсказанный класс
predict_proba(X) возвращает вероятности классов (если модель это поддерживает)Для бинарной классификации обычно получают вероятность положительного класса , а затем сравнивают её с порогом.
Порог классификации
Идея простая:
если , предсказываем класс 1
иначе предсказываем класс 0Где — порог (часто по умолчанию ).
Почему это важно:
при повышении порога модель реже ставит класс 1
при снижении порога модель чаще ставит класс 1Это напрямую влияет на ошибки разных типов, о которых мы поговорим в метриках.
Базовые алгоритмы классификации
Ниже — несколько алгоритмов, с которых удобно начинать. Все они доступны в scikit-learn.
Логистическая регрессия
Несмотря на слово регрессия в названии, логистическая регрессия — это классификатор. Он строит линейную границу между классами и часто является отличным baseline.
Практические свойства:
хорошо работает на табличных данных
быстро обучается
часто требует масштабирования числовых признаков
поддерживает predict_probaДокументация: LogisticRegression в scikit-learn
k ближайших соседей
kNN классифицирует объект по классам ближайших соседей в пространстве признаков.
Практические свойства:
качество сильно зависит от масштаба признаков, обычно нужен StandardScaler
может быть медленным на больших датасетах
хорошо подходит как простой ориентир и для небольших задачДокументация: KNeighborsClassifier в scikit-learn
Дерево решений
Дерево решений строит набор правил вида если признак меньше/больше порога, идём влево/вправо.
Практические свойства:
не требует масштабирования
легко переобучается без ограничений (важны max_depth, min_samples_leaf)
умеет работать с нелинейными зависимостямиДокументация: DecisionTreeClassifier в scikit-learn
Наивный Байес
Наивный Байес — семейство простых вероятностных моделей, часто используемых для текстов (например, спам-фильтры).
Практические свойства:
очень быстрый
хорошо работает на разреженных признаках (например, bag-of-words)
делает сильные упрощающие предположения, но иногда выигрывает благодаря устойчивостиДокументация: Naive Bayes в scikit-learn
Baseline для классификации
Как и в регрессии, в классификации полезно начать с baseline.
Пример baseline-стратегий:
всегда предсказывать самый частый класс
предсказывать классы случайно с сохранением долейВ scikit-learn это реализовано в DummyClassifier.
Baseline помогает не обмануть себя: если ваша «умная» модель почти не лучше baseline, обычно проблема в признаках, утечке, разбиении или постановке задачи.
Оценка качества: почему accuracy недостаточно
В классификации важно понимать не только сколько ошибок, но и каких именно.
Матрица ошибок
Для бинарной классификации удобно использовать матрицу ошибок (confusion matrix). Она показывает, сколько объектов каждого истинного класса модель отнесла к каждому предсказанному.
истинный класс 1, предсказали 1: верно (часто называют true positives)
истинный класс 0, предсказали 0: верно (часто называют true negatives)
истинный класс 0, предсказали 1: ложная тревога (часто называют false positives)
истинный класс 1, предсказали 0: пропуск (часто называют false negatives)!Матрица ошибок помогает понять типы ошибок модели
В scikit-learn: confusion_matrix.
Accuracy
Accuracy — доля правильных ответов.
Её удобно использовать, когда:
классы примерно сбалансированы
цена ошибок разных типов примерно одинаковаяНо при дисбалансе классов accuracy может быть обманчивой. Пример: если 99% объектов — класс 0, то модель, которая всегда говорит 0, даст accuracy 0.99, но будет бесполезной.
Precision, Recall, F1
Когда важен именно положительный класс (например, мошенничество, заболевание), часто смотрят precision и recall.
Определения (для положительного класса 1):
Где:
— число объектов класса 1, которые модель правильно предсказала как 1
— число объектов класса 0, которые модель ошибочно предсказала как 1
— сколько всего модель предсказала как класс 1Интуиция: если модель сказала “1”, как часто она права.
Где:
— число объектов класса 1, которые модель ошибочно предсказала как 0
— сколько всего объектов действительно относится к классу 1Интуиция: сколько настоящих “1” мы нашли.
F1 — одна из популярных сводных метрик, которая балансирует precision и recall:
Где:
и — значения метрик выше
произведение растёт, когда обе метрики высокие
сумма нормализует результат
множитель делает масштаб удобным: от 0 до 1В scikit-learn часто используют готовый отчёт: classification_report.
ROC-AUC и PR-AUC
Если модель выдаёт вероятности, можно оценивать её качество на всех порогах сразу.
ROC-AUC полезен как универсальная метрика ранжирования, но при сильном дисбалансе может выглядеть слишком оптимистично.
PR-AUC (area under precision-recall curve) часто информативнее при редком положительном классе.В scikit-learn:
roc_auc_score
RocCurveDisplay
PrecisionRecallDisplay!ROC и PR кривые показывают качество модели при разных порогах
Дисбаланс классов и стратификация
Если классы распределены неравномерно, важно:
делать разбиение со стратификацией, чтобы доли классов в train и test были похожи
выбирать метрики, устойчивые к дисбалансу (часто F1, PR-AUC, recall)
внимательно подбирать порог (иногда 0.5 не подходит)Разбиение: train_test_split с параметром stratify=y.
Практический пример: пайплайн, метрики, матрица ошибок
Ниже — пример для бинарной классификации на встроенном датасете о раке молочной железы. Он демонстрирует правильную структуру:
train/test split
pipeline (предобработка + модель)
оценка несколькими метриками
confusion matrix
ROC-AUC по вероятностямЧто важно в этом примере:
StandardScaler обучается только на X_train (пайплайн защищает от утечки)
ROC-AUC считается по y_proba, потому что метрике нужно ранжирование, а не жёсткий класс
одновременно считаются несколько метрик: так проще заметить перекосыКак выбрать метрику под задачу
Удобное практическое правило:
если цена ошибок примерно одинаковая и классы сбалансированы, начните с accuracy
если ложные тревоги дорогие, повышайте precision и подбирайте порог
если пропуски дорогие, повышайте recall и подбирайте порог
если нужен баланс precision и recall, используйте F1
если модель выдаёт вероятности и важен ранжирующий смысл, добавьте ROC-AUC и PR-кривуюВ прикладной задаче лучше заранее сформулировать, какая ошибка хуже:
назвать честного клиента мошенником
пропустить мошенникаЭто решение определяет метрику и порог.
Частые ошибки в классификации
оценивать качество только по accuracy при дисбалансе классов
сравнивать модели по метрике, не соответствующей бизнес-стоимости ошибок
выбирать порог 0.5 по умолчанию и не проверять, что будет при других порогах
делать предобработку до разбиения на train/test (утечка данных)
подбирать гиперпараметры и порог, глядя на test (test должен быть финальным экзаменом)Итоги
Классификация — предсказание класса (бинарного или многоклассового).
Многие модели выдают вероятности, а класс получается сравнением с порогом.
Базовые алгоритмы: логистическая регрессия, kNN, дерево решений, наивный Байес.
Для оценки качества важны не только accuracy, но и confusion matrix, precision, recall, F1, ROC-AUC и PR-кривые.
При дисбалансе классов используйте стратификацию и метрики, учитывающие редкий класс.
Для честной оценки и защиты от утечки используйте Pipeline.