Можно ли (и/или логично) установить важность признаков для XGBoost?

Вопрос или проблема

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

Есть ли способ задать это в xgboost? Подобно тому, как я могу назначать веса каждой выборке/строке, могу ли я как-то сделать так, чтобы определенные признаки чаще появлялись на вершине дерева по сравнению с другими признаками? (или каким-то другим способом сделать так, чтобы определенные столбцы играли более важную роль в модели?)

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

Вы можете дублировать некоторые признаки в вашем датафрейме. Я, безусловно, искал две вещи, как вы упомянули, одна из них – это размещение некоторых признаков ближе к корневому узлу, и также хотел, чтобы некоторые признаки чаще появлялись на ветвях. Я понимаю, что ваша задача заключается в том, чтобы сделать ваши деревья более восприимчивыми к некоторым признакам. Я могу предложить что-то в этой области. XGBoost выбирает каждый признак равномерно, было бы лучше, если бы мы могли сказать, что некоторые признаки более важны и их следует использовать чаще. Коротким хаком будет дублирование столбцов при уменьшении параметра colsample_bytree. На данный момент XGBoost не поддерживает взвешенные признаки, так как он выбирает признаки равномерно. Я видел это в другом месте, в документации нет конкретной техники выборки для признаков (столбцов в XGBoost). Проверьте colsample_bytree: https://xgboost.readthedocs.io/en/latest/parameter.html. (Благодарность: услышав эту технику на вебинаре https://www.kaggle.com/aerdem4 )

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

Если ваша задача заключается в указании знаний о предметной области, вы также можете определить знания о предметной области через “ограничения взаимодействия признаков” в XGBoost, документация. Я надеюсь, что смогу отредактировать ответ, когда буду на 100% уверен, что делаю с взаимодействиями признаков: https://xgboost.readthedocs.io/en/latest/tutorials/feature_interaction_constraint.html#:~:text=Feature%20interaction%20constraints%20are%20expressed,but%20with%20no%20other%20variable.

Я осознаю, что это не отвечает на ваш основной вопрос, на данный момент это кажется невозможным. Кроме того, я не уверен, что признаки, помещенные в вершину, являются более важными, это не всегда кажется верным.

Редактировать: XGBoost добавил feature_weights в DMatrix, в версии 1.3.0! Однако, версия 1.3.0 еще не стабильна. Я отредактирую здесь, когда найду/применю вес признаков. https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.XGBRegressor.fit

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

Что касается xgboost, он предназначен для быстрого обработки важных наборов данных. Обычно не желательно пытаться влиять на процесс обучения, чтобы выбрать, какой признак будет выбран первым.

Если у вас есть один признак, который он должен выбрать первым из-за экспертных знаний, но не выбирает:

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

На самом деле, алгоритмы дерева выбирают признак, по которому они будут делать разбиение, рассчитывая метрику, оценивая, какое разбиение является лучшим. Наиболее известные метрики – это Gini или Entropy.

Таким образом, цель заключается в автоматическом создании наилучших разбиений, зная, что содержится в данных. Принуждение признаков быть вверху дерева будет означать снижение производительности, поскольку дерево делает свои разбиения в переменных, которые создают наибольшую значимость.

Xgboost автоматически рассчитывает важность признаков. Я не нашел метода для установки этого в ручную. Вы можете выбрать 2 варианта, чтобы решить проблему:

  • установить вес для важных образцов
  • разделить ваши данные с очень важным признаком и обучить несколько моделей.

Невозможно установить важность признаков заранее, но вы можете уменьшить зависимость вашей модели от определенных признаков. Поскольку ранее обученные деревья имеют большее влияние на конечные предсказания, вы можете уменьшить важность определенных признаков, исключив их на начальных этапах деревьев. Например, предположим, что вы обучаете модель XGBoost с 1000 деревьями, и признаки F1 и F2 имеют наибольшие важности признаков. Если вы исключите F1 и F2 из первых 200 деревьев, важность этих признаков будет значительно снижена.

Эта стратегия может помочь улучшить обобщение, особенно если ваша модель сильно полагается на F1 и F2, и вы ожидаете изменения распределения между тренировочными и тестовыми данными. Вот как это реализовать:

  1. Обучите первые 200 деревьев без F1 и F2.

  2. Сохраните JSON-файл модели.

  3. Измените JSON-файл:

    • Добавьте (в противном случае, вам нужно изменить индексы в каждой структуре дерева) признаки, которые вы исключили из первых 200 деревьев обратно в набор признаков.
    • Измените feature_num, чтобы отразить общее количество признаков (после добавления F1 и F2 обратно).
    • Вам не нужно изменять индексы разбиений дерева; они останутся прежними.
  4. Переобучите модель, загрузив предварительно обученную модель с 200 деревьями, но на этот раз включите F1 и F2 в тренировочные данные:

    model.fit(ddf_X_train, ddf_y_train, xgb_model=previous_model)

В результате конечная модель покажет гораздо меньшие важности признаков для F1 и F2.

Ответ или решение

Вопрос о возможности и целесообразности задания важности признаков в алгоритме XGBoost представляет собой интересную задачу. Прежде чем детализировать возможные пути решения, важно понять теоретическую основу и специфику работы XGBoost.

Теория

XGBoost — это усовершенствованный градиентный бустинг, который часто используется для решения задач классификации и регрессии. Его привлекательность объясняется высокой производительностью и способностью обрабатывать пропущенные значения. Основной принцип работы этого алгоритма заключается в построении новых деревьев решений, которые минимизируют ошибку предыдущих деревьев, и в конечном итоге нацелен на повышение точности модели.

Примеры и проблемы

В контексте построения деревьев решений, более важные признаки, как правило, размещаются выше в дереве. Это связано с метриками, такими как прирост информации или джини, которые решают, какое разбиение максимально значительно уменьшает неопределенность в данных.

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

Применение теории: установление важности признаков в XGBoost

На момент написания, XGBoost не предоставляет прямого способа вручную задавать важность признаков. Однако, есть несколько подводных стратегий, которые можно применить для достижения аналогичного эффекта:

  1. Повышение влияния через инженерные приемы: Путём дублирования признаков или специального отбора подмножеств признаков можно косвенно намекнуть алгоритму о важности определённых признаков.

  2. Использование Feature Weighting: В более новых версиях XGBoost входит возможность задавать "feature_weights", что позволяет явно задавать вес признаков в DMatrix. Эта функция позволяет учитывать экспертные знания прямо при обучении модели.

  3. Специальная обработка наборов данных: Чтобы избежать извлечения неправильной информации из неоднозначных данных, можно разделить данные по категориям и обучать отдельные модели для каждой группы данных, что позволяет более качественно учитывать специфические признаки для каждой подкатегории.

  4. Интерактивные ограничения признаков: Использование ограничений на взаимодействие признаков, внедренных в XGBoost, способствует контролю за тем, какие признаки могут взаимодействовать друг с другом в процессе моделирования.

  5. Исключение признаков в начальных деревьях: Для уменьшения влияния конкретных признаков за счет их исключения на ранних этапах обучения.

Несмотря на то, что XGBoost проектировался для автоматического выбора наиболее значимых признаков на основе данных, бывают случаи, когда вмешательство эксперта может помочь, особенно когда данные ограничены или неполны. Тем не менее, использование этих технических приёмов должно быть обоснованным и подход должен быть систематизирован.

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

Оцените материал
Добавить комментарий

Капча загружается...