XGBoost, LightGBM или CatBoost - какой алгоритм повышения я должен использовать?

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

В этом блоге мы попытаемся определить, существует ли один настоящий убийственный алгоритм, который превосходит их всех. Мы сравним XGBoost, LightGBM и CatBoost с более ранней версией GBM, измеряя точность и скорость на четырех наборах данных, связанных с мошенничеством. Мы также представим краткое сравнение всех новых алгоритмов, что позволит вам быстро понять основные различия между ними. Полезно предварительное понимание деревьев с градиентным усилением.

В чем их особенность?

Алгоритмы отличаются друг от друга реализацией алгоритма усиленных деревьев, их технической совместимостью и ограничениями. XGBoost был первым, кто попытался улучшить время обучения GBM, за ним последовали LightGBM и CatBoost, каждый со своими собственными методами, в основном связанными с механизмом разделения. Пакеты всех алгоритмов постоянно пополняются новыми функциями и возможностями. В большинстве случаев мы представляем поведение алгоритмов по умолчанию в R, хотя могут быть доступны и другие параметры. В этом разделе мы сравниваем только XGBoost, LightGBM и CatBoost. Если вы пропустили GBM, не беспокойтесь - вы найдете его в разделе результатов.

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

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

Легкость анализа. При обучении модели, даже если вы тесно работаете с документацией, вы хотите, чтобы обучение было проведено именно так, как вы хотели. Например, вы хотите убедиться, что правильные объекты были обработаны как категориальные и что деревья были построены правильно. С этим критерием я считаю, что CatBoost и LightGBM больше похожи на черный ящик, потому что в R невозможно построить деревья и получить всю информацию о модели (невозможно получить список категориальных функций модели, например ). XGBoost более прозрачен, что позволяет легко строить деревья, и, поскольку он не имеет встроенной кодировки категориальных функций, нет никаких возможных сюрпризов, связанных с типом функций.

Ограничения обслуживания модели. Выбирая производственный алгоритм, вы не можете просто проводить эксперименты в своей любимой среде (R / Python) и выбирать ту, которая имеет лучшую производительность, потому что, к сожалению, все алгоритмы имеют свои ограничения. . Например, если вы используете язык разметки прогнозных моделей (PMML) для оценки в производственной среде, он доступен для всех алгоритмов. Однако в CatBoost вам разрешено использовать для этого только горячую кодировку. Причина в том, что представление CatBoost по умолчанию для категориальных функций не поддерживается PMML. Поэтому я рекомендую принять во внимание эти соображения, прежде чем начинать экспериментировать со своими данными.

Теперь давайте рассмотрим их основные характеристики:

Сплит

Перед обучением все алгоритмы создают пары разделения функций для всех функций. Примеры таких пар: (возраст, ‹5), (возраст,› 10), (количество, ›500). Эти пары разбиения признаков построены на основе гистограмм и используются во время обучения как возможные разбиения узлов. Этот метод предварительной обработки быстрее, чем точный жадный алгоритм, который линейно перечисляет все возможные разбиения для непрерывных функций.

lightGBM предлагает одностороннюю выборку на основе градиента (GOSS), которая выбирает разбиение, используя все экземпляры с большими градиентами (т. е. с большой ошибкой) и случайную выборку экземпляров с небольшими градиентами. Чтобы сохранить такое же распределение данных при вычислении прироста информации, GOSS вводит постоянный множитель для экземпляров данных с небольшими градиентами. Таким образом, GOSS достигает хорошего баланса между увеличением скорости за счет уменьшения количества экземпляров данных и сохранением точности изученных деревьев решений. Этот метод не является методом по умолчанию для LightGBM, поэтому его следует выбрать явно.

Catboost предлагает новую технику под названием Minimal Variance Sampling (MVS), которая представляет собой версию Stochastic Gradient Boosting с взвешенной выборкой. В этом методе взвешенная выборка происходит на уровне дерева, а не на разделенном уровне. Наблюдения для каждого дерева бустинга отбираются таким образом, чтобы обеспечить максимальную точность оценки разделения.

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

Рост листьев

Catboost выращивает сбалансированное дерево. На каждом уровне такого дерева выбирается пара разделенных признаков, которая приводит к наименьшим потерям (согласно штрафной функции), и используется для всех узлов уровня. Его политику можно изменить с помощью параметра grow-policy.

LightGBM использует рост деревьев по листьям (сначала лучше всего). Он выбирает рост листа, который сводит к минимуму потери, позволяя вырасти несбалансированному дереву. Поскольку он растет не по уровням, а по листам, переобучение может произойти, когда данных мало. В этих случаях важно контролировать глубину дерева.

XGboost разбивается до указанного гиперпараметра max_depth, а затем начинает обрезку дерева в обратном направлении и удаляет разбиения, за пределами которых нет положительного усиления. Он использует этот подход, поскольку иногда за разделением без снижения потерь может следовать разделение с сокращением потерь. XGBoost также может выполнять рост деревьев по листьям (как LightGBM).

Обработка отсутствующих значений

Catboost имеет два режима обработки отсутствующих значений: «Мин» и «Макс». В «Мин» пропущенные значения обрабатываются как минимальное значение для функции (им дается значение, меньшее, чем все существующие значения). Таким образом, гарантируется, что при выборе разбиений учитывается разделение, которое отделяет отсутствующие значения от всех других значений. «Макс» работает точно так же, как «Мин», только с максимальными значениями.

В LightGBM и XGBoost отсутствующие значения будут присвоены стороне, которая уменьшает потери в каждом разбиении.

Методы важности признаков

Catboost имеет два метода: первый - «PredictionValuesChange». Для каждой функции PredictionValuesChange показывает, насколько в среднем прогноз изменяется при изменении значения функции. Функция будет иметь большее значение, когда изменение значения функции вызывает большое изменение прогнозируемого значения. Это метод расчета важности функции по умолчанию для нерейтинговых показателей. Второй метод - «LossFunctionChange». Этот тип важности функций можно использовать для любой модели, но он особенно полезен для моделей ранжирования. Для каждой функции значение представляет собой разницу между значением потерь модели с этой функцией и без нее. Поскольку переобучение модели без одной из функций требует больших затрат вычислительных ресурсов, эта модель построена приблизительно с использованием исходной модели с этой функцией, удаленной из всех деревьев в ансамбле. Для расчета важности этой функции требуется набор данных.

LightGBM и XGBoost имеют два схожих метода: первый - это «усиление», которое представляет собой повышение точности (или общего усиления), обеспечиваемое функцией для ветвей, на которых она находится. Второй метод имеет разные названия в каждом пакете: «split» (LightGBM) и «Frequency» / «Weight» (XGBoost). Этот метод вычисляет относительное количество раз, когда конкретный элемент встречается во всех разбиениях деревьев модели. Этот метод может быть искажен категориальными признаками с большим количеством категорий.

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

Работа с категориальными признаками

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

LightGBM разделяет категориальные функции, разделяя их категории на 2 подмножества. Основная идея состоит в том, чтобы отсортировать категории в соответствии с целями обучения на каждой группе. По нашему опыту, этот метод не обязательно улучшает модель LightGBM. Он имеет сопоставимую (а иногда и худшую) производительность, чем другие методы (например, кодирование цели или метки).

XGBoost не имеет встроенного метода для категориальных функций. Кодирование (одноразовое, целевое кодирование и т. Д.) Должно выполняться пользователем.

Кто является победителем?

Мы использовали 4 набора данных в нашем эксперименте, связанном с предотвращением мошенничества в мире электронной коммерции, с двоичной целевой переменной, указывающей, был ли заказ, сделанный клиентом, мошенническим или законным. В этих примерах обучающих наборов данных содержится около 300 функций, относительно большая часть (~) категориальных функций и примерно 100 000 наблюдений.

Используемая нами метрика - это взвешенная AUC (WAUC), которая похожа на AUC, но позволяет использовать разные веса для разных классов. В наших реальных данных есть заказы, которые были отклонены, и мы можем пометить их только частично. Поэтому мы присвоили этим заказам меньший вес в расчете AUC. Наша скорректированная метрика будет представлена ​​в будущем блоге.

Во всех экспериментах мы тренировались на CPU, используя экземпляр AWS c4.xlarge.

Скорость обучения

Мы сравнили скорость обучения, пытаясь создать максимально похожие условия для всех алгоритмов. Для этого мы обучили модель с 4000 деревьями и глубиной 1 (только корневой узел) со скоростью обучения 0,01.

На графике ниже показаны результаты эксперимента. Каждая точка представляет собой среднее значение 3-х повторных тренировок.

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

Для наших наборов данных LightGBM, CatBoost и XGBoost были примерно в 15, 5 и 3 раза быстрее, чем GBM, соответственно.

Сравнение точности

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

В таблице ниже показаны результаты эксперимента с перекрестной проверкой. Каждая ячейка представляет собой среднее значение WAUC для 5 повторных экспериментов.

В базовом наборе данных CatBoost превосходит остальные на 0,8–1%, что является значимой разницей. В других наборах данных различия не столь значительны, что позволяет предположить, что точность не может быть основным критерием при выборе алгоритма для этих наборов данных. Поэтому важно учитывать другие критерии, такие как скорость и технические ограничения.

Сноски

Поработав со всеми алгоритмами, мы обнаружили, что, к сожалению, по всем критериям нет победителя. Поэтому в компании Riskified мы решили реализовать все из них в наших системах и выбрали правильный вариант с учетом соответствующего сценария использования. Например, если скорость обучения - наша проблема, мы используем LightGBM. В задачах, где нам нужна максимальная точность, мы можем обучить все алгоритмы, чтобы найти алгоритм с самым высоким WAUC для этого конкретного набора данных.

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

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

Спасибо команде Яндекса за ценный вклад и отзывы!

Наполните нас своими комментариями, предложениями и мыслями!