сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Классический ML

Деревья решений и ансамбли

Зачем это спрашивают

Бустинг на деревьях - дефолтная прод-модель для табличных данных. Поэтому «чем лес отличается от бустинга» и «что крутить в гиперпараметрах» звучат почти на каждом DS-собесе. Проверяют не экзотику, а то, чем ты пользуешься каждый день.

Типовые формулировки: «чем Random Forest отличается от градиентного бустинга?», «что будешь тюнить первым?», «почему дерево не предсказало значение выше, чем было в обучении?».

// Хорошая новость: вся тема держится на одной оси - смещение против дисперсии. Разберёшься с ней, и ответы начнут собираться сами.

Одно дерево и цена его жадности

Дерево играет в «двадцать вопросов». На каждом шаге оно перебирает признаки и пороги и выбирает тот, который сильнее всего делит данные на однородные части: в классификации однородность меряют через Gini или энтропию, в регрессии - через разброс значений. Выбрало - и растит дальше, назад не оглядываясь.

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

// И ещё одно врождённое свойство, которое любят спрашивать: дерево не умеет экстраполировать. В листе лежит среднее по обучающим примерам, поэтому предсказать значение больше максимума в трейне оно не может физически. Растёт площадь квартиры - предсказанная цена упирается в потолок и стоит.

Gini и энтропия
две меры того, насколько в узле всё вперемешку; сплит выбирают по их падению

Random Forest: толпа, которая гасит шум

Идея простая до наглости. Одно дерево шумит - давайте вырастим много разных и усредним. Как усреднение шумных замеров: каждый ошибается в свою сторону, а вместе получается ровнее.

Чтобы деревья вышли действительно разными, случайность добавляют дважды. Во-первых, каждое учится на своей выборке, собранной из исходной с возвращением. Во-вторых, в каждом узле сплит выбирается не из всех признаков, а из случайной их горстки. Приём целиком называют бэггингом.

Деревья не зависят друг от друга, поэтому обучение легко раскидать по ядрам. Приятный бонус: объекты, не попавшие в выборку конкретного дерева, можно использовать как проверочные - получается OOB-оценка (out-of-bag), почти бесплатная валидация.

// Стоит понимать, что именно лечит лес. Он гасит чувствительность к выборке, но не лечит систематическую ошибку. Если одиночное дерево слишком примитивно для задачи, тысяча таких же примитивных ничего не спасёт.

бэггинг
обучить много моделей на разных случайных выборках и усреднить их ответы

Бустинг: деревья чинят друг за другом

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

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

// Три главные библиотеки делают одно и то же немного по-разному. LightGBM растит дерево в сторону самого выгодного листа - выходит глубже и переобучается легче. XGBoost растит по уровням. CatBoost умеет категориальные признаки из коробки, кодируя их так, чтобы объект не подглядывал в собственный ответ.

ранняя остановка
перестать добавлять деревья, как только метрика на валидации перестала улучшаться
learning rate
насколько сильно каждое новое дерево вмешивается в общий ответ

Стекинг: модель, которая решает, кому верить

Стекинг собирает вместе разные модели - лес, бустинг, линейку, - а поверх сажает ещё одну, мета-модель. Её задача не усреднить всех поровну, а выучить, в каких случаях чей прогноз надёжнее.

// Тонкость, которую и проверяют: прогнозы базовых моделей для обучения мета-модели надо брать out-of-fold, то есть каждый объект должен быть предсказан моделью, которая его не видела. Иначе базовая модель «помнит» ответ на этот объект, мета решит, что она гениальна, и на проде всё развалится. Блендинг - тот же приём, только прогнозы берут на отдельном отложенном куске.

out-of-fold
прогноз для объекта, полученный моделью, которая при обучении его не видела

Как отвечать: «Чем Random Forest отличается от градиентного бустинга?»

Лес строит глубокие деревья независимо, каждое на своей случайной выборке, и усредняет - это бэггинг, он гасит чувствительность к данным. Бустинг строит мелкие деревья по очереди, и каждое доучивает ошибки предыдущих - он бьёт по систематической ошибке. На практике разница такая: лес почти не требует тюнинга, отлично параллелится и устойчив на шумных маленьких данных, а бустинг на табличных задачах обычно точнее, но просит подобрать скорость обучения, поставить раннюю остановку и иметь честную валидацию. Я бы начал с бустинга на дефолтах с ранней остановкой, а лес держал рядом как быстрый устойчивый бейзлайн.

Названы механизм, следствие для практики и порядок действий. Видно человека, который обе модели запускал, а не читал про них.

На чём валят

  • «Бустинг всегда лучше леса»: на шумных данных и малых выборках лес устойчивее, да ещё и учится параллельно.
  • Верить встроенной важности признаков по gain: она завышает признаки с большим числом уникальных значений; надёжнее permutation importance.
  • Ждать от дерева или леса экстраполяции в регрессии: выше максимума обучающих данных они не предскажут ничего.
  • Поднять скорость обучения ради скорости и не увеличить обратно число деревьев: качество съезжает тихо и незаметно.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 23, остальные разбираются в тренажёре.

  1. #trees_ensembles1 / 5
    Почему для случайного леса обычно не нужна отдельная валидационная выборка для оценки качества?
    A)Есть out-of-bag оценка: каждый объект предсказывают деревья, не видевшие его в своём бутстрепе
    B)Лес не переобучается, поэтому оценка не нужна
    C)Качество леса математически равно качеству одного дерева на валидации
    D)Лес по определению бэггинга обучается сразу на всех данных без разбиения
    показать ответ и разбор
    +A)Есть out-of-bag оценка: каждый объект предсказывают деревья, не видевшие его в своём бутстрепе

    // разбор: При бутстрепе каждое дерево не видит ~37% объектов. Для любого объекта можно агрегировать предсказания только «чужих» деревьев — это OOB-оценка, близкая к кросс-валидации бесплатно. На собесах любят уточнить: 1 − 1/e ≈ 0.63 объектов попадает в бутстреп-выборку.

  2. #trees_ensembles2 / 5
    Как дерево решений выбирает, по какому признаку и порогу делить узел?
    A)Случайно: за устойчивость отвечает ансамбль, а не отдельный сплит
    B)Жадно перебирает кандидатов и берёт сплит с максимальным снижением неоднородности (Джини, энтропия, MSE)
    C)Обучает маленькую регрессию в каждом узле и берёт её сильнейший признак
    D)Выбирает признак с наибольшей корреляцией с таргетом по всему датасету и делит по его медианному значению
    показать ответ и разбор
    +B)Жадно перебирает кандидатов и берёт сплит с максимальным снижением неоднородности (Джини, энтропия, MSE)

    // разбор: В каждом узле дерево перебирает признаки и пороги, считая прирост «чистоты» детей (impurity decrease: Джини/энтропия для классификации, MSE для регрессии), и жадно берёт лучший вариант. Заглядывания вперёд нет — дерево может застрять в локально хорошем, глобально слабом решении; это одна из причин силы ансамблей.

  3. #trees_ensembles3 / 5
    Что будет с деревом решений без ограничений глубины и минимума объектов в листе?
    A)Останется недообученным: одиночному дереву нужен бустинг
    B)Обучение не завершится — критерий остановки обязателен
    C)Дерево дорастёт до почти чистых листьев и запомнит трейн — классическое переобучение
    D)Ничего плохого: деревья не переобучаются по построению
    показать ответ и разбор
    +C)Дерево дорастёт до почти чистых листьев и запомнит трейн — классическое переобучение

    // разбор: Без ограничений дерево ветвится, пока листья не станут чистыми — в пределе один объект на лист: нулевая ошибка на трейне и высокая дисперсия на новых данных. Контроль сложности: max_depth, min_samples_leaf, min_impurity_decrease или прунинг после построения.

  4. #trees_ensembles4 / 5
    Что такое бутстреп-выборка в бэггинге?
    A)Случайные 63% объектов датасета, взятые без повторений, — остальные 37% откладываются на валидацию
    B)Выборка, стратифицированная по таргету для баланса классов
    C)Первые n объектов после случайной перестановки датасета
    D)n объектов, взятых случайно с возвращением — часть повторится, часть не попадёт вовсе
    показать ответ и разбор
    +D)n объектов, взятых случайно с возвращением — часть повторится, часть не попадёт вовсе

    // разбор: Бутстреп — семплирование с возвращением того же размера n: в среднем попадает ~63% уникальных объектов (1 − 1/e), остальные становятся out-of-bag. Каждое дерево видит свой «взгляд» на данные — источник разнообразия, которое усреднение превращает в снижение дисперсии.

  5. #trees_ensembles5 / 5
    Кроме бутстрепа, чем ещё случайный лес рандомизирует деревья и зачем?
    A)Случайным подмножеством признаков в каждом узле — деревья декоррелируются, и усреднение сильнее режет дисперсию
    B)Случайной глубиной каждого дерева от 1 до max_depth
    C)Случайным выбором функции потерь для каждого дерева
    D)Случайными весами объектов при подсчёте критерия сплита — тот же приём перевзвешивания, что и в бустинге AdaBoost
    показать ответ и разбор
    +A)Случайным подмножеством признаков в каждом узле — деревья декоррелируются, и усреднение сильнее режет дисперсию

    // разбор: max_features — второй источник случайности: в каждом узле сплит ищется не по всем признакам, а по случайному подмножеству (классика — √p для классификации). Иначе все деревья строились бы вокруг одних и тех же сильных признаков и ошибались бы одинаково, а усреднение коррелирующих ошибок дисперсию почти не снижает.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.