Несколько дней назад я обсуждал со своей хорошей подругой Джулией Саймон учет бизнес-знаний в модели на основе дерева решений.

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

Ответ — да, и он был добавлен в 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, примененного к деревьям решений, monotonicconstraints можно реализовать довольно легко. Простота этой реализации обусловлена ​​использованием бинарных деревьев решений в качестве базовой модели.

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

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

Как XGBoost справляется с монотонными ограничениями?

Чтобы увидеть, как мы можем реализовать такое ограничение, давайте посмотрим, как XGBoost делает это в своем коде C++:

На самом деле код довольно простой. Это просто гарантирует, что монотонность соблюдается на уровне усиления. Если это не так, код искусственно устанавливает усиление на negative_infinity, чтобы гарантировать, что это разделение не будет сохранено.

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

Применение и эффект монотонных ограничений

Фрагмент кода ниже показывает, как добавить ограничения monotonic в модель XGBoost:

В этом учебном примере две модели XGBoost обучаются изучению простой теоретической модели, в которой y = 6.66 x. Был добавлен некоторый строго отрицательный шум, чтобы гарантировать, что обучающие данные не monotone, то есть иногда y_j < y_i, хотя x_i < x_j.

Первая модель обучается без каких-либо ограничений, тогда как вторая добавляет monotonicconstraint.

Обратите внимание, что это обеспечивается определением параметров monotone_constraint. Этот параметр представляет собой кортеж, который должен содержать столько элементов, сколько функций в модели.

Когда элемент c_iassociated с функцией f_i равен 0, ограничение не применяется. При c_i = 1 применяется возрастающее монотонное ограничение, а при c_i = -1 применяется убывающее монотонное ограничение.

Полученные прогнозы отображаются на этом графике:

Увеличение графика дает лучшее представление о влиянии ограничения:

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

Заключение

Монотонные ограничения — это простой способ перенести бизнес-знания в модель. Это очень простой и эффективный способ направить модель к соответствующей моделированию.

Если вы хотите узнать больше о Gradient Boosting и его применении, я написал книгу на эту тему Practical Gradient Boosting, в которой подробно описаны математические основы и дана практическая информация, чтобы получить максимальную отдачу от XGBoost, LightGBM и CatBoost: