Изменения

Перейти к: навигация, поиск

CatBoost

5332 байта добавлено, 19:29, 4 сентября 2022
м
rollbackEdits.php mass rollback
Статья посвящена работе с библиотекой Библиотека CatBoost {{-- методу -}} метод машинного обучения, основанному основанный на градиентном бустинге(англ. ''gradient boosting'').
Практически любой современный метод на основе градиентного бустинга работает с числамичисловыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.Именно поэтому было важно научить машину разработать алгоритм, который умеет работать не только с числамичисловыми признаками, но и с категориями категориальными напрямую, закономерности между которыми она этот алгоритм будет выявлять самостоятельно, без ручной «помощи».CatBoost разработан так{{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, чтобы что она одинаково хорошо работать работает «из коробки» как с числовыми признаками, так и с категориальными. Программное обеспечение разработано по методологии SCRUM.
Документацию по CatBoost можно найти здесь: на сайте<ref>[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/Документация CatBoost]</ref>.
----
== Общий принцип работы ==
=== Дерево решений ===
Алгоритм работы следующий: для каждого документа имеется набор значений фичейпризнаков, имеется дерево, в вершинах которого дерева {{---}} условия при выполнении которых мы идем . Если условие выполнено, осуществляется переход в правого ребенка вершины, иначе в левого. Очень просто для конкретно ребенка Нужно пройти до листа по дереву в соответствии со значениям фич значениями признаков для документа. На выходе каждому документу соответствует значение листа. Это и есть ответ.
=== Бустинг ===
Одно дерево - хорошо, больше - лучше. Идея состоит в том, чтобы каждое следующее дерево училось на предыдущем, уменьшая ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.
Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг<ref>[https://en.wikipedia.org/wiki/Gradient_boosting |Gradient Boosting, Wikipedia]</ref>. Далее будет рассматриваться бустинг деревьев решений. Будем строить несколько деревьев, чтобы добавление новых деревьев уменьшало ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным. === Градиентный бустинг ===
* В основе CatBoost лежит градиентный бустинг.
* Градиент функции ошибки {{- --}} все производные по всем значениям функцииГрадиентный бустинг {{---}} метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Он строит модель поэтапно, позволяя оптимизировать произвольную дифференцируемую функцию потерь. == Особенности CatBoost == === Режимы работы === * Регрессия (англ. ''regression''); * Классификация (англ. ''classification''); Функция потерь (англ. ''loss function'') {{---}} максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы. Функция ''predict_proba'' {{---}} на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя. Функция ''predict'' {{---}} выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.* Мультиклассификация (англ. ''multiclass classification'');* Ранжирование (англ. ''ranking'').Объекты с попарной классификацией (??) === Метрики ===
Будем минимизировать ошибку опираясь Поддерживает множество [[Оценка_качества_в_задачах_классификации_и_регрессии|метрик]]<sup>[на градиент28.01.19 не создан]</sup> (англ. ''metrics''), таких как:== Режимы работы ==* Регрессия: ''MAE, MAPE, RMSE, SMAPE'' etc.;* Классификация: ''Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy'' etc.;* Мультиклассификация: ''MultiClass, MultiClassOneVsAll, HammingLoss, F1'' etc.;* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.
* Регрессия == Обучение ==* Классификация Функция потерь - максимизируем вероятность того что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулыФункция ```predict_proba``` - на вхоже получаем готовый вероятности. Нужно отметить, что складывать их уже нельзя.Функция ```predict``` - выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.* Мультиклассификация * Ранжирование Объекты с попарной классификацией=== Шаги обучения ===
----* Строим дерево;* Считаем значение в листьях. === Построение дерева === Процесс построения происходит жадно.  * Выбираем первую вершину;* Выбираем лучшее дерево с одной вершиной; * Считаем метрику и по ней выбираем лучшее дерево. Дерево строится по слоям. Гарантировано на каждом слое один и тот же сплит (условие по которому мы делим).
== Оптимизируемые функции =Вычисление значений в листьях === Во время вычисления значений в листьях можем позволить себе сделать больше операций, так как у нас уже зафиксирована структура дерева и значения в листьях будут вычислены единожды. Поэтому можем себе позволить даже сделать несколько шагов по градиенту или применить метод Ньютона.
Поддерживает много оптимизируетмых функций. Для конкретной модели выбирается одна оптимизируемая функция.=== Как выбрать лучшее дерево? ===
----Смотрим, на сколько меняется функция ошибки, выбираем такое дерево, чтобы оно как можно лучше приближало вектор градиентов.
== Метрики = Как работает градиентный бустинг? ===
Поддерживает множество метрикОтметим, таких как * Регрессия: ```MAE, MAPEчто существует идеальный шаг по градиенту, RMSEоднако листьев в дереве меньше, SMAPE etcчем документов в датасете.```* Классификация: ```Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy etcПоэтому мы можем пытаться приближать тот самый идеальный шаг.```* Мультиклассификация: ```MultiClass, MultiClassOneVsAll, HammingLossЧтобы найти лучший сплит, F1 etcпроверяем похожесть после одного шага алгоритма по градиенту.```* Ранжирование: ```NDCG, PrecisionAt, RecallAt, PFound, PairLogit etc.```----=== Рандомизация ===
Есть рандомизация метрики, по которой выбирается лучшее дерево. ''Score +== Шаги обучения ==random_strength * Rand (0, lenofgrad * q)''
* Строим дерево''q'' {{---}} множитель, уменьшающийся при увеличении итерации. * Считаем значение в листьяхТаким образом, рандом уменьшается ближе к концу.
----
== Построение дерева Работа с датасетом == === Режимов выборки данных ===
Процесс построения происходит жадно. CatBoost поддерживает несколько режимов выборки данных
* Выбираем первую вершину* Выбираем лучшее дерево Бутстрап (англ. ''bootstrap'') Бернулли {{---}} выбираем документ с одной вершинойвероятностью ''p''. Регулируется параметром ''sample_rate'';* Считаем скоры и выбираем лучшее деревоБайесовский бутстрап {{---}} байесовское распределение. Регулируется параметром ''bagging_temp''. // todo вставить формулу рассвета скора для сплита
Дерево строится по слоям Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Гарантировано на каждом слое Это сделано, так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку слишком дорого. Однако значения в листьях с уже готовой структурой дерева считаются один раз, и тот же сплит (условие, по которому мы делим)для большей точности можно позволить использовать весь датасет.
== Вычисление значений в листьях = Бинаризация признаков === Во время вычисления значений в листьях можем позволить себе сделать больше операций, так как у нас уже зафиксирована структура дерева и значения в листьях будут вычислены единожды. Поэтому можем себе позволить даже сделать несколько шагов по градиенту.
* Метод Ньютона или шаг Пробовать все {{---}} долго. Поэтому выбираем сетку заранее и ходим по градиенту* Несколько шагов внутри одного дереваней.
== Как выбрать лучшее дерево? ==Есть несколько способов выбора:
Смотрим * Uniform. Равномерно разбиваем отрезок от минимума значения для данного признака до максимума;* Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на сколько меняется функция ошибкигруппы по k объектов, где k {{---}} количество объектов в одном слоте разбиения;* UniformAndQuantiles. Комбинация 1 и 2 пунктов;* MaxSumLog {{---}} в основе лежит динамика, работает долго;* GreedyLogSum {{---}} аналог MaxSumLog, используется жадный алгоритм, выбираем такое деревопоэтому работает не точно, чтобы оно как можно лучше приближало вектор градиентоводнако быстрее чем MaxSumLog.
----=== Работа с категориальными признаками ===
== Как работает градиентный бустинг? ==* LabelEncoding {{---}} на реальных примерах точность работы низкая, так как появляется отношения порядка между объектами;* One-hot encoding {{---}} дает неплохую точность, если различных значений признаков не много. Иначе один признак размножится на множество признаков и будет влиять на модель заведомо сильнее остальных признаков.
Отметим Лучше не делать препроцессинг самим из-за проблем, что существует идеальный шаг по градиентуописанных выше. В CatBoost можно задать параметр cat_features, однако листьев в дереве меньшепередав туда индексы категориальных признаков. Также можно отрегулировать параметр ''one_hot_max_size'' {{---}} максимальное количество различных значений у категориального признака, чем документов чтобы он мог в датасете.Поэтому мы можем пытаться приближать тот самый идеальный шаг.Чтобы найти лучший сплит, проверяем похожесть после одного шага алгоритма по градиенту последствии быть подвержен one- это скорhot encoding.
----== Подбор параметров ==
== Работа с датасетом ==Ниже описаны гиперпараметры (англ. ''hyperparameters''), на которые стоит обратить внимание при использовании библиотеки.
* cat_features;
* Overfitting detector;
* Число итераций и learning rate;
* L2_reg;
* Random_srength;
* Bagging_temp;
* Глубина дерева (стоит попробовать 10 и 6).
CatBoost поддерживает несколько режимов выборки данных== Полезная функциональность ==
* Бутстрап Бернулли - выбираем документ с вероятностью ''p''. Регулируется параметром ''sample rate''Snapshots;* Overfitting detector;* CV;* Байесовский бутстрап - байесовское распределениеeval_metrics. Регулируется параметром ''bagging temp''
''Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Это сделано так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку - слишком дорого. Однако значения в листьях == Бенчмарки == Сравнение библиотеки CatBoost с уже готовой структурой дерева считаются один разоткрытыми аналогами XGBoost, LightGBM и для большей точности можно позволить использовать весь датасетH20 на наборе публичных датасетов<ref>[https://catboost.yandex/#benchmark| Benchmarks]</ref>.''----
== Рандомизация скора Пример использования ==* Делим данные на тренировочное и тестовое множество '''from''' sklearn.model_selection '''import''' train_test_split
Есть рандомизация скора. X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''Score += random_strength * Rand (0.5, lenofgrad * q'''random_state'''=1234) '' 'print'''(X_train.shape, X_validation.shape)
* Создаем классификатор '''from''q'catboost ' - множитель, уменьшающийся при увеличении итерации. Таким образом, рандом уменьшается ближе к концу.----''import''' CatBoostClassifier
best_model =CatBoostClassifier( '''bagging_temperature'''= Бинаризация фичей 1, '''random_strength'''=1, '''thread_count'''=3, '''iterations'''=500, '''l2_leaf_reg''' = 4.0, '''learning_rate''' = 0.07521709965938336, '''save_snapshot'''=True, '''snapshot_file'''='snapshot_best.bkp', '''random_seed'''=63, '''od_type'''='Iter', '''od_wait'''=20, '''custom_loss'''=['AUC', 'Accuracy'], '''use_best_model'''=True )
Пробовать все - долго. Поэтому выбираем сетку заранее и ходим по ней. Есть несколько способов выбора:* Обучаемся
* Uniform. Равномерно разбиваем отрезок от минимума значения для данной фичи до максимума best_model.fit(* Медианная сетка. Задаем количество разбиений над множеством значений X_train, y_train, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов '''cat_features'''=cat_features, где k - количество объектов в одном слоте разбиения.* UniformAndQuantiles. Комбинация 1 и 2 пунктов. '''eval_set'''=(X_validation, y_validation),* MaxSumLog - в основе лежит точно правильная динамика '''logging_level'''='Silent', работает долго. '''plot'''=True ) * GreedyLogSum - аналог MaxSumLog, однако Вывод числа деревьев в основе лежит жадность, поэтому работает не точно, однако быстрее чем MaxSumLogмодели
---- '''print'''('Resulting tree count:', best_model.tree_count_)
== Работа с категориальными фичами == > '''Resulting tree count: 217'''
* LabelEncoding - работает плохо, так как появляется отношения порядка между объектамиИспользуем скользящий контроль (англ.cross validation)* One-hot encoding - работает, если различных значений фичи не много. Иначе одна фича размножится на множество фичей и влиять на модель заведомо сильнее остальных фичей. '''from''' catboost '''import''' cv
params = best_model.get_params()
params['iterations'] = 10
params['custom_loss'] = 'AUC'
del params['use_best_model']
pool1 = Pool(X, '''label'''=y, '''cat_features'''=cat_features)
Лучше не делать препроцессинг самимcv_data = cv( '''params''' = params, '''pool''' = pool1, '''fold_count'''=2, из-за проблем '''inverted'''=False, описанных выше. В CatBoost можно задать параметр cat_features '''shuffle'''=True, передав туда индексы категориальных фичей. Также можно отрегулировать параметр ''one_hot_max_size'stratified' - максимальное количество различных значений у категориальной фичи''=False, чтобы она могла в последствии быть подвержена one-hot encoding. '''partition_random_seed'''=0 )
----* Выводим результат best_value = np.max(cv_data['AUC_test_avg']) best_iter = np.argmax(cv_data['AUC_test_avg']) '''print'''('Best validation AUC score: {:.2f}±{:.2f} on step {}'.format( best_value, cv_data['AUC_test_stddev'][best_iter], best_iter ))
== Подбор параметров == > '''Best validation AUC score: 0.91±0.00 on step 9'''
Ниже описаны гиперпараметры, на который стоит обратить внимание при использовании библиотеки.
* cat_features
* Overfitting detector
* Число итераций и learning rate
* L2_reg
* Random_srength
* Bagging_temp
* Глубина дерева (стоит попробовать 10 и 6)
== Полезная функциональность ==''Больше примеров<ref>[https://tech.yandex.com/catboost/doc/dg/concepts/python-usages-examples-docpage Примеры ипользования CatBoost]</ref> можно найти на сайте библиотеки''.
* Snapshots* Overfitting detector==См. также==* cv[[:Дерево_решений_и_случайный_леc|Дерево решений и случайный леc]]<sup>[на 28.01.19 не создан]</sup>* eval_metrics[[:Бустинг,_AdaBoost|Бустинг, AdaBoost]]
== Бенчмрки Примечания==<references/>
Сравнение библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов== Источники информации ==* [https://tech.yandex. Результаты com/catboost/doc/dg/concepts/about- docpage/| Overview of CatBoost]* [https://catboosten.wikipedia.yandexorg/wiki/#benchmarkGradient_boosting| Gradient Boosting, WIkipedia][[Категория: Машинное обучение]][[Категория: Ансамбли]]
1632
правки

Навигация