Как работает ранняя остановка в деревьях
Что проверяют
Понимаете ли вы, что у одиночного дерева и у бустинга «ранняя остановка» означает разные вещи. Следом обычно спрашивают, по какой выборке останавливаться и почему у случайного леса такой проблемы почти нет.
Как отвечать
Разведите три случая:
- одиночное дерево: ранняя остановка это предобрезка (pre-pruning). Рост ветки прекращается по критерию:
max_depth,min_samples_split,min_samples_leaf,min_impurity_decreaseв scikit-learn. Валидационная выборка тут не участвует, это гиперпараметры, которые подбирают кросс-валидацией; - градиентный бустинг: деревья добавляются последовательно, и ошибка на трейне падает почти всегда. Качество на отложенной выборке считают после каждой итерации и останавливаются, если метрика не улучшалась N итераций подряд, а итоговой берут лучшую. В XGBoost это
early_stopping_roundsвместе сeval_set, в LightGBM колбэкlgb.early_stopping(stopping_rounds), в CatBoostearly_stopping_roundsиuse_best_model. ВHistGradientBoostingClassifierостановка включается сама на выборках больше 10 000 строк (early_stopping="auto",n_iter_no_change=10,validation_fraction=0.1); - случайный лес: деревья независимы, и добавление новых не ведёт к переобучению, ошибка выходит на плато. Число деревьев ограничивают ради скорости, глядя на OOB-оценку.
Хорошо добавить связь с шагом обучения: при меньшем learning_rate лучшая итерация наступает позже, поэтому ставят заведомо большое число деревьев и дают остановке найти нужное.
Где спотыкаются
Останавливают по тестовой выборке. Итерация подобрана под тест, и итоговая оценка выходит завышенной. Нужна отдельная валидация или фолды кросс-валидации.
Во временных рядах берут случайную валидацию. Модель останавливается по «будущему», которое видела в соседних строках, и на проде ведёт себя хуже.
Ставят маленькое терпение, 3-5 итераций, при шумной метрике, и обучение обрывается на случайном провале задолго до реального минимума.