Обзор алгоритмов классификации

Три рабочие лошадки классификации — интуиция по каждой без формул.

Алгоритмов классификации много, но новичку достаточно понимать три базовых. У каждого своя простая идея. Разберём интуицию, а в следующем уроке kNN потрогаем руками.

kNN — метод ближайших соседей

kNN (k Nearest Neighbors) — относит объект к тому классу, который преобладает среди его k ближайших соседей.

Идея до смешного простая: «скажи мне, кто твои соседи, и я скажу, кто ты». Чтобы классифицировать новую точку, модель находит k ближайших к ней объектов из обучающих данных и смотрит, какого класса среди них большинство.

  • Плюсы: очень понятный, не требует «обучения» в привычном смысле.
  • Минусы: медленный на больших данных (надо считать расстояния до всех точек), чувствителен к масштабу признаков.

Логистическая регрессия

Логистическая регрессия — несмотря на слово «регрессия», это классификатор: он оценивает вероятность класса и проводит прямую границу.

Она берёт взвешенную сумму признаков (как линейная регрессия) и пропускает её через специальную функцию, которая сжимает результат в диапазон от 0 до 1 — это и есть вероятность класса. Граница решения получается прямой.

  • Плюсы: быстрая, выдаёт вероятности, легко интерпретировать вклад признаков.
  • Минусы: только прямая граница — не справится со сложно переплетёнными классами.

Деревья решений

Дерево решений — серия вопросов «да/нет» по признакам, ведущая к ответу, как блок-схема.

Дерево задаёт вопросы по очереди: «Возраст больше 30? → Доход больше 50к? → ...» и в листе выдаёт класс. Это очень наглядно: путь решения можно прочитать словами. Деревья ловят нелинейные зависимости, но одно глубокое дерево легко переобучается, поэтому на практике часто объединяют много деревьев (случайный лес, бустинг).

# Крошечное "дерево решений" руками: одобрить кредит?
def decision_tree(age, income):
    if income >= 50:
        return "одобрить"
    else:
        if age >= 30:
            return "одобрить"
        else:
            return "отказать"

cases = [(25, 40), (35, 40), (28, 60), (40, 70)]
for age, income in cases:
    print(f"возраст={age}, доход={income} -> {decision_tree(age, income)}")

Вывод:

возраст=25, доход=40 -> отказать
возраст=35, доход=40 -> одобрить
возраст=28, доход=60 -> одобрить
возраст=40, доход=70 -> одобрить

Какой выбрать

АлгоритмИдеяКогда хорош
kNNГолосование соседейМало данных, понятная геометрия
Логистическая регрессияПрямая граница + вероятностиЛинейно разделимые классы, нужна интерпретация
Дерево решенийВопросы «да/нет»Нелинейные зависимости, нужна наглядность

На практике редко знают заранее, какой метод лучше, — пробуют несколько и сравнивают по метрикам на тестовых данных. Благодаря единому интерфейсу scikit-learn это быстро.

Итог

  • kNN классифицирует по большинству среди ближайших соседей.
  • Логистическая регрессия — классификатор с прямой границей и вероятностями.
  • Дерево решений — цепочка вопросов «да/нет», наглядная и нелинейная.
  • Лучший метод обычно выбирают экспериментом, сравнивая на тестовых данных.
Проверьте себя
1. Как kNN определяет класс нового объекта?
AПроводит прямую границу через все точки
BСмотрит, какой класс преобладает среди k ближайших соседей
CЗадаёт серию вопросов «да/нет»
DВсегда возвращает самый частый класс в данных
2. Что верно про логистическую регрессию?
AЭто метод регрессии для предсказания чисел
BЭто классификатор: оценивает вероятность класса и проводит прямую границу
CЭто алгоритм кластеризации без учителя
DОна строит дерево вопросов
3. Чем удобно дерево решений?
AОно никогда не переобучается
BЕго логику можно прочитать как цепочку понятных вопросов «да/нет», и оно ловит нелинейные зависимости
CОно работает только с двумя признаками
DОно не требует данных
Поддержать проект