CatBoost — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показано 119 промежуточных версий 12 участников)
Строка 1: Строка 1:
Статья посвящена работе с библиотекой CatBoost
+
Библиотека CatBoost {{---}} метод машинного обучения, основанный на градиентном бустинге (англ. ''gradient boosting'').
  
  
 +
Практически любой современный метод на основе градиентного бустинга работает с числовыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.
 +
Именно поэтому было важно разработать алгоритм, который умеет работать не только с числовыми признаками, но и с категориальными напрямую, закономерности между которыми этот алгоритм будет выявлять самостоятельно, без ручной «помощи».
 +
CatBoost {{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, что она одинаково хорошо работает «из коробки» как с числовыми признаками, так и с категориальными. Программное обеспечение разработано по методологии SCRUM.
 +
 +
Документацию по CatBoost можно найти на сайте<ref>[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/ Документация CatBoost]</ref>.
  
 
----
 
----
 +
== Общий принцип работы ==
 +
 +
=== Дерево решений ===
 +
 +
 +
Алгоритм работы следующий: для каждого документа имеется набор значений признаков, имеется дерево, в вершинах дерева {{---}} условия. Если условие выполнено, осуществляется переход в правого ребенка вершины, иначе в левого. Нужно пройти до листа по дереву в соответствии со значениями признаков для документа. На выходе каждому документу соответствует значение листа. Это и есть ответ.
  
Режимы работы:
+
=== Бустинг ===
1) Регрессия  (mse - функция потерь)
 
2) Классификация (надо сделать вероятности, функция потерь - максимизируем вероятность того что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы) predict_proba - для вероятности (складывать нельзя)/ predict - просто рез (и тут можно складывать значени] нескольких моделей)
 
3) Мультиклассификация
 
4) Ранжирования - (объекты с попарной классификацией)
 
Максимизируем вероятность что как можно больше пар будут в правильном порядке отранжировано
 
Ранжирование - есть сет данных и есть таргет и есть группы (запросы, дс разбит по группам, нужно лучше отранжировать группу) из группы делаем набор пар и делаем как в пред пункте) Применение ( не важно абсолютное значение формулы)
 
  
----
 
  
 +
Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с  использованием  данных  об  ошибках  предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг<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''), таких как:
1) Строим дерево
+
* Регрессия: ''MAE, MAPE, RMSE, SMAPE'' etc.;
2) Считаем значение в листьях
+
* Классификация: ''Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy'' etc.;
 +
* Мультиклассификация: ''MultiClass, MultiClassOneVsAll, HammingLoss, F1'' etc.;
 +
* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.
  
----
+
== Обучение ==
 +
=== Шаги обучения ===
  
 +
* Строим дерево;
 +
* Считаем значение в листьях.
  
1) Построение дерева:
+
=== Построение дерева ===
  
Процесс построения происходит жадно. Выбираем первую вершину, далее выбираем лучшее дерево с одной вершиной. Далее смотрим скоры и выбираем лучшее дерево.
+
Процесс построения происходит жадно.  
Дерево строится по слоям. Гарантировано на каждом слое один и тот же сплит (условие, по которому мы делим)
 
  
Как выбрать лучшее дерево?
+
* Выбираем первую вершину;
Смотрим на сколько меняется функция ошибки, выбираем такое дерево, чтобы оно как можно лучше приближало вектор градиентов.
+
* Выбираем лучшее дерево с одной вершиной;
 +
* Считаем метрику и по ней выбираем лучшее дерево.
  
----
+
Дерево строится по слоям. Гарантировано на каждом слое один и тот же сплит (условие по которому мы делим).
  
 +
=== Вычисление значений в листьях ===
 +
Во время вычисления значений в листьях можем позволить себе сделать больше операций, так как у нас уже зафиксирована структура дерева и значения в листьях будут вычислены единожды. Поэтому можем себе позволить даже сделать несколько шагов по градиенту или применить метод Ньютона.
  
В основе CatBoost лежит грдиентный бустинг.
+
=== Как выбрать лучшее дерево? ===
Как работает градиентный бустинг?
 
  
 +
Смотрим, на сколько меняется функция ошибки, выбираем такое дерево, чтобы оно как можно лучше приближало вектор градиентов.
  
'''Градиент функции ошибки - все производные по всем значениям функции'''
+
=== Как работает градиентный бустинг? ===
  
 
Отметим, что существует идеальный шаг по градиенту, однако листьев в дереве меньше, чем документов в датасете.
 
Отметим, что существует идеальный шаг по градиенту, однако листьев в дереве меньше, чем документов в датасете.
 
Поэтому мы можем пытаться приближать тот самый идеальный шаг.
 
Поэтому мы можем пытаться приближать тот самый идеальный шаг.
Чтобы найти лучший сплит, проверяем похожесть после одного шага алгоритма по градиенту - это скор.
+
Чтобы найти лучший сплит, проверяем похожесть после одного шага алгоритма по градиенту.
 +
 
 +
=== Рандомизация ===
 +
 
 +
Есть рандомизация метрики, по которой выбирается лучшее дерево.
 +
''Score += random_strength *  Rand (0, lenofgrad * q)''
  
 +
''q'' {{---}} множитель, уменьшающийся при увеличении итерации.
 +
Таким образом, рандом уменьшается ближе к концу.
  
 
----
 
----
Работа с датасетом:
 
  
CatBoost поддерживает несколько режимов выборки данных:
+
== Работа с датасетом ==
 +
 
 +
=== Режимов выборки данных ===
 +
 
 +
CatBoost поддерживает несколько режимов выборки данных
 +
 
 +
* Бутстрап (англ. ''bootstrap'') Бернулли {{---}} выбираем документ с вероятностью ''p''. Регулируется параметром ''sample_rate'';
 +
* Байесовский бутстрап {{---}} байесовское распределение. Регулируется параметром ''bagging_temp''.
 +
 
 +
Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Это сделано, так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку слишком дорого. Однако значения в листьях с уже готовой структурой дерева считаются один раз, и для большей точности можно позволить использовать весь датасет.
 +
 
 +
=== Бинаризация признаков ===
 +
 
 +
Пробовать все {{---}} долго. Поэтому выбираем сетку заранее и ходим по ней.
  
1) Бутстрап Бернулли - выбираем документ с вероятностью ''p''. Регулируется параметром ''sample rate''
+
Есть несколько способов выбора:
2) Байесовский бутстрап - байесовское распределение. Регулируется параметром ''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.
Рандомизация скора
 
  
Есть рандомизация скора. ''Score += random_strength *  Rand (0, lenofgrad * q)'', где ''q'' - множитель, уменьшающийся при увеличении итерации. Таким образом, рандом уменьшается ближе к концу.рандома
+
== Подбор параметров ==
  
 +
Ниже описаны гиперпараметры (англ. ''hyperparameters''), на которые стоит обратить внимание при использовании библиотеки.
  
Бинаризация фичей
+
* cat_features;
Пробовать все - долго. Поэтому выбираем сетку заранее и ходим по ней. Есть несколько способов выбора:
+
* Overfitting detector;
 +
* Число итераций и learning rate;
 +
* L2_reg;
 +
* Random_srength;
 +
* Bagging_temp;
 +
* Глубина дерева (стоит попробовать 10 и 6).
  
1) Uniform. Равномерно разбиваем отрезок от минимума значения для данной фичи до максимума.
+
== Полезная функциональность ==
2) Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k - количество объектов в одном слоте разбиения.
 
3) UniformAndQuantiles. Комбинация 1 и 2 пунктов.
 
  
MaxSumLog - точно правильная динамика
+
* Snapshots;
GreedyLogSUm - жадно не точно но быстрее
+
* Overfitting detector;
 +
* CV;
 +
* eval_metrics.
  
 +
== Бенчмарки ==
  
----
+
Сравнение библиотеки 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'''=0.5, '''random_state'''=1234)
 +
'''print'''(X_train.shape, X_validation.shape)
  
1) LabelEncoding - работает плохо, так как появляется отношения порядка между объектами.
+
* Создаем классификатор
2) One-hot encoding - работает, если различных значений фичи не много. Иначе одна фича размножится на множество фичей и влиять на модель заведомо сильнее остальных фичей.
+
'''from''' 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
 +
)
  
Лучше не делать препроцессинг самим, из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных фичей. Также можно отрегулировать параметр ''one_hot_max_size'' - максимальное количество различных значений у категориальной фичи, чтобы она могла в последствии быть подвержена one-hot encoding.
+
* Обучаемся
  
Прочие методы:
+
best_model.fit(
 +
    X_train, y_train,
 +
    '''cat_features'''=cat_features,
 +
    '''eval_set'''=(X_validation, y_validation),
 +
    '''logging_level'''='Silent',
 +
    '''plot'''=True
 +
)
 +
 +
* Вывод числа деревьев в модели
  
 +
'''print'''('Resulting tree count:', best_model.tree_count_)
  
* Статистика по катфичам: todo
+
> '''Resulting tree count: 217'''
Делаем вместо кат Фичи - числовую
 
Число - переобучение
 
  средний таргет по пулу - переобучение ( один объект 0 значение - просто значение таргета здесь)
 
Leave one out (среднее по всем объектам кроме данного ( кот 4 успеха 7 не успехов - ctr = 0,3 or 0,4) теперь в одной стороне у нас все успехи или все неуспехи
 
Leave Bucket out
 
Число - работает
 
Выборка на две части и на одной считаем счетчики а на другой обучаемся - но данных сильно меньше становится
 
Считаем среднее для каждого объекта по новому / делаем перестановку / смотрим значение его кат Фичи / далее смотрим средний таргет только из тех объектов,  которые выше
 
Для каждой кат Фили заново перестановку для одного объекта или за раз все надо считать
 
  
 +
* Используем скользящий контроль (англ. cross validation)
 +
'''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,
 +
    '''shuffle'''=True,
 +
    '''stratified'''=False,
 +
    '''partition_random_seed'''=0
 +
)
  
Можно обучать несколько моделей одновременно
+
* Выводим результат
Учим сразу ''n'', для всех ''n'' моделей используем одинаковую структуру дерева.
+
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'''
  
  
----
+
''Больше примеров<ref>[https://tech.yandex.com/catboost/doc/dg/concepts/python-usages-examples-docpage Примеры ипользования CatBoost]</ref> можно найти на сайте библиотеки''.
  
 +
==См. также==
 +
*[[:Дерево_решений_и_случайный_леc|Дерево решений и случайный леc]]<sup>[на 28.01.19 не создан]</sup>
 +
*[[:Бустинг,_AdaBoost|Бустинг, AdaBoost]]
  
Подбор параметров
+
==Примечания==
 +
<references/>
  
Ниже описаны гиперпараметры, на который стоит обратить внимание при использовании библиотеки.
+
== Источники информации ==
1) cat_features
+
* [https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/| Overview of CatBoost]
2) Overfitting detector
+
* [https://en.wikipedia.org/wiki/Gradient_boosting| Gradient Boosting, WIkipedia]
3) Число итераций и learning rate
+
[[Категория: Машинное обучение]]
4) L2_reg
+
[[Категория: Ансамбли]]
5) Random_srength
 
6) Bagging_temp
 
7) Глубина дерева (стоит попробовать 10 и 6)
 

Текущая версия на 19:29, 4 сентября 2022

Библиотека CatBoost — метод машинного обучения, основанный на градиентном бустинге (англ. gradient boosting).


Практически любой современный метод на основе градиентного бустинга работает с числовыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. categorical features), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели. Именно поэтому было важно разработать алгоритм, который умеет работать не только с числовыми признаками, но и с категориальными напрямую, закономерности между которыми этот алгоритм будет выявлять самостоятельно, без ручной «помощи». CatBoost — библиотека для градиентного бустинга, главным преимуществом которой является то, что она одинаково хорошо работает «из коробки» как с числовыми признаками, так и с категориальными. Программное обеспечение разработано по методологии SCRUM.

Документацию по CatBoost можно найти на сайте[1].


Общий принцип работы

Дерево решений

Алгоритм работы следующий: для каждого документа имеется набор значений признаков, имеется дерево, в вершинах дерева — условия. Если условие выполнено, осуществляется переход в правого ребенка вершины, иначе в левого. Нужно пройти до листа по дереву в соответствии со значениями признаков для документа. На выходе каждому документу соответствует значение листа. Это и есть ответ.

Бустинг

Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг[2].

Далее будет рассматриваться бустинг деревьев решений. Будем строить несколько деревьев, чтобы добавление новых деревьев уменьшало ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.

Градиентный бустинг

  • В основе CatBoost лежит градиентный бустинг.
  • Градиент функции ошибки — все производные по всем значениям функции

Градиентный бустинг — метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Он строит модель поэтапно, позволяя оптимизировать произвольную дифференцируемую функцию потерь.

Особенности CatBoost

Режимы работы

  • Регрессия (англ. regression);
  • Классификация (англ. classification);
Функция потерь (англ. loss function) — максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы.
Функция predict_proba — на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя.
Функция predict — выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.
  • Мультиклассификация (англ. multiclass classification);
  • Ранжирование (англ. ranking).

Объекты с попарной классификацией (??)

Метрики

Поддерживает множество метрик[на 28.01.19 не создан] (англ. metrics), таких как:

  • Регрессия: 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.
Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Это сделано, так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку слишком дорого. Однако значения в листьях с уже готовой структурой дерева считаются один раз, и для большей точности можно позволить использовать весь датасет.

Бинаризация признаков

Пробовать все — долго. Поэтому выбираем сетку заранее и ходим по ней.

Есть несколько способов выбора:

  • 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 на наборе публичных датасетов[3].

Пример использования

  • Делим данные на тренировочное и тестовое множество
from sklearn.model_selection import train_test_split
X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.5, random_state=1234)
print(X_train.shape, X_validation.shape)
  • Создаем классификатор
from 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
)
  • Обучаемся
best_model.fit(
   X_train, y_train,
   cat_features=cat_features,
   eval_set=(X_validation, y_validation),
   logging_level='Silent',
   plot=True
)

  • Вывод числа деревьев в модели
print('Resulting tree count:', best_model.tree_count_)
> Resulting tree count: 217
  • Используем скользящий контроль (англ. cross validation)
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,
   shuffle=True,
   stratified=False,
   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


Больше примеров[4] можно найти на сайте библиотеки.

См. также

Примечания

Источники информации