Какая должна быть глубина деревьев в Random Forest и в бустинге
Что проверяют
Понимаете ли вы, что ансамбли борются с разными частями ошибки, и следует ли из этого выбор глубины.
Как отвечать
Ответ прямо вытекает из разложения ошибки на смещение и разброс.
Случайный лес это бэггинг: деревья строятся независимо, предсказания усредняются. Усреднение снижает разброс, но со смещением ничего не делает. Значит каждое дерево должно иметь низкое смещение, то есть быть глубоким, вплоть до полного разделения выборки. Отсюда max_depth=None по умолчанию в scikit-learn. Переобучения отдельного дерева не боятся: его гасит усреднение по сотне деревьев на разных подвыборках и разных подмножествах признаков. Ограничивают глубину скорее ради памяти и скорости, чем ради качества.
Градиентный бустинг строит деревья последовательно, каждое исправляет ошибки предыдущих, и ансамбль снижает именно смещение. Каждое дерево должно быть слабым, иначе первое же выучит шум и последующим останется его усиливать. Отсюда неглубокие деревья: типично от 3 до 8, по умолчанию 6 в XGBoost и CatBoost. Глубина здесь взаимодействует со скоростью обучения и числом деревьев: глубже деревья, значит нужна меньшая скорость обучения и меньше итераций.
Оговорки по конкретным библиотекам стоит назвать, они показывают практику:
- LightGBM растит дерево по листьям, а не по уровням, поэтому основной регулятор там
num_leaves, аmax_depthработает как страховка. Соотношение примерноnum_leaves <= 2^max_depth, и ставить их независимо значит получить переобучение; - CatBoost строит симметричные деревья, глубина по умолчанию 6, и это осознанная регуляризация;
- глубина не единственный рычаг: есть минимальное число объектов в листе, доля признаков и объектов на дерево, коэффициенты регуляризации.
И общий ответ на вопрос «какая должна быть»: подбирается по валидации с ранней остановкой, а названные числа это точка старта, а не догма.
Где спотыкаются
Ставят в бустинге глубину как в лесу и получают переобучение.
Ограничивают глубину в лесу, думая, что борются с переобучением.
Настраивают в LightGBM max_depth, игнорируя num_leaves.
Подбирают глубину, не трогая скорость обучения.