Изменения

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

CatBoost

187 байт добавлено, 22:49, 25 ноября 2018
Нет описания правки
----
== Общий принцип работы ==
=== Дерево решений ===
Алгоритм работы следующий: для каждого документа имеется набор значений признаков, имеется дерево, в вершинах которого условия при выполнении которых осуществляется переход в правого ребенка вершины, иначе в левого. Очень просто для конкретно ребенка пройти до листа по дереву в соответствии со значениям признаков для документа. На выходе каждому документу соответствует значение листа. Это и есть ответ.
=== Бустинг ===
Одно дерево - хорошо, больше - лучше. Идея состоит в том, чтобы каждое следующее дерево училось на предыдущем, уменьшая ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.
=== Градиентный бустинг ===
* В основе CatBoost лежит градиентный бустинг.
Будем минимизировать ошибку опираясь на градиент.
 == Особенности CatBoost == === Режимы работы ===
* Регрессия
Объекты с попарной классификацией
=== Оптимизируемые функции ===
Поддерживает много оптимизируетмых функций. Для конкретной модели выбирается одна оптимизируемая функция.
=== Метрики ===
Поддерживает множество метрик, таких как:
* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.
== Обучение ===== Шаги обучения ===
* Строим дерево
* Считаем значение в листьях
=== Построение дерева ===
Процесс построения происходит жадно.
Дерево строится по слоям. Гарантировано на каждом слое один и тот же сплит (условие, по которому мы делим)
=== Вычисление значений в листьях ===
Во время вычисления значений в листьях можем позволить себе сделать больше операций, так как у нас уже зафиксирована структура дерева и значения в листьях будут вычислены единожды. Поэтому можем себе позволить даже сделать несколько шагов по градиенту.
* Несколько шагов внутри одного дерева
=== Как выбрать лучшее дерево? ===
Смотрим на сколько меняется функция ошибки, выбираем такое дерево, чтобы оно как можно лучше приближало вектор градиентов.
=== Как работает градиентный бустинг? ===
Отметим, что существует идеальный шаг по градиенту, однако листьев в дереве меньше, чем документов в датасете.
Поэтому мы можем пытаться приближать тот самый идеальный шаг.
Чтобы найти лучший сплит, проверяем похожесть после одного шага алгоритма по градиенту.
 
=== Рандомизация ===
 
Есть рандомизация метрики, по которой выбирается лучшее дерево.
''Score += random_strength * Rand (0, lenofgrad * q)''
 
''q'' - множитель, уменьшающийся при увеличении итерации.
Таким образом, рандом уменьшается ближе к концу.
----
== Работа с датасетом ==
=== Режимов выборки данных ===
CatBoost поддерживает несколько режимов выборки данных
Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Это сделано так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку - слишком дорого. Однако значения в листьях с уже готовой структурой дерева считаются один раз, и для большей точности можно позволить использовать весь датасет.
== Рандомизация == Есть рандомизация метрики, по которой выбирается лучшее дерево. ''Score += random_strength * Rand (0, lenofgrad * q)''  ''q'' - множитель, уменьшающийся при увеличении итерации. Таким образом, рандом уменьшается ближе к концу. == Бинаризация фичей ===
Пробовать все - долго. Поэтому выбираем сетку заранее и ходим по ней.
* GreedyLogSum - аналог MaxSumLog, однако в основе лежит жадность, поэтому работает не точно, однако быстрее чем MaxSumLog
=== Работа с категориальными фичами ===
* LabelEncoding - на реальных примерах точность работы низкая, так как появляется отношения порядка между объектами.
Анонимный участник

Навигация