Вопрос или проблема
Я не совсем понимаю значение этих параметров xgboost или как они отличаются:
Если я укажу ровно один из этих параметров (не оба одновременно),
colsample_bylevel=0.5
colsample_bynode=0.5
разве алгоритмы не должны вести себя одинаково в обоих случаях? Можете привести пример?
Названия параметров здесь действительно очень буквальны.
Если вы разбиваете ваше дерево “по уровням” с 0.5, это значит, что на каждом уровне дерева будет случайным образом выбрано половина ваших признаков для рассмотрения.
Если вы разбиваете ваше дерево “по узлам”, это означает, что на каждом разбиении узла будет рассматриваться половина.
Это значит, что если вы делаете и то, и другое по 0.5, как в вашем примере, это будет выглядеть следующим образом на каждом уровне:
- выберите 50% признаков как набор A для этого уровня при разбиении
- выберите 50% признаков из A для рассмотрения при разбиении следующего узла
Они звучат похоже и делают нечто похожее с точки зрения определения, сколько признаков должно рассматриваться для разбиения, но на разных участках дерева.
Сначала я пробовал с этим объяснением: https://medium.com/analytics-vidhya/xgboost-colsample-by-hyperparameters-explained-6c0bac1bdc1.
Я думаю, что вещи там неправильно представлены, поэтому избегайте этого! В конце концов, я думаю, что разобрался сам.
Ответ или решение
Ваша путаница с параметрами colsample_bylevel
и colsample_bynode
в XGBoost вполне понятна, так как они действительно звучат похоже и оба касаются выбора признаков для разбиения деревьев. Однако они действуют на разных уровнях.
1. Описание параметров
-
colsample_bylevel: Этот параметр контролирует, сколько признаков будет случайно выбрано для рассмотрения на каждом уровне дерева. То есть, при каждом уровне дерева будет рассматриваться только подмножество признаков.
-
colsample_bynode: Этот параметр определяет, сколько признаков будет выбирается на каждом узле при разбиении. То есть, на каждом узле, только часть признаков из всего массива будет использована для нахождения наилучшего разбиения.
2. Пример
Чтобы иллюстрировать разницу, давайте рассмотрим пример:
Предположим, у вас есть 4 признака: A, B, C и D. Рассмотрим два случая:
Случай 1: colsample_bylevel=0.5
- Уровень 0: Выбираем 50% признаков для разбиения (например, B и C).
- Уровень 1: На следующем уровне, у нас снова есть 50% от выбранных в прошлом уровне признаков, что может означать, что мы опять случайно выбираем B, C или выбираем, например, D.
Это означает, что при каждом новом уровне могут использоваться разные признаки, но в рамках каждого уровня мы рассматриваем случайные 50% доступных признаков.
Случай 2: colsample_bynode=0.5
- Узел 1: На первом разбиении также выбираем 50% признаков (например, B и C).
- Узел 2: Перейдя к следующему узлу, при его разбиении, мы снова случайно выбираем 50% от тех признаков, которые доступны. Это означает, что каждый узел имеет возможность выбирать свои 50% признаков независимо от других узлов.
3. Итоговые наблюдения
Хотя оба параметра влияют на количество признаков, используемых для построения дерева, их влияние различно.
- colsample_bylevel будет удерживать выборку фиксированной для уровня, что может привести к более стабильному разбиению на уровне дерева.
- colsample_bynode же обеспечивает большую вариативность, так как каждый узел может выбирать признаки независимо, что может привести к большему разнообразию в структуре дерева.
Заключение
Таким образом, colsample_bylevel
и colsample_bynode
действительно делают разные вещи в XGBoost, и выбор одного из них будет влиять на структуру и производительность вашего дерева. Надеюсь, это объяснение помогло вам лучше понять разницу между этими двумя параметрами!