Бонус: Hyperopt-Sklearn

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



Вступление

Дерево принятия решений по повышению градиента (GBDT)

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

XGBoost, LightGBM и CatBoost

Это хорошо известные пакеты для повышения градиента. По сравнению с традиционным подходом GBDT, который находит лучшее разделение, просматривая все функции, эти пакеты реализуют метод на основе гистограммы, который группирует элементы в ячейки и выполняет разделение на уровне ячейки, а не на уровне функций. С другой стороны, они также склонны игнорировать разреженные входные данные. Это значительно увеличивает скорость их вычислений (подробнее см. Здесь). Еще несколько важных моментов:

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

LightGBM: доступно обучение как по уровням, так и по листьям (дерево вырастает из определенного листа). Это позволяет пользователю выбрать метод под названием Односторонняя выборка на основе градиента (GOSS), который разбивает выборки на основе самых больших градиентов и некоторых случайных выборок с меньшими градиентами. Предполагается, что точки данных с меньшими градиентами лучше обучены. Другой ключевой алгоритм - Exclusive Feature Bundling (EFB), который рассматривает редкость функций и объединяет несколько функций в одну без потери какой-либо информации, учитывая, что они никогда не равны нулю вместе. Это делает LightGBM более быстрым вариантом по сравнению с XGBoost.

CatBoost: специально разработан для обучения категориальным данным, но также применим для задач регрессии. Скорость на GPU заявлена ​​как самая быстрая среди этих библиотек. Имеет различные методы преобразования категорийных признаков в числовые. Ключи к его скорости связаны с двумя О: Oblivious Tree и Упорядоченное ускорение. Дерево забвения относится к построению дерева с мудростью уровней с симметричным двоичным разделением (т. е. каждый лист на каждом уровне разделяется одной функцией), а Упорядоченное усиление применяет перестановку и последовательное целевая кодировка для преобразования категориальных функций. См. Здесь и здесь для более подробной информации.

Байесовская оптимизация

По сравнению с GridSearch , который является методом грубой силы, или RandomSearch, который является чисто случайным, классическая байесовская оптимизация объединяет случайность и апостериорное распределение вероятностей в поиск оптимальных параметров путем аппроксимации целевой функции через гауссовский процесс (т. е. случайные выборки рисуются итеративно (последовательная оптимизация на основе модели (SMBO)), а выходные данные функции между выборками аппроксимируются доверительной областью). Новые выборки будут взяты из пространства параметров с высоким средним значением и дисперсией в доверительной области для разведки и эксплуатации. Отметьте this для получения дополнительных объяснений.

Hyperopt

Hyperopt - это библиотека Python для оптимизации поисковых пространств. В настоящее время он предлагает два алгоритма оптимизации: 1. Случайный поиск и 2. Дерево оценок Парзена (TPE), которое представляет собой байесовский подход, в котором используется P (x | y) вместо P (y | x) на основе о приближении двух разных распределений, разделенных порогом, вместо одного при расчете ожидаемого улучшения (см. это). Раньше он учитывал гауссовские процессы и регрессию, но теперь они больше не применяются.

Реализация

Установка

Ознакомьтесь с руководствами по установке ниже:

Пример Hyperopt

fmin() - основная функция в гиперопте для оптимизации. Он принимает четыре основных аргумента и выводит оптимизированный набор параметров:

  1. Целевая функция - fn
  2. Область поиска - space
  3. Алгоритм поиска - algo
  4. (Максимум) нет. оценок - max_evals

Мы также можем передать объект Trials аргументу trials, который отслеживает весь процесс. Для работы с трейлами выходные данные целевой функции должны быть словарем, включающим, по крайней мере, ключи 'loss' и 'status', которые содержат результат и статус оптимизации соответственно. Промежуточные значения могут быть извлечены следующим образом:

  • trials.trials - список словарей содержит всю необходимую информацию
  • trials.results - список словарей, собирающих выходные данные функции
  • trials.losses() - список проигрышей (float для каждого испытания "ok")
  • trials.statuses() - список статусных строк
  • trials.vals - словарь выбранных параметров

Давайте посмотрим на следующий пример:

Оптимизированное значение x составляет 0,5000833960783931, что близко к теоретическому значению 0,5. Как вы могли заметить, образцы более сжатые около минимума. Если вы переключите algo на hyperopt.rand.suggest, который использует случайную выборку, точки будут более равномерно распределены в hp.uniform.

Еще несколько вещей, которые нужно развенчать:

Search Algortihm: hyperopt.tpe.suggest или hyperopt.rand.suggest

Пространство поиска: hp.uniform('x', -1, 1) определите пространство поиска с меткой «x», которое будет равномерно отбираться от -1 до 1. Стохастические выражения, в настоящее время распознаваемые алгоритмами оптимизации HyperOpt:

  • hp.choice(label, options): индекс варианта
  • hp.randint(label, upper): случайное целое число в пределах [0, верхний угол]
  • hp.uniform(label, low, high): одинаковое значение между низким / высоким
  • hp.quniform(label, low, high, q): round(uniform(.)/q)*q (обратите внимание, что значение дает число с плавающей запятой вместо целого)
  • hp.loguniform(label, low, high) : exp(uniform(low, high)/q)*q
  • hp.qloguniform(label, low, high, q) :round(loguniform(.))
  • hp.normal(label, mu, sigma): выборка из нормального распределения
  • hp.qnormal(label, mu, sigma, q) :round(normal(nu, sigma)/q)*q
  • hp.lognormal(label, mu, sigma) :exp(normal(mu, sigma)
  • hp.qlognormal(label, mu, sigma, q) : round(exp(normal(.))/q)*q

См. This для более подробной информации.

Если вы хотите выполнить выборку из пространства гипероптов, вы можете вызвать hyperopt.pyll.stochastic.sample(space), где space - это одно из hp пространства выше.

Оптимизация XGBoost, LightGBM и CatBoost с помощью Hyperopt

Вот главный пример в этой статье. Все три библиотеки повышения уровня имеют похожие интерфейсы:

  • Обучение: train()
  • Перекрестная проверка: cv()
  • Scikit-learn API:
    - Регрессор: XGBRegressor(), LGBMRegressor(), CatBoostRegressor()
    - Классификатор: XGBClassifier(), LGBMClassifier(), CatBoostClassifier()

В следующем примере используется интерфейс Regressor. Давайте сначала определим пространства параметров для всех трех библиотек (reg_params для создания экземпляров объекта; fit_params для fit() функции):

Обратите внимание, что многие параметры имеют общее имя аргумента или псевдоним. Проверьте ссылки ниже и соответствующие страницы API для получения дополнительной информации:

Некоторые основные параметры:

  • learning rate [X / L / C]: скорость обучения (псевдоним: eta)
  • max_depth [X / L / C]: максимальная глубина деревьев
  • n_estimators [X / L / C]: нет. повышения итераций
  • min_child_weight [X / L]: минимальная сумма веса экземпляра (гессен), необходимая для ребенка
  • min_child_samples [L / C]: минимальный номер данных на одном листе
  • subsample [X / L / C]: коэффициент подвыборки обучающих экземпляров (обратите внимание, что для CatBoost этот параметр может использоваться, только если выбран Пуассон или Бернулли bootstrap_type)
  • colsample_bytree [X / L]: соотношение подвыборки столбцов в построении дерева
  • colsample_bylevel [X / C]: соотношение подвыборки столбцов для каждого уровня в построении дерева
  • colsample_bynode [X]: отношение подвыборки столбцов для каждого узла
  • tree_method [X]: метод построения дерева
  • boosting [L]: метод построения дерева
  • boosting_type [C]: Ordered для упорядоченного повышения или Plain для классического
  • early_stopping_rounds [X / L / C]: параметр для fit() - остановить обучение, если один показатель данных проверки не улучшился в последних early_stopping_rounds раундах
  • eval_metric [X / L / C]: показатели оценки для данных проверки

Для получения дополнительных сведений о настройках категориальных функций в CatBoost проверьте настройки CTR на странице параметров.

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

Например, учитывая предварительно определенные DataFrames x_train, x_test, y_train, y_test, мы можем запустить процесс оптимизации, вызвав process():

Бонус: Hyperopt-Sklearn

Hyperopt-Sklearn - это пакет оптимизации очень высокого уровня, который все еще находится в стадии разработки. Давайте посмотрим на один из официальных примеров:

Вы можете спросить, что такое any_classifier? Если мы проверим его репозиторий GitHub:

кажется, он охватывает несколько классификаторов и регрессоров, таких как SVM, KNN, Random Forest и даже XGBoost. Как говорится на официальной странице:

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

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

Наконец-то

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