Несколько дней назад я обсуждал со своей хорошей подругой Джулией Саймон учет бизнес-знаний в модели на основе дерева решений.
Она имела в виду очень простую задачу, в которой ценность для предсказания строго возрастала с заданной характеристикой. Она хотела знать, можно ли заставить модель обеспечить это ограничение.
Ответ — да, и он был добавлен в XGBoost давно (примерно в декабре 2017 года, согласно журналам изменений XGBoost), но это не очень известная особенность XGBoost: монотонное ограничение.
Давайте посмотрим, как это было реализовано, какова лежащая в основе математика и как это работает.
Подробнее о повышении градиента для деревьев решений в моей книге Практическое повышение градиента:
Монотонные ограничения
Начнем с определения monotonic constraint
. Во-первых, в математике monotonic
— это термин, который применяется к функциям и означает, что, когда вход этой функции увеличивается, выход функции либо строго увеличивается, либо уменьшается.
Например, функция x³ строго монотонна:
Наоборот, функция x² немонотонна, по крайней мере, на всей области определения R:
При ограничении R+ x² является монотонным, то же самое относится и к R-.
Говоря математическим языком, утверждение, что f равно monotonic
, означает, что
f(x_1) › f(x_2), если x_1 › x_2 в случае возрастающей монотонности.
or
f(x_1) ‹ f(x_2), если x_1 ‹ x_2 в случае убывающей монотонности.
Зачем нужны монотонные ограничения?
Во многих случаях специалисты по данным заранее знают о взаимосвязи между прогнозируемым значением и некоторыми функциями. Например, уровень продаж бутилированной воды пропорционален температуре, поэтому было бы интересно применить это ограничение в модели, которая будет прогнозировать продажи бутилированной воды.
Использование ограничений monotonic
— это простой способ добавить такое ограничение в модель XGBoost.
Давайте рассмотрим простой пример. Допустим, мы пытаемся смоделировать следующее уравнение, где значение для прогнозирования y
зависит от x
следующим образом:
y = 3*x.
Это очень простое отношение, где y
строго пропорционально x
. Однако при сборе данных в реальной жизни вносится шум, и это может привести к точкам данных, которые локально не соответствуют соотношению. В этих случаях необходимо убедиться, что модель monotonic
, как и теоретическая формула.
В приведенном ниже коде показано, как использовать ограничения XGBoost и monotonic
:
Как реализованы ограничения monotonic
в XGBoost?
В предыдущей статье я показал, как реализовать Gradient Boosting для дерева решений с нуля:
Этот код можно легко изменить, чтобы интегрировать ограничения monotonic
. Обработка ограничений в коде обычно требует разработки решателя, и обычно это довольно сложный код. Возможны различные подходы. В этой статье вы можете увидеть, как такой решатель может быть реализован с использованием итеративного подхода, основанного на геометрии:
Однако в случае Gradient Boosting, примененного к деревьям решений, monotonic
constraints можно реализовать довольно легко. Простота этой реализации обусловлена использованием бинарных деревьев решений в качестве базовой модели.
Действительно, решение, принимаемое каждым узлом, представляет собой сравнение между значением и порогом. Следовательно, обеспечение монотонности просто требует, чтобы это свойство монотонности соблюдалось на уровне узла принятия решений.
Например, если правый узел содержит строки, столбец которых A
меньше порогового значения T
, то выигрыш правого узла должен быть меньше выигрыша левого узла.
Как XGBoost справляется с монотонными ограничениями?
Чтобы увидеть, как мы можем реализовать такое ограничение, давайте посмотрим, как XGBoost делает это в своем коде C++:
На самом деле код довольно простой. Это просто гарантирует, что монотонность соблюдается на уровне усиления. Если это не так, код искусственно устанавливает усиление на negative_infinity
, чтобы гарантировать, что это разделение не будет сохранено.
Следовательно, узлы решений, которые не обеспечивают монотонность, отбрасываются.
Применение и эффект монотонных ограничений
Фрагмент кода ниже показывает, как добавить ограничения monotonic
в модель XGBoost:
В этом учебном примере две модели XGBoost обучаются изучению простой теоретической модели, в которой y = 6.66 x
. Был добавлен некоторый строго отрицательный шум, чтобы гарантировать, что обучающие данные не monotone
, то есть иногда y_j < y_i
, хотя x_i < x_j
.
Первая модель обучается без каких-либо ограничений, тогда как вторая добавляет monotonic
constraint.
Обратите внимание, что это обеспечивается определением параметров monotone_constraint
. Этот параметр представляет собой кортеж, который должен содержать столько элементов, сколько функций в модели.
Когда элемент c_i
associated с функцией f_i
равен 0, ограничение не применяется. При c_i = 1
применяется возрастающее монотонное ограничение, а при c_i = -1
применяется убывающее монотонное ограничение.
Полученные прогнозы отображаются на этом графике:
Увеличение графика дает лучшее представление о влиянии ограничения:
Он ясно показывает, что модель без ограничений не обеспечивает монотонность, так как прогнозы не всегда возрастают. Напротив, модель с ограничениями генерирует только возрастающие прогнозы.
Заключение
Монотонные ограничения — это простой способ перенести бизнес-знания в модель. Это очень простой и эффективный способ направить модель к соответствующей моделированию.
Если вы хотите узнать больше о Gradient Boosting и его применении, я написал книгу на эту тему Practical Gradient Boosting, в которой подробно описаны математические основы и дана практическая информация, чтобы получить максимальную отдачу от XGBoost, LightGBM и CatBoost: