Решающие деревья и ансамбли
1. Как строится решающее дерево?
Процесс построения (жадный алгоритм):
- Начинаем с корня (все данные)
- Выбираем лучший признак и порог для разделения
- Для каждого признака перебираем возможные пороги
- Считаем, насколько разделение улучшит качество
- Выбираем лучший вариант - Делим данные на две части
- Рекурсивно повторяем для каждой части
- Останавливаемся, когда:
- Все объекты в узле одного класса
- Достигли максимальной глубины
- В узле слишком мало объектов
Критерии разделения:
- Классификация:
- Джини (Gini): $Gini = 1 - Σ(p_i²)$
- Энтропия (Entropy): $H = -Σ(p_i·log(p_i))$
- Регрессия:
- MSE (Mean Squared Error): $MSE = \frac{1}{n}Σ(y_i - \hat{y})²$
Простой пример:
"Купить квартиру?"
├── Цена > 10 млн? (Да/Нет)
│ ├── Да → Район = центр? → [Да: покупаем, Нет: не покупаем]
│ └── Нет → Метро рядом? → [Да: покупаем, Нет: смотрим дальше]
2. Плюсы и минусы дерева
✅ Плюсы:
- Интерпретируемость — можно понять логику решений
- Нужна минимальная подготовка данных:
- Работает с категориальными признаками
- Не требует масштабирования
- Устойчив к выбросам - Быстрое обучение и предсказание
- Улавливает нелинейные зависимости
❌ Минусы:
- Склонность к переобучению — главная проблема!
- Нестабильность — небольшое изменение данных может дать совсем другое дерево
- Плохо работает с линейными зависимостями (лучше линейная модель)
- Жадный алгоритм — может не найти глобальный оптимум
- Проблемы с экстраполяцией — плохо предсказывает вне диапазона обучения
3. Как регуляризировать дерево?
Регуляризация = ограничение сложности
Основные гиперпараметры:
-
max_depth — максимальная глубина дерева
- Чем меньше, тем проще модель
- Обычно: 3-10 для ансамблей, 10-30 для одиночного дерева -
min_samples_split — минимальное число объектов для разделения узла
- Пример: min_samples_split=10 → не делим узлы с <10 объектов -
min_samples_leaf — минимальное число объектов в листе
- Пример: min_samples_leaf=5 → в каждом листе ≥5 объектов -
max_features — максимальное число признаков для поиска разделения
- Пример: max_features=5 → смотрим только 5 случайных признаков -
ccp_alpha — параметр обрезки (Cost Complexity Pruning)
- Автоматически удаляет незначимые ветви
Практика:
# Хорошие стартовые значения
params = {
'max_depth': 5, # не слишком глубоко
'min_samples_split': 20, # узлы с ≥20 объектов
'min_samples_leaf': 10, # листья с ≥10 объектов
'max_features': 'sqrt' # √(число признаков)
}
4. Почему дерево склонно к переобучению?
Главные причины:
- Может расти до полного разделения — пока каждый объект не попадёт в свой лист
- Запоминает шум и выбросы в данных
- Варьирование в данных воспринимает как закономерность
- Слишком сложные правила — тысячи условий
Аналогия: Студент, который запоминает ответы на билеты, а не понимает тему.
Как проявляется:
- На обучающих данных: 99% точности
- На новых данных: 60% точности
- Дерево имеет сотни листьев
5. Что такое бэггинг?
Bagging = Bootstrap Aggregating
Идея:
- Создаём много случайных подвыборок из данных (с возвращением)
- Обучаем на каждой подвыборке отдельную модель
- Усредняем предсказания всех моделей
Как работает:
Исходные данные: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Бутстрэп-выборки (пример):
Выборка 1: [2, 2, 3, 5, 5, 7, 8, 9, 10, 10] # с повторениями
Выборка 2: [1, 1, 3, 4, 6, 6, 7, 7, 9, 9]
Выборка 3: [1, 2, 4, 4, 5, 6, 8, 8, 10, 10]
... и так 100 выборок
Обучаем 100 деревьев → усредняем их предсказания
Плюсы:
- Уменьшает дисперсию (разброс предсказаний)
- Устойчивее к переобучению
- Можно распараллелить
Пример: Random Forest
- Бэггинг + случайный выбор признаков
- Одно из лучших решений "из коробки"
6. Что такое бустинг?
Boosting = Последовательное усиление
Идея:
- Обучаем первое простое дерево
- Анализируем ошибки — на каких объектах ошиблось
- Обучаем второе дерево, которое исправляет ошибки первого
- Повторяем много раз, каждое новое дерево исправляет ошибки предыдущих
Как работает:
Шаг 1: Дерево 1 → ошибки на [X1, X3, X7]
Шаг 2: Дерево 2 (фокусируется на [X1, X3, X7]) → ошибки на [X2, X5]
Шаг 3: Дерево 3 (фокусируется на [X2, X5]) → ошибки на [X4, X9]
... и так 100 раз
Особенности:
- Последовательно, а не параллельно
- Каждое следующее дерево зависит от предыдущих
- Обычно мелкие деревья (пни, depth=3-6)
Примеры:
- AdaBoost — первые бустинговые алгоритмы
- Gradient Boosting (XGBoost, LightGBM, CatBoost) — современные
7. Почему в бустинге используют деревья, а не линейные модели?
Деревья лучше подходят, потому что:
- Гибкость — улавливают сложные нелинейные зависимости
- Автоматический feature engineering — создают взаимодействия признаков
- Устойчивость к разным типам данных (числовые, категориальные)
- Интерпретируемость ансамбля из сотен деревьев всё ещё можно анализировать
- Эффективность — быстрое обучение и предсказание
Проблемы линейных моделей для бустинга:
- Слабая гибкость — плохо улавливают сложные зависимости
- Чувствительность к мультиколлинеарности
- Требуют масштабирования и обработки признаков
- Меньшая эффективность при последовательном улучшении
Исключение: Есть линейные бустеры, но они менее популярны.
8. Что будет, если убрать первое дерево?
В бэггинге (Random Forest):
- Почти ничего не изменится — деревья независимы
- Качество снизится незначительно (на 1/n_trees)
- Пример: было 100 деревьев → стало 99, качество упадёт на ~1%
В бустинге (Gradient Boosting):
- Катастрофа! — всё сломается
- Второе дерево обучалось на ошибках первого
- Третье — на ошибках первого и второго
- Без первого дерева вся последовательность теряет смысл
Аналогия:
- Бэггинг: Хор из 100 певцов, одного заболевшего не заметят
- Бустинг: Эстафета, если первый бегун не побежал — эстафета сорвана
9. Что будет при увеличении числа деревьев в 100 раз?
Для бэггинга (Random Forest):
Было: 10 деревьев → Стало: 1000 деревьев
Что произойдёт:
1. Качество: Сначала улучшится, потом выйдет на plateau
- После 100-200 деревьев улучшения почти нет
- Закон убывающей отдачи
2. Время обучения: Увеличится в ~100 раз
3. Память: Нужно хранить в 100 раз больше деревьев
4. Предсказание: Медленнее в 100 раз
Рекомендация: Для Random Forest достаточно 100-500 деревьев.
Для бустинга (Gradient Boosting):
Было: 10 деревьев → Стало: 1000 деревьев
Что произойдёт:
1. Высокий риск переобучения! — каждое новое дерево может запоминать шум
2. Качество: Сначала улучшится, потом может ухудшиться (переобучение)
3. Нужна регуляризация:
- Уменьшить learning rate (шаг обучения)
- Использовать раннюю остановку
4. Время: Очень долгое обучение
Рекомендация: Для бустинга лучше увеличивать не число деревьев, а их качество.
Ключевые выводы:
Правильный подход:
- Начинайте с Random Forest — проще, устойчивее, хороший baseline
- Для максимального качества — пробуйте Gradient Boosting (XGBoost, LightGBM)
- Контролируйте сложность — регуляризуйте деревья в ансамбле
- Используйте раннюю остановку в бустинге
- Не гонитесь за количеством — 100 хороших деревьев лучше, чем 1000 плохих
Практические числа:
- Random Forest: 100-500 деревьев, depth=10-30
- Gradient Boosting: 100-1000 деревьев, depth=3-6, learning_rate=0.01-0.1
- Обязательно: валидация и подбор гиперпараметров!
Оставить отзыв
Комментарии
Загрузка комментариев...
★ Оставить отзыв