Machine Learning · Теория
Деревья решений
Алгоритм, который принимает решения так же, как биолог определяет вид растения по определителю — через последовательность вопросов «да/нет».
01 — ВведениеЗачем нужны деревья
До сих пор мы изучали два алгоритма: линейную регрессию (для предсказания чисел) и логистическую регрессию (для классификации). Оба работают прекрасно, но у них есть важное ограничение — они рисуют только прямую линию между классами.
А что, если граница между классами не прямая? Что, если она ломаная, кусочная, сложной формы? Попробуйте мысленно провести прямую, которая отделит «спелый арбуз» от «неспелого», если это зависит одновременно от цвета, звука, размера и сорта. Или разделить прямой линией клетки с раком от здоровых клеток на медицинском снимке.
Деревья решений — это совершенно другой подход. Они не рисуют линии. Они задают вопросы. И через последовательность простых вопросов приходят к сложному ответу.
Дерево решений — это алгоритм, который учится
принимать решения через вопросы «да/нет».
02 — ИнтуицияОсновная идея
Подумайте, как биолог определяет вид растения в поле. Он не знает сразу ответ — он идёт по определителю:
- Листья простые или сложные?
- Если простые — с зубцами или гладкие?
- Если с зубцами — цветки белые или жёлтые?
После 5–7 вопросов биолог уверенно называет вид. Каждый вопрос сокращает количество возможных ответов. Это и есть логика дерева решений.
Игра «Акинатор»
Помните игру, где компьютер угадывает персонажа, задавая 20 вопросов? «Ваш герой мужчина?» → «Он реальный человек?» → «Он живёт в Европе?». За 20 бинарных вопросов можно различить до 220 = миллион персонажей. Дерево решений работает точно так же.
Главное отличие: биолог и создатели Акинатора составляли вопросы вручную, опираясь на свои знания. Дерево решений придумывает вопросы само, глядя на данные. Именно это делает его алгоритмом машинного обучения.
03 — СтруктураАнатомия дерева
Математики называют эту структуру «дерево», потому что она похожа на ботаническое дерево, но растёт сверху вниз — корень наверху, листья внизу. Вот как она устроена:
Дерево решений для определения дерева по ботаническим признакам
Термины
Корень — самый верхний узел, первый вопрос. С него начинается путь любого объекта.
Внутренний узел — любой вопрос, кроме корня. Делит поток объектов на две части.
Лист — конечный узел, содержащий ответ (класс или число). Дальше ветвление не идёт.
Ветвь — связь между узлами. Помечена ответом на вопрос родительского узла (обычно «да» или «нет»).
Дерево всегда бинарное в классических реализациях: каждый вопрос имеет ровно два ответа. Любой сложный вопрос можно разбить на серию бинарных — это математически удобно.
04 — ИспользованиеКак делать предсказание
Начнём с более простой части: допустим, дерево уже обучено. Как использовать его, чтобы классифицировать новый объект?
Возьмём пример с Титаником. У нас обученное дерево и новый пассажир: мужчина, 30 лет, 3-й класс. Куда его отнести — выжил или погиб?
- Начинаем с корня: «Пол — женщина?» → нет (мужчина) → идём вправо
- Следующий узел: «Возраст ≤ 9,5?» → нет (30 лет) → идём вправо
- Попадаем в лист: Погиб
Это всё. Предсказание — это просто прогулка по дереву сверху вниз, следуя ответам на вопросы. На каждом шаге мы смотрим значение нужного признака и выбираем одну из двух ветвей. Доходим до листа — получаем ответ.
Блок-схема программы
Дерево решений — это по сути обычная блок-схема с условиями if-else. Любое дерево можно записать в виде вложенных if-ов на Python. Машинное обучение здесь — в том, как эти if-ы были построены.
05 — ПримененияДва вида задач
Деревья решений универсальны — они работают и для классификации, и для регрессии. Различие только в том, что хранится в листьях.
Классификация
В листьях хранится класс — название категории. Дерево отвечает на вопросы «Какой это цветок?», «Спам или нет?», «Выживет или погибнет?».
Регрессия
В листьях хранится число — обычно среднее значение целевой переменной. Дерево отвечает на вопросы «Какая цена дома?», «Сколько просмотров соберёт видео?».
В этом курсе мы сосредоточимся на классификации — она чаще встречается на практике и проще для понимания. Но важно помнить, что регрессионные деревья тоже существуют и работают по тем же принципам.
06 — ОбучениеКак дерево обучается
Это главный и самый интересный вопрос. Мы видели, что дерево — это набор вопросов. Но откуда берутся эти вопросы? Как алгоритм решает, что спросить первым делом?
Принцип «чистоты»
Представьте, что у нас есть 100 пассажиров Титаника: 40 выжили, 60 погибли. Мы хотим разделить их на две группы одним вопросом. Какой вопрос будет лучшим?
Сравним два варианта:
| Вопрос |
Группа «Да» |
Группа «Нет» |
Итог |
| У пассажира чётный номер билета? |
20 выжили, 30 погибли |
20 выжили, 30 погибли |
Группы одинаково перемешаны |
| Пассажир — женщина? |
30 выжили, 10 погибли |
10 выжили, 50 погибли |
Группы чётко различаются |
Второй вопрос явно лучше: он реально разделяет выживших и погибших. В группе женщин почти все выжили, в группе мужчин почти все погибли. Это и есть принцип выбора вопроса — алгоритм ищет такой вопрос, после которого группы получаются максимально «чистыми».
Метрика Gini
Чтобы сравнивать вопросы численно, нужна формула «чистоты». Самая популярная — индекс Джини (Gini impurity). Идея простая: возьмём вероятности каждого класса в группе, возведём в квадрат, сложим, вычтем из единицы.
Gini = 1 − pA2 − pB2 pA — доля объектов класса A в группе, pB — доля класса B
Не пугайтесь формулы — интуитивно всё просто:
- Если в группе все одного класса (идеальная чистота): pA=1, pB=0, Gini = 1 − 1 − 0 = 0
- Если половина на половину (худший случай): pA=0,5, pB=0,5, Gini = 1 − 0,25 − 0,25 = 0,5
Чем Gini меньше — тем группа чище. Ноль = идеал, 0,5 = полный хаос (для двух классов).
Прирост информации
Качество разбиения оценивают так: берут Gini до разбиения (для всей группы) и вычитают средневзвешенный Gini двух получившихся подгрупп. Чем больше разница — тем лучше вопрос.
Gain = Giniдо − wлев · Giniлев − wправ · Giniправ wлев, wправ — доли объектов, попавших в левую и правую группы
Алгоритм перебирает все возможные вопросы по всем признакам и выбирает тот, у которого Gain максимальный. Это называется жадным подходом — алгоритм на каждом шаге выбирает локально лучший вариант, не заглядывая вперёд.
Альтернатива
Кроме Gini существует энтропия — метрика из теории информации: H = −Σ pi · log₂(pi). Работает почти так же, но немного медленнее из-за логарифмов. В sklearn можно выбрать любую через параметр criterion='gini' или 'entropy'. На практике результаты похожи.
07 — АлгоритмРекурсивное построение
Теперь соберём всё вместе. Алгоритм построения дерева называется CART (Classification and Regression Trees) — один из самых известных алгоритмов в машинном обучении. Вот он целиком:
- Взять всю обучающую выборку.
- Для каждого признака и каждого возможного порога посчитать Gain.
- Выбрать вопрос с максимальным Gain — это корень.
- Разбить данные на две подгруппы по этому вопросу.
- Для каждой подгруппы повторить шаги 2–4 (рекурсия).
- Остановиться, когда:
- в группе все объекты одного класса (Gini = 0), или
- достигнута максимальная глубина дерева, или
- в группе слишком мало объектов для дальнейшего разбиения.
- Оставшиеся группы становятся листьями. В каждом листе записывается преобладающий класс.
Заметьте: алгоритм рекурсивный. Ту же процедуру, которую применяют ко всему набору данных, потом применяют к каждой подгруппе. Дерево строится сверху вниз, ветвь за ветвью.
Дерево — это не одна модель, а процесс построения.
Каждый узел решает ту же задачу, но на меньших данных.
08 — ОпасностьГлавный враг: переобучение
А что если позволить дереву строиться без ограничений? Оно продолжит делить данные, пока в каждом листе не останется ровно одна точка. Точность на обучающих данных будет 100%. Казалось бы — идеал?
Нет. Это и есть главная проблема деревьев — переобучение (overfitting).
Переобучение
Модель «зазубрила» обучающие данные со всеми их случайностями и шумом. На обучении — 100%. На новых данных — катастрофа.
Представьте, что вы готовитесь к экзамену, заучив наизусть все 50 задач из сборника. На контрольной будут другие 50 задач по той же теме — и вы провалитесь, потому что «учились» не понимать предмет, а запоминать ответы.
Точно так же необорудованное дерево запоминает конкретные точки, а не улавливает закономерности. Решение — не давать дереву расти слишком глубоко. Это называется регуляризацией.
Признаки переобучения
- Точность на обучении сильно выше, чем на тесте (например, 99% против 70%)
- Дерево очень глубокое и ветвистое
- В листьях часто лежит всего 1–2 объекта
- Результаты нестабильны — при небольшом изменении данных структура сильно меняется
09 — НастройкаОсновные гиперпараметры
Гиперпараметры — это настройки модели, которые мы задаём до обучения. В отличие от параметров (которые алгоритм учит сам), гиперпараметры подбирает человек. Для деревьев главные три:
max_depth
Максимальная глубина дерева. Самый важный гиперпараметр. Типичные значения: 3–10. Дерево глубиной 3 задаёт максимум 3 вопроса подряд — это часто уже хорошая модель. Малая глубина защищает от переобучения, но слишком малая приводит к недообучению.
min_samples_split
Минимальное количество объектов в узле, чтобы его ещё разбивать. По умолчанию 2. Если поставить 20 — узлы с меньшим количеством объектов автоматически станут листьями. Защита от ветвления ради одиночных случайных точек.
min_samples_leaf
Минимальное количество объектов в листе. Обычно 1–5. Гарантирует, что ни один лист не будет «вырожденным» — созданным ради одного-единственного объекта.
На Python это выглядит так:
model = DecisionTreeClassifier(
max_depth=5,
min_samples_split=10,
min_samples_leaf=3
)
Правильные значения подбирают экспериментально — обычно через кросс-валидацию или grid search. Но это тема отдельного разговора.
10 — ИтогиПлюсы и минусы
Давайте подведём честный итог. У деревьев решений есть сильные и слабые стороны — знать обе стороны важно, чтобы понимать, когда применять этот алгоритм.
Сильные стороны
- Интерпретируемость. Дерево можно нарисовать и показать человеку. Врач, юрист или менеджер поймёт, почему модель приняла то или иное решение. Это бесценно в медицине и финансах.
- Не требует подготовки данных. Нормализация, кодирование категорий, масштабирование — всё это деревьям не нужно. Работают «из коробки» с любыми данными.
- Нелинейность. Улавливают сложные зависимости, которые не видит линейная модель.
- Скорость. Обучение быстрое даже на тысячах объектов. Предсказание — просто проход по дереву.
- Важность признаков. Дерево показывает, какие признаки реально влияют на результат.
Слабые стороны
- Склонность к переобучению. Без регуляризации дерево зазубривает данные.
- Нестабильность. Небольшое изменение данных может полностью перестроить дерево.
- Жадность. Алгоритм на каждом шаге выбирает локально лучший вопрос — глобально оптимальное дерево может выглядеть иначе, но его построение — очень сложная задача.
- Ступенчатые границы. Деревья рисуют только горизонтальные и вертикальные линии в пространстве признаков. Для плавных границ нужны другие модели.
- Уступают ансамблям. Одиночное дерево почти всегда проигрывает по точности ансамблям деревьев.
11 — СравнениеТри алгоритма, три границы
Мы уже знаем три алгоритма классификации: логистическую регрессию, k-ближайших соседей и деревья решений. Все они решают одну задачу — разделить объекты на классы. Но видят пространство признаков совершенно по-разному.
Посмотрите на одни и те же точки глазами трёх алгоритмов:
Одни и те же точки — три совершенно разные границы решения
В чём суть различий
Логистическая регрессия проводит одну прямую линию через всё пространство. Слева от неё — класс A, справа — класс B. Математически это формула w₁·x₁ + w₂·x₂ + b = 0. Просто, быстро, устойчиво — но работает хорошо только когда классы действительно разделяются прямой.
K-ближайших соседей вообще ничего не строит заранее. Когда приходит новая точка, алгоритм ищет её k ближайших соседей в обучающих данных и проводит голосование: «3 из 5 соседей синие → ты тоже синяя». Граница получается плавной и извилистой — она возникает как побочный эффект того, где меняется состав соседей.
Дерево решений режет пространство прямыми линиями, параллельными осям: сначала вертикальной (x₁ > 0,5?), потом горизонтальной (x₂ ≤ 0,3?) и так далее. Получаются прямоугольные зоны — «ступеньки». Отсюда и характерный вид границы.
Таблица сравнения
| |
Логистическая |
K-NN |
Дерево |
| Форма границы |
прямая |
плавная кривая |
ступени |
| Как учится |
подбирает веса |
не учится — запоминает данные |
ищет лучшие вопросы |
| Скорость обучения |
быстро |
мгновенно |
быстро |
| Скорость предсказания |
быстро |
медленно |
быстро |
| Нужен масштаб признаков |
да |
критично |
не нужен |
| Интерпретируемость |
средняя |
низкая |
высокая |
| Главная слабость |
только линейные границы |
медленно на больших данных |
переобучение |
Когда что выбирать
Логистическая регрессия
Когда зависимость близка к линейной и важно понимать, какие признаки и с каким весом влияют на результат. Классика в медицине и кредитном скоринге — там, где решение нужно объяснять формулами.
K-NN
Когда данных немного и они образуют компактные кластеры. Отличный первый baseline — почти без настройки покажет, есть ли вообще сигнал в данных.
Дерево решений
Когда важна объяснимость и границы сложные. Единственный из трёх, кто естественно работает с категориальными признаками и не требует никакой подготовки данных.
Одни и те же данные — три разные границы.
«Лучшего» алгоритма нет: есть подходящий под задачу.
12 — ПерспективаЧто дальше
Одиночное дерево — это только начало. Главная идея, выросшая из деревьев, оказалась настолько мощной, что породила целое семейство алгоритмов, которые до сих пор побеждают в конкурсах машинного обучения на табличных данных.
Random Forest
Строим не одно, а сотни деревьев на случайных подвыборках данных и признаков. Их предсказания усредняют. Одно дерево ошибается — лес голосует правильно.
Gradient Boosting
Строим деревья последовательно: каждое новое исправляет ошибки предыдущего. Алгоритмы XGBoost, LightGBM, CatBoost — фавориты Kaggle.
Оба подхода используют обычные деревья как «кирпичики». Поэтому всё, что вы сейчас узнали об одиночном дереве — фундамент для понимания самых мощных современных методов машинного обучения на табличных данных.
Понял дерево — понял половину Machine Learning.
✦ ✦ ✦