1632
правки
Изменения
CatBoost
,rollbackEdits.php mass rollback
Практически любой современный метод на основе градиентного бустинга работает с числамичисловыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.Именно поэтому было важно научить машину разработать алгоритм, который умеет работать не только с числамичисловыми признаками, но и с категориями категориальными напрямую, закономерности между которыми она этот алгоритм будет выявлять самостоятельно, без ручной «помощи».CatBoost разработан так{{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, чтобы что она одинаково хорошо работать работает «из коробки» как с числовыми признаками, так и с категориальными. Программное обеспечение разработано по методологии SCRUM.
Документацию по CatBoost можно найти здесь: на сайте<ref>[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/Документация CatBoost]</ref>.
----
== Общий принцип работы ==
=== Дерево решений ===
Алгоритм работы следующий: для каждого документа имеется набор значений фичейпризнаков, имеется дерево, в вершинах которого дерева {{---}} условия при выполнении которых мы идем . Если условие выполнено, осуществляется переход в правого ребенка вершины, иначе в левого. Очень просто для конкретно ребенка Нужно пройти до листа по дереву в соответствии со значениям фич значениями признаков для документа. На выходе каждому документу соответствует значение листа. Это и есть ответ.
=== Бустинг ===
* Регрессия Градиент функции ошибки {{---}} все производные по всем значениям функции* Классификация Функция потерь Градиентный бустинг {{- максимизируем вероятность того что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулыФункция ```predict_proba``` - на вхоже получаем готовый вероятности. Нужно отметить}} метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, что складывать их уже нельзя.Функция ```predict``` - выдает необработанный результатобычно деревьев решений. Такой результат можно складыватьОн строит модель поэтапно, например, с результатами других моделейпозволяя оптимизировать произвольную дифференцируемую функцию потерь.* Мультиклассификация * Ранжирование Объекты с попарной классификацией
== Оптимизируемые функции Особенности CatBoost ==
* Регрессия (англ. ''regression''); * Классификация (англ. ''classification''); Функция потерь (англ. ''loss function'') {{---}} максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность -это сигмоида над значением формулы. Функция ''predict_proba'' {{---}} на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя. Функция ''predict'' {{---}} выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.* Мультиклассификация (англ. ''multiclass classification'');* Ранжирование (англ. ''ranking'').Объекты с попарной классификацией (??)
=== Метрики == Поддерживает множество метрик, таких как * Регрессия: ```MAE, MAPE, RMSE, SMAPE etc.```* Классификация: ```Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy etc.```* Мультиклассификация: ```MultiClass, MultiClassOneVsAll, HammingLoss, F1 etc.```* Ранжирование: ```NDCG, PrecisionAt, RecallAt, PFound, PairLogit etc.```----=
=== Построение дерева ===
Процесс построения происходит жадно.
* Выбираем первую вершину;* Выбираем лучшее дерево с одной вершиной. ; * Считаем скоры метрику и по ней выбираем лучшее дерево. // todo вставить формулу рассвета скора для сплита
Дерево строится по слоям. Гарантировано на каждом слое один и тот же сплит (условие, по которому мы делим).
=== Вычисление значений в листьях === Во время вычисления значений в листьях можем позволить себе сделать больше операций, так как у нас уже зафиксирована структура дерева и значения в листьях будут вычислены единожды. Поэтому можем себе позволить даже сделать несколько шагов по градиентуили применить метод Ньютона.
Есть рандомизация метрики, по которой выбирается лучшее дерево. ''Score +== Как работает градиентный бустинг? ==random_strength * Rand (0, lenofgrad * q)''
----
== Работа с датасетом ==
=== Режимов выборки данных ===
CatBoost поддерживает несколько режимов выборки данных
* Бутстрап (англ. ''bootstrap'') Бернулли {{-- -}} выбираем документ с вероятностью ''p''. Регулируется параметром ''sample_rate'';* Байесовский бутстрап {{- --}} байесовское распределение. Регулируется параметром ''bagging_temp''. Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Это сделано, так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку слишком дорого. Однако значения в листьях с уже готовой структурой дерева считаются один раз, и для большей точности можно позволить использовать весь датасет. === Бинаризация признаков ===
Есть несколько способов выбора: * 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). == Полезная функциональность == * Snapshots;* Overfitting detector;* CV;* eval_metrics. == Бенчмарки == Сравнение библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов<ref>[https://catboost.yandex/#benchmark| Benchmarks]</ref>.
== Рандомизация скора Пример использования ==* Делим данные на тренировочное и тестовое множество '''from''' sklearn.model_selection '''import''' train_test_split
* Создаем классификатор '''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 )
== Бенчмрки Примечания==<references/>