Выбирают подмножество признаков в отдельных вершинах дерева или для всего дерева целиком?
Что проверяют
Знаете ли вы, как именно устроена случайность в ансамблях деревьев, и не путаете ли случайный лес с методом случайных подпространств. Следом обычно спрашивают, какой max_features стоит по умолчанию в scikit-learn и что будет, если его уменьшить.
Как отвечать
Короткий ответ: в классическом случайном лесе Бреймана подмножество признаков выбирается заново в каждой вершине, при каждом поиске разбиения. Одно подмножество на всё дерево это другой метод, random subspace (метод случайных подпространств Хо), и в бустингах он тоже встречается.
- Random Forest: в каждом узле случайно берутся
max_featuresпризнаков, и лучший сплит ищется только среди них. В scikit-learn дляRandomForestClassifierпо умолчанию"sqrt", а дляRandomForestRegressorзначение1.0, то есть все признаки; - Extra Trees: тоже подмножество на узел, плюс случайные пороги вместо поиска лучшего;
- XGBoost: есть все три уровня,
colsample_bytree,colsample_bylevelиcolsample_bynode, и они перемножаются; - LightGBM:
feature_fractionдействует на дерево,feature_fraction_bynodeна узел; - CatBoost: параметр
rsmзадаёт долю признаков при выборе разбиения.
Зачем выбирать на уровне узла: сильный признак не исчезает из дерева целиком, он просто попадает не в каждый сплит. Деревья получаются разными по структуре, корреляция между ними падает, и усреднение сильнее снижает дисперсию. Если брать подмножество на всё дерево, часть деревьев лишается ключевого признака и становится заметно слабее.
Где спотыкаются
Путают бутстрэп строк с выбором признаков. Бэггинг выбирает объекты для каждого дерева, а подмножество признаков это отдельный механизм, в лесу он работает на уровне узла.
Называют max_features отбором признаков. Модель в целом всё равно использует все признаки, просто в разных узлах разные.
Не думают о шумных данных. Если полезных признаков мало, а шумовых сотни, при маленьком max_features в узел часто не попадает ни одного полезного, и качество проседает.