Что произойдет, если удалить первое или последнее дерево в бустинге
Что проверяют
Понимаете ли вы, что градиентный бустинг это сумма деревьев, где каждое следующее обучено на остатках предыдущих, а вклады деревьев неравны. Правильный ответ асимметричный: без первого дерева модель испортится заметно, без последнего почти не изменится. Следом часто просят сравнить со случайным лесом.
Как отвечать
Предсказание бустинга это F(x) = F0 + η·(h1(x) + h2(x) + ... + hM(x)). F0 не дерево, а стартовая константа: среднее таргета в регрессии или логарифм шансов в бинарной классификации (base_score в XGBoost, boost_from_average в LightGBM, init в sklearn). Каждое дерево обучается на антиградиенте функции потерь, то есть на том, что недоделали все предыдущие.
- первое дерево: снимает самую крупную часть ошибки, его вклад максимальный. Остальные деревья учились на остатках, из которых этот вклад уже вычтен, поэтому компенсировать его некому: модель ничего не переобучает, она просто складывает. Предсказания систематически сдвинутся, и тем сильнее, чем больше
learning_rate; - последнее дерево: подгоняет уже мелкие остатки, а его вклад ещё и умножен на
η. Качество почти не изменится, а если модель переобучилась, может даже вырасти. Убрать последние деревья по сути то же, что остановить обучение раньше; - в классификации: сумма считается в пространстве логитов, так что удаление дерева сдвигает логит, а вероятность меняется через сигмоиду нелинейно.
Проверить это можно без переобучения: staged_predict в sklearn, срезы booster[a:b] в XGBoost, ntree_start и ntree_end в CatBoost. Вклад деревьев обычно быстро затухает, это хорошо видно на графике качества от числа деревьев.
Где спотыкаются
Говорят, что остальные деревья «подстроятся» и исправят потерю. После обучения ансамбль заморожен, никакой перекоррекции не происходит.
Путают бустинг со случайным лесом. В лесу деревья независимы и усредняются, удаление любого из них даёт одинаково малый эффект. В бустинге порядок и есть суть метода.
Считают, что первое дерево задаёт базовое предсказание. Базовое значение это отдельная константа, а первое дерево уже работает с остатками.