В градиентном бустинге прогнозы делаются на основе ансамбля слабых обучающих алгоритмов. В отличие от случайного леса, который создает дерево решений для каждой выборки, в градиентном бустинге деревья создаются последовательно. Предыдущие деревья в модели не изменяются. Результаты предыдущего дерева используются для улучшения последующего. В этой статье мы подробнее познакомимся с библиотекой градиентного бустинга под названием CatBoost.
Источник
CatBoost это библиотека градиентного бустинга, созданная Яндексом. Она использует небрежные (oblivious) деревья решений, чтобы вырастить сбалансированное дерево. Одни и те же функции используются для создания левых и правых разделений (split) на каждом уровне дерева.
Источник
По сравнению с классическими деревьями, небрежные деревья более эффективны при реализации на процессоре и просты в обучении.
Работа с категориальными признаками
Наиболее распространенными способами обработки категориальных данных в машинном обучении является one-hot кодирование и кодирование лейблов. CatBoost позволяет использовать категориальные признаки без необходимости их предварительно обрабатывать.
При использовании CatBoost мы не должны пользоваться one-hot кодированием, поскольку это влияет на скорость обучения и на качество прогнозов. Вместо этого мы просто задаем категориальные признаки с помощью параметра cat_features.
Преимущества использования CatBoost
Есть несколько причин подумать об использовании CatBoost:
- CatBoost позволяет проводить обучение на нескольких GPU.
- Библиотека позволяет получить отличные результаты с параметрами по умолчанию, что сокращает время, необходимое для настройки гиперпараметров.
- Обеспечивает повышенную точность за счет уменьшения переобучения.
- Возможность быстрого предсказания с применением модели CatBoost;
- Обученные модели CatBoost можно экспортировать в Core ML для вывода на устройстве (iOS).
- Умеет под капотом обрабатывать пропущенные значения.
- Может использоваться для регрессионных и классификационных задач.
Параметры обучения
Давайте рассмотрим общие параметры в CatBoost:
loss_function
илиobjective
показатель, используемый для обучения. Есть регрессионные показатели, такие как среднеквадратичная ошибка для регрессии иlogloss
для классификации.eval_metric
метрика, используемая для обнаружения переобучения.Iterations
максимальное количество построенных деревьев, по умолчанию 1000. Альтернативные названияnum_boost_round
,n_estimators
иnum_trees
.learning_rate
илиeta
скорость обучения, которая определяет насколько быстро или медленно модель будет учиться. Значение по умолчанию обычно равно 0.03.random_seed
илиrandom_state
случайное зерно, используемое для обучения.l2_leaf_reg
илиreg_lambda
коэффициент при члене регуляризации L2 функции потерь. Значение по умолчанию 3.0.bootstrap_type
определяет метод сэмплинга весов объектов, например это может быть Байес, Бернулли, многомерная случайная величина или Пуассон.depth
= глубина дерева.grow_policy
определяет, как будет применяться жадный алгоритм поиска. Может стоять в значенииSymmetricTree
,Depthwise
илиLossguide
. По умолчаниюSymmetricTree
. ВSymmetricTree
дерево строится уровень за уровнем, пока не достигнет необходимой глубины. На каждом шаге листья с предыдущего дерева разделяются с тем же условием. При выборе параметраDepthwise
дерево строится шаг за шагом, пока не достигнет необходимой глубины. Листья разделяются с использованием условия, которое приводит к лучшему уменьшению потерь. ВLossguide
дерево строится по листьям до тех пор, пока не будет достигнуто заданное количество листьев. На каждом шаге разделяется нетерминальный лист с лучшим уменьшением потерь.min_data_in_leaf
илиmin_child_samples
это минимальное количество обучающих сэмплов в листе. Этот параметр используется только с политиками ростаLossguide
иDepthwise
.max_leaves
илиnum_leaves
этот параметр используется только с политикойLossguide
и определяет количество листьев в дереве.ignored_features
указывает на признаки, которые нужно игнорировать в процессе обучения.nan_mode
метод работы с пропущенными значениями. ПараметрыForbidden, Min
иMax
. При использованииForbidden
наличие пропущенных значений вызовет ошибку. При использовании параметраMin
пропущенные значения будут приняты за минимальные значения для данного признака. ВMax
пропущенные значения будут приняты как минимальные значения для данного признака.leaf_estimation_backtracking
тип бэктрекинга, использующийся при градиентном спуске. По умолчанию используетсяAnyImprovement
.AnyImprovement
уменьшает шаг спуска до того, как значение функции потерь будет меньшим, чем оно было на последней итерации.Armijo
уменьшает шаг спуска до тех пор, пока не будет выполнено условие Вольфе.boosting_type
схема бустинга. Она может быть простой для классической схемы градиентного бустинга или упорядоченной, что обеспечит лучшее качество на небольших наборах данных.score_function
тип оценки, используемой для выбора следующего разбиения при построении дерева.Cosine
используется по умолчанию. Другие доступные вариантыL2, NewtonL2
иNewtonCosine
.early_stopping_rounds
если стоитTrue
, устанавливает тип детектора переобучения вIter
и останавливает обучение, когда достигается оптимальное значение.classes_count
количество классов для задач мультиклассификации.task_type
используете вы CPU или GPU. По умолчанию стоит CPU.devices
идентификаторы устройств GPU, которые будут использоваться для обучения.cat_features
массив с категориальными столбцами.text_features
используется для объявления текстовых столбцов в задачах классификации.
Пример с регрессией
CatBoost в своей реализации использует стандарт scikit-learn. Давайте посмотрим, как мы можем использовать его для регрессии.
Первый шаг, как всегда, импортировать регрессор и создать его экземпляр.
from catboost import CatBoostRegressorcat = CatBoostRegressor()
При обучении модели CatBoost также позволяет нам визуализировать его, установив plot=true:
cat.fit(X_train,y_train,verbose=False, plot=True)
Также мы можем выполнять кроссвалидацию и визуализировать процесс:
from catboost import Pool, cvparams = {"iterations": 100, "depth": 2, "loss_function": "RMSE", "verbose": False}cv_dataset = Pool(data=X_train, label=y_train)scores = cv(cv_dataset, params, fold_count=2, plot="True")
Аналогично вы можете выполнить grid search и визуализировать его:
grid = {'learning_rate': [0.03, 0.1], 'depth': [4, 6, 10], 'l2_leaf_reg': [1, 3, 5, 7, 9]}grid_search_result = cat.grid_search(grid, X=X_train, y=y_train, plot=True)
Также мы можем использовать CatBoost для построения дерева. Вот график первого дерева. Как вы видите из дерева, листья разделяются при одном и том же условии, например, 297, значение > 0.5.
cat.plot_tree(tree_idx=0)
CatBoost дает нам словарь со всеми параметрами модели. Мы можем вывести их, как словарь.
for key,value in cat.get_all_params().items(): print({}, {}.format(key,value))
В этой статье мы рассмотрели преимущества и ограничения CatBoost, а также ее основные параметры обучения. Затем мы реализовали простую регрессию с помощью scikit-learn. Надеюсь, вы получили достаточно информации об этой библиотеке, чтобы самостоятельно продолжить ее исследование.
Узнать подробнее о курсе.