MLдерево решенийdecision treeклассификация

Дерево решений (decision tree): как работает для аналитика

2026-07-11 7 мин

Дерево решений — это модель, которая предсказывает, задавая данным последовательность вопросов «да/нет» и спускаясь по веткам до листа с ответом. По сути это автоматизированная блок-схема, где каждое ветвление подобрано так, чтобы максимально «разделить» данные. Их любят за наглядность: готовое дерево можно распечатать и показать бизнесу. Разберу, как оно устроено, почему легко переобучается и зачем из деревьев собирают леса и бустинги.

Как дерево решений принимает решение?

Начинаем в корне со всей выборкой и задаём вопрос по одному признаку с порогом: например, «сумма заказа больше 3000?». Данные делятся на две ветки, и в каждой мы снова ищем лучший вопрос. Так продолжается, пока в узле не останутся достаточно «чистые» группы — почти все одного класса (для классификации) или с близкими значениями (для регрессии). Конечные узлы называются листьями, в них и лежит предсказание.

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

Как дерево выбирает, по какому признаку делить?

Оно перебирает признаки и пороги и выбирает то разбиение, которое сильнее всего уменьшает «неоднородность» узла. Для классификации неоднородность меряют двумя способами: энтропия (информационный выигрыш) и коэффициент Джини. Оба про одно — насколько в группе перемешаны классы: если в узле поровну оттока и не-оттока, беспорядок максимальный; если почти все одного класса — минимальный. Алгоритм жадно берёт разбиение, которое даёт самые чистые ветки.

Для регрессии вместо Джини минимизируют разброс значений таргета внутри веток (обычно через сумму квадратов отклонений). На практике разница между энтропией и Джини почти не влияет на результат — Джини чуть быстрее считается и стоит по умолчанию в большинстве библиотек. Важно другое: дерево жадное, оно оптимизирует каждый шаг локально и не гарантирует глобально лучшую структуру.

Почему деревья так легко переобучаются?

Потому что без ограничений дерево будет расти, пока не разложит обучающую выборку по идеально чистым листам — вплоть до одного объекта на лист. Такое дерево запомнит train наизусть вместе с шумом и провалится на новых данных. Это классическое переобучение, и деревья подвержены ему сильнее многих моделей.

Лечится это ограничениями роста: максимальная глубина, минимальное число объектов в листе или для разбиения, максимальное число листьев. Ещё один приём — обрезка (pruning): вырастить дерево полностью, а потом отсечь ветки, которые не улучшают качество на валидации. Проверять, не переобучилось ли дерево, нужно так же, как любую модель — кросс-валидацией и разрывом метрик train/test.

В чём сильные и слабые стороны деревьев?

Сильные стороны делают их удобным первым инструментом. Дерево наглядно и интерпретируемо — видно, какие вопросы важны и в каком порядке. Ему не нужна нормализация признаков, оно спокойно работает со смесью числовых и категориальных, устойчиво к монотонным преобразованиям и само отбирает важные признаки. Плюс оно ловит нелинейности и взаимодействия без ручного feature engineering.

Слабые стороны — обратная сторона гибкости. Одиночное дерево нестабильно: поменяли пару строк в данных — структура может перестроиться целиком. Оно склонно к переобучению и хуже работает на гладких линейных зависимостях, где обычная регрессия точнее и компактнее. Именно нестабильность и подтолкнула идею: а что, если усреднить много деревьев?

Чем случайный лес и бустинг отличаются от одного дерева?

Оба — ансамбли, то есть комбинации многих деревьев, но собирают их по-разному. Случайный лес (random forest) строит много деревьев независимо и параллельно, каждое на случайной подвыборке строк и признаков, а потом усредняет их ответы (голосованием или средним). Усреднение гасит нестабильность отдельного дерева и резко снижает переобучение — лес почти всегда лучше одиночного дерева и требует минимум настройки.

Градиентный бустинг строит деревья последовательно: каждое следующее исправляет ошибки предыдущих. Он обычно точнее леса на табличных данных, но чувствительнее к настройке и легче переобучается при агрессивных параметрах. Про него у меня есть отдельный разбор — градиентный бустинг для аналитика. Практическое правило: одиночное дерево — чтобы понять и показать логику, лес — как крепкий бейзлайн почти без настройки, бустинг — когда выжимаешь максимум качества.

Где аналитику это пригодится?

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

Потрогать деревья и ансамбли на живых данных можно в Python-тренажёре, а типовые вопросы по ML и статистике с разбором собраны в банке вопросов. Если хочется сначала укрепить базу SQL, с которой начинается любая аналитика, — есть бесплатный курс с нуля.

Закрепи ML на практике
Python-задачи через pandas, scipy и sklearn — попробуй бесплатно.
Python-тренажёр →