градиентный бустинг машинное обучение

Быстрый градиентный бустинг с CatBoost

Привет, хабровчане! Подготовили перевод статьи для будущих учеников базового курса Machine Learning.

градиентный бустинг машинное обучение

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

градиентный бустинг машинное обучение
Источник

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

градиентный бустинг машинное обучение
Источник

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

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

Наиболее распространенными способами обработки категориальных данных в машинном обучении является one-hot кодирование и кодирование лейблов. CatBoost позволяет использовать категориальные признаки без необходимости их предварительно обрабатывать.

При использовании CatBoost мы не должны пользоваться one-hot кодированием, поскольку это влияет на скорость обучения и на качество прогнозов. Вместо этого мы просто задаем категориальные признаки с помощью параметра cat_features.

Преимущества использования CatBoost

Есть несколько причин подумать об использовании CatBoost:

Параметры обучения

Давайте рассмотрим общие параметры в CatBoost:

Пример с регрессией

CatBoost в своей реализации использует стандарт scikit-learn. Давайте посмотрим, как мы можем использовать его для регрессии.

Первый шаг, как всегда, импортировать регрессор и создать его экземпляр.

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

градиентный бустинг машинное обучение

Также мы можем выполнять кроссвалидацию и визуализировать процесс:

градиентный бустинг машинное обучение

Аналогично вы можете выполнить grid search и визуализировать его:

градиентный бустинг машинное обучение

Также мы можем использовать CatBoost для построения дерева. Вот график первого дерева. Как вы видите из дерева, листья разделяются при одном и том же условии, например, 297, значение > 0.5.

градиентный бустинг машинное обучение

CatBoost дает нам словарь со всеми параметрами модели. Мы можем вывести их, как словарь.

градиентный бустинг машинное обучение

В этой статье мы рассмотрели преимущества и ограничения CatBoost, а также ее основные параметры обучения. Затем мы реализовали простую регрессию с помощью scikit-learn. Надеюсь, вы получили достаточно информации об этой библиотеке, чтобы самостоятельно продолжить ее исследование.

Источник

Как разработать ансамбль Light Gradient Boosted Machine (LightGBM)

В преддверии старта нового потока курса «Машинное обучение» представляем вашему вниманию материал о Light Gradient Boosted Machine (далее — LightGBM), библиотеке с открытым исходным кодом, которая предоставляет эффективную и действенную реализацию алгоритма градиентного бустинга.

LightGBM расширяет алгоритм градиентного бустинга, добавляя тип автоматического выбора объектов, а также фокусируясь на примерах бустинга с большими градиентами. Это может привести к резкому ускорению обучения и улучшению прогнозных показателей. Таким образом, LightGBM стала де-факто алгоритмом для соревнований по машинному обучению при работе с табличными данными для задач регрессионного и классификационного прогностического моделирования. В этом туториале вы узнаете, как разрабатывать ансамбли машин Light Gradient Boosted для классификации и регрессии. После завершения этого урока вы будете знать:

градиентный бустинг машинное обучение

Этот туториал состоит из трёх частей

Алгоритм LightBLM

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

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

Модели обучаются с использованием любой произвольной дифференцируемой функции потерь и алгоритма оптимизации градиентного спуска. Это даёт методу его название «градиентный бустинг», поскольку градиент потерь минимизируется по мере обучения модели, подобно нейронной сети. Дополнительные сведения о градиентном бустинге см. в туториале: «Мягкое введение в алгоритм градиентного бустинга в ML».

LightGBM — это реализация градиентного бустинга с открытым исходным кодом, разработанная для того, чтобы быть эффективной и даже, возможно, более эффективной, чем другие реализации.

Как таковой LightGBM — это проект с открытым исходным кодом, библиотека программного обеспечения и алгоритм машинного обучения. То есть проект очень похож на Extreme Gradient Boosting или XGBoost technique.

LightGBM была описана Голинь К., и соавт. в статье 2017 года под названием «LightGBM: A Highly Efficient Gradient Boosting Decision Tree». Реализация вводит две ключевые идеи: GOSS и EFB.
Градиентная односторонняя выборка (GOSS) является модификацией градиентного бустинга, который фокусирует внимание на тех учебных примерах, которые приводят к большему градиенту, в свою очередь, ускоряя обучение и уменьшая вычислительную сложность метода.

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

Exclusive Feature Bundling (объединение взаимоисключающих признаков), или EFB, — это подход объединения разрежённых (в основном нулевых) взаимоисключающих признаков, таких как категориальные переменные входных данных, закодированные унитарным кодированием. Таким образом, это тип автоматического подбора признаков.

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

Вместе эти два изменения могут ускорить время обучения алгоритма до 20 раз. Таким образом, LightGBM можно рассматривать как деревья решений с градиентным бустингом (GBDT) с добавлением GOSS и EFB.

Мы называем нашу новую реализацию GBDT с помощью GOSS и EFB LightGBM. Наши эксперименты на нескольких общедоступных наборах данных показывают, что LightGBM ускоряет процесс обучения обычного GBDT более чем в 20 раз, достигая почти такой же точности.

Scikit-Learn API для LightGBM

LightGBM может устанавливаться как автономная библиотека, а модель LightGBM может разрабатываться с помощью API scikit-learn.

Первый шаг — установка библиотеки LightGBM. На большинстве платформ её можно выполнить с помощью менеджера пакетов pip; например:

Проверить установку и версию можно так:

Скрипт выведет версию установленной LightGBM. Ваша версия должна быть как здесь или выше. Если это не так, обновите LightGBM. Если нужны конкретные инструкции для вашей среды разработки, обратитесь к туториалу: «Руководство по установке LightGBM».

Библиотека LightGBM имеет собственный API, хотя мы используем метод через классы-оболочки scikit-learn: LGBMRegressor и LGBMClassifier. Это позволит применять весь набор инструментов из библиотеки машинного обучения scikit-learn для подготовки данных и оценки моделей.

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

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

Ансамбль LightGBM для классификации

В этом разделе рассмотрим применение LightGBM для задачи классификации. Во-первых, мы можем использовать функцию make_classification() создать синтетическую задачу бинарной классификации с 1000 примерами и 20 входными признаками. Весь пример смотрите ниже.

При выполнении примера создается набор данных и суммируется форма входных и выходных компонентов.

Затем мы можем оценить алгоритм LightGBM на этом наборе данных. Мы будем оценивать модель с помощью повторной стратифицированной k-кратной кросс-валидации с тремя повторами и k, равным 10. Мы сообщим среднее и стандартное отклонения точности модели по всем повторениям и сгибам.

Запуск примера показывает точность среднего и стандартного отклонений модели.

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

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

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

Теперь, когда мы знакомы с использованием LightGBM для классификации, давайте рассмотрим API для регрессии.

Ансамбль LightGBM для регрессии

В этом разделе мы рассмотрим использование LightGBM для регрессионной задачи. Во-первых, мы можем использовать функцию make_regression()
создать задачу синтетической регрессии с 1000 примерами и 20 входными объектами. Весь пример смотрите ниже.

При выполнении примера создается набор данных и резюмируются входные и выходные компоненты.

Во-вторых, мы можем оценить алгоритм LightGBM на этом наборе данных.

Как и в последнем разделе, мы будем оценивать модель с помощью повторной k-кратной кросс-валидации с тремя повторами и k равным 10. Мы сообщим о средней абсолютной ошибке (MAE) модели по всем повторам и группам кросс-валидации. Библиотека scikit-learn делает MAE отрицательным, так что она максимизируется, а не минимизируется. Это означает, что большие отрицательные MAE лучше, а идеальная модель имеет MAE 0. Полный пример приведён ниже.

Запуск примера сообщает о средней и стандартной точности отклонения модели.

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

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

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

Теперь, когда мы знакомы с использованием API scikit-learn для оценки и применения ансамблей LightGBM, давайте посмотрим на настройку модели.

Гиперпараметры LightGBM

В этом разделе подробнее рассмотрим некоторые гиперпараметры, важные для ансамбля LightGBM, а также их влияние на производительность модели. У LightGBM есть множество гиперпараметров, на которые можно посмотреть, здесь посмотрим на количество деревьев и их глубину, скорость обучения и тип бустинга. Общие советы по настройке гиперпараметров LightGBM см. в документации: «Настройка параметров LightGBM».

Исследование количества деревьев

Важным гиперпараметром для алгоритма ансамбля LightGBM является количество деревьев решений, используемых в ансамбле. Напомним, что деревья принятия решений добавляются в модель последовательно в попытке исправить и улучшить прогнозы, сделанные предыдущими деревьями. Часто работает правило: больше деревьев — лучше. Количество деревьев можно задать с помощью аргумента n_estimators, по умолчанию равного 100. В приведенном ниже примере исследуется влияние количества деревьев, взяты значения от 10 до 5000.

При выполнении примера сначала отображается средняя точность для каждого количества деревьев решений.

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

Здесь видим, что производительность улучшается для этого набора данных примерно до 500 деревьев, после чего она, похоже, выравнивается.

График в виде ящика с усами создается для распределения оценок точности каждого настроенного количества деревьев. Видно общую тенденцию увеличения производительности модели и размера ансамбля.

градиентный бустинг машинное обучение

Исследование глубины дерева

Изменение глубины каждого дерева, добавляемого в ансамбль, — ещё один важный гиперпараметр для градиентного бустинга. Глубина дерева определяет, насколько каждое дерево специализируется на обучающем наборе данных: насколько оно может быть общим или обученным. Предпочтительны деревья, которые не должны быть слишком мелкими и общими (например, AdaBoost) и не слишком глубокие и специализированными (например бутстреп-агрегация).

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

Существует два основных способа управления сложностью дерева: через максимальную глубину дерева и максимальное количество терминальных узлов (листьев) дерева. Здесь мы изучаем количество листьев, поэтому нам нужно увеличить их количество, чтобы поддерживать более глубокие деревья, задав аргумент num_leaves. Ниже исследуются глубины дерева от 1 до 10 и их влияние на производительность модели.

При выполнении примера сначала отображается средняя точность для каждой настроенной глубины дерева.

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

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

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

градиентный бустинг машинное обучение

Исследование скорости обучения

Скорость обучения контролирует степень вклада каждой модели в прогнозирование ансамбля. Меньшие скорости могут потребовать большего количества деревьев решений в ансамбле. Скорость обучения можно контролировать с помощью аргумента learning_rate, по умолчанию она равна 0,1. Ниже исследуется скорость обучения и сравнивается влияние значений от 0,0001 до 1,0.

При выполнении примера сначала отображается средняя точность для каждой настроенной скорости обучения.

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

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

Ящик с усами создаётся для распределения оценок точности каждой настроенной скорости обучения. Видно общую тенденцию увеличения производительности модели с увеличением скорости обучения вплоть до 1,0.

градиентный бустинг машинное обучение

Исследование типа бустинга

Особенность LightGBM — то, что он поддерживает ряд алгоритмов бустинга, называемых типами бустинга. Тип бустинга указывается с помощью аргумента boosting_type и для определения типа принимает строку. Возможные значения:

DART описан в статье 2015 года под названием «DART: Dropouts meet Multiple Additive Regression Trees» и, как следует из названия, добавляет понятие dropout из глубокого обучения в алгоритм множественных аддитивных регрессионных деревьев (MART), предшественник деревьев решений с градиентным бустингом.

Этот алгоритм известен под многими названиями, включая Gradient TreeBoost, Boosted Trees и деревья и деревья множественной аддитивной регрессии (MART). Для обозначения алгоритма мы используем последнее название.

GOSS представлен с работой по LightGBM и библиотекой lightbgm. Этот подход направлен на использование только тех экземпляров, которые приводят к большому градиенту ошибки, для обновления модели и удаления остальных экземпляров.

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

Ниже LightGBM обучается на наборе данных синтетической классификации с тремя ключевыми методами бустинга.

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

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

Мы видим, что метод повышения по умолчанию работает лучше, чем два других оцененных метода.

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

Источник

Градиентый бустинг — просто о сложном

градиентный бустинг машинное обучение

Хотя большинство победителей соревнований на Kaggle используют композицию разных моделей, одна из них заслуживает особого внимания, так как является почти обязательной частью. Речь, конечно, про Градиентный бустинг (GBM) и его вариации. Возьмем, например. победителя Safe Driver Prediction, Michael Jahrer. Его решение — это комбинация шести моделей. Одна LightGBM (вариация GBM) и пять нейронных сетей. Хотя его успех в большей мере принадлежит полуконтролируемому обучению, которое он использовал для упорядочивания данных, градиентный бустинг сыграл свою роль.

Даже несмотря на то, что градиентный бустинг используется повсеместно, многие практики до сих пор относятся к нему, как к сложному алгоритму в черном ящике и просто запускают готовые модели из предустановленных библиотек. Цель этой статьи — дать понимание как же работает градиентный бустинг. Разбор будет посвящен чистому “vanilla” GMB.

Ансамбли, бэггинг и бустинг

Когда мы пытаемся предсказать целевую переменную с помощью любого алгоритма машинного обучения, главные причины отличий реальной и предсказанной переменной — это noise, variance и bias. Ансамбль помогает уменьшить эти факторы (за исключением noise — это неуменьшаемая величина).

Ансамбль

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

Бэггинг

Бэггинг — простая техника, в которой мы строим независимые модели и комбинируем их, используя некоторую модель усреднения (например, взвешенное среднее, голосование большинства или нормальное среднее).

Обычно берут случайную подвыборку данных для каждой модели, так все модели немного отличаются друг от друга. Выборка строится по модели выбора с возвращением. Из-за того что данная техника использует множество некореллириющих моделей для построения итоговой модели, это уменьшает variance. Примером бэггинга служит модель случайного леса (Random Forest, RF)

Бустинг

Бустинг — это техника построения ансамблей, в которой предсказатели построены не независимо, а последовательно

Это техника использует идею о том, что следующая модель будет учится на ошибках предыдущей. Они имеют неравную вероятность появления в последующих моделях, и чаще появятся те, что дают наибольшую ошибку. Предсказатели могут быть выбраны из широкого ассортимента моделей, например, деревья решений, регрессия, классификаторы и т.д. Из-за того, что предсказатели обучаются на ошибках, совершенных предыдущими, требуется меньше времени для того, чтобы добраться до реального ответа. Но мы должны выбирать критерий остановки с осторожностью, иначе это может привести к переобучению. Градиентный бустинг — это пример бустинга.

Алгоритм градиентного бустинга

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

Цель любого алгоритма обучения с учителем — определить функцию потерь и минимизировать её. Давайте обратимся к математике градиентного бустинга. Пусть, например, в качестве функции потерь будет среднеквадратичная ошибка (MSE):

градиентный бустинг машинное обучение

Мы хотим, чтобы построить наши предсказания таким образом, чтобы MSE была минимальна. Используя градиентный спуск и обновляя предсказания, основанные на скорости обучения (learning rate), ищем значения, на которых MSE минимальна.

градиентный бустинг машинное обучение

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

Интуиция за градиентным бустингом

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

Первое предположение линейной регресии, что сумма отклонений = 0, т.е. отклонения должны быть случайно распределены в окрестности нуля.

градиентный бустинг машинное обучениеНормальное распределение выборки отклонений со средним 0

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

Итак, интуиция за алгоритмом градиентного бустинга — итеративно применять паттерны отклонений и улучшать предсказания. Как только мы достигли момента, когда отклонения не имеют никакого паттерна, мы прекращаем достраивать нашу модель (иначе это может привести к переобучению). Алгоритмически, мы минимизируем нашу функцию потерь.

Шаги построения модели градиентного спуска

Рассмотрим смоделированные данные, как показано на диаграмме рассеивания ниже с 1 входным (x) и 1 выходной (y) переменными.

градиентный бустинг машинное обучение

Данные для показанного выше графика генерируются с использованием кода python:

1. Установите линейную регрессию или дерево решений на данные (здесь выбрано дерево решений в коде) [вызов x как input и y в качестве output]

2. Вычислите погрешности ошибок. Фактическое целевое значение, минус прогнозируемое целевое значение [e1 = y — y_predicted1]

3. Установите новую модель для отклонений в качестве целевой переменной с одинаковыми входными переменными [назовите ее e1_predicted]

4. Добавьте предсказанные отклонения к предыдущим прогнозам
[y_predicted2 = y_predicted1 + e1_predicted]

5. Установите еще одну модель оставшихся отклонений. т.е. [e2 = y — y_predicted2], и повторите шаги с 2 по 5, пока они не начнутся overfitting, или сумма не станет постоянной. Управление overfitting-ом может контролироваться путем постоянной проверки точности на данных для валидации.

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

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

Визуализация работы Gradient Boosting Tree:

Заметим, что после 20-й итерации отклонения распределены случайным образом (здесь не говорим о случайной норме) около 0, и наши прогнозы очень близки к истинным значениям (итерации называются n_estimators в реализации sklearn). Возможно, это хороший момент для остановки, или наша модель начнет переобучаться.

Посмотрим, как выглядит наша модель после 50-й итерации.

градиентный бустинг машинное обучениеВизуализация градиентного бустинга после 50 итераций

Мы видим, что даже после 50-й итерации отклонения по сравнению с графиком x похожи на то, что мы видим на 20-й итерации. Но модель становится все более сложной, и предсказания перерабатывают данные обучения и пытаются изучить каждый учебный материал. Таким образом, было бы лучше остановиться на 20-й итерации.

Фрагмент кода Python, используемый для построения всех вышеперечисленных графиков.

Видео Александра Ихлера:

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *