Бонус: 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()
- основная функция в гиперопте для оптимизации. Он принимает четыре основных аргумента и выводит оптимизированный набор параметров:
- Целевая функция -
fn
- Область поиска -
space
- Алгоритм поиска -
algo
- (Максимум) нет. оценок -
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.