CatBoost — различия между версиями
Строка 75: | Строка 75: | ||
Есть рандомизация скора. ''Score += random_strength * Rand (0, lenofgrad * q)'', где ''q'' - множитель, уменьшающийся при увеличении итерации. Таким образом, рандом уменьшается ближе к концу.рандома | Есть рандомизация скора. ''Score += random_strength * Rand (0, lenofgrad * q)'', где ''q'' - множитель, уменьшающийся при увеличении итерации. Таким образом, рандом уменьшается ближе к концу.рандома | ||
+ | |||
+ | |||
+ | Бинаризация фичей | ||
+ | Пробовать все - долго. Поэтому выбираем сетку заранее и ходим по ней. Есть несколько способов выбора: | ||
+ | |||
+ | 1) Uniform. Равномерно разбиваем отрезок от минимума значения для данной фичи до максимума. | ||
+ | 2) Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k - количество объектов в одном слоте разбиения. | ||
+ | 3) UniformAndQuantiles. Комбинация 1 и 2 пунктов. | ||
+ | |||
+ | MaxSumLog - точно правильная динамика | ||
+ | GreedyLogSUm - жадно не точно но быстрее | ||
+ | |||
+ | |||
+ | ---- | ||
+ | Работа с категориальными факторами | ||
+ | |||
+ | |||
+ | |||
+ | 1) LabelEncoding - работает плохо, так как появляется отношения порядка между объектами. | ||
+ | 2) One-hot encoding - работает, если различных значений фичи не много. Иначе одна фича размножится на множество фичей и влиять на модель заведомо сильнее остальных фичей. | ||
+ | |||
+ | |||
+ | Лучше не делать препроцессинг самим, из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных фичей. Также можно отрегулировать параметр ''one_hot_max_size'' - максимальное количество различных значений у категориальной фичи, чтобы она могла в последствии быть подвержена one-hot encoding. | ||
+ | |||
+ | Прочие методы: | ||
+ | |||
+ | |||
+ | * Статистика по катфичам: todo | ||
+ | Делаем вместо кат Фичи - числовую | ||
+ | Число - переобучение | ||
+ | средний таргет по пулу - переобучение ( один объект 0 значение - просто значение таргета здесь) | ||
+ | Leave one out (среднее по всем объектам кроме данного ( кот 4 успеха 7 не успехов - ctr = 0,3 or 0,4) теперь в одной стороне у нас все успехи или все неуспехи | ||
+ | Leave Bucket out | ||
+ | Число - работает | ||
+ | Выборка на две части и на одной считаем счетчики а на другой обучаемся - но данных сильно меньше становится | ||
+ | Считаем среднее для каждого объекта по новому / делаем перестановку / смотрим значение его кат Фичи / далее смотрим средний таргет только из тех объектов, которые выше | ||
+ | Для каждой кат Фили заново перестановку для одного объекта или за раз все надо считать | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | Параллельное обучение: | ||
+ | |||
+ | Можно обучать несколько моделей одновременно | ||
+ | Учим сразу ''n'', для всех ''n'' моделей используем одинаковую структуру дерева. | ||
+ | Выбираем одну из трех моделей по монетке ( каждая модель соответствует некоторой перестановке / далее выбираем для этой модели лучшее дерево/ и говорим что это дерево лучшее во всех трех моделях) | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | Подбор параметров | ||
+ | |||
+ | Ниже описаны гиперпараметры, на который стоит обратить внимание при использовании библиотеки. | ||
+ | 1) cat_features | ||
+ | 2) Overfitting detector | ||
+ | 3) Число итераций и learning rate | ||
+ | 4) L2_reg | ||
+ | 5) Random_srength | ||
+ | 6) Bagging_temp | ||
+ | 7) Глубина дерева (стоит попробовать 10 и 6) |
Версия 23:55, 7 ноября 2018
Статья посвящена работе с библиотекой CatBoost
Режимы работы: 1) Регрессия (mse - функция потерь) 2) Классификация (надо сделать вероятности, функция потерь - максимизируем вероятность того что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы) predict_proba - для вероятности (складывать нельзя)/ predict - просто рез (и тут можно складывать значени] нескольких моделей) 3) Мультиклассификация 4) Ранжирования - (объекты с попарной классификацией) Максимизируем вероятность что как можно больше пар будут в правильном порядке отранжировано Ранжирование - есть сет данных и есть таргет и есть группы (запросы, дс разбит по группам, нужно лучше отранжировать группу) из группы делаем набор пар и делаем как в пред пункте) Применение ( не важно абсолютное значение формулы)
Оптимизируемые функции:
Поддерживает много оптимизируетмых функций. Для конкретной модели выбирается одна оптимизируемая функция.
Метрики:
Поддерживает много метрик.
Шаги обучения:
1) Строим дерево
2) Считаем значение в листьях
1) Построение дерева:
Процесс построения происходит жадно. Выбираем первую вершину, далее выбираем лучшее дерево с одной вершиной. Далее смотрим скоры и выбираем лучшее дерево. Дерево строится по слоям. Гарантировано на каждом слое один и тот же сплит (условие, по которому мы делим)
Как выбрать лучшее дерево? Смотрим на сколько меняется функция ошибки, выбираем такое дерево, чтобы оно как можно лучше приближало вектор градиентов.
В основе CatBoost лежит грдиентный бустинг.
Как работает градиентный бустинг?
Градиент функции ошибки - все производные по всем значениям функции
Отметим, что существует идеальный шаг по градиенту, однако листьев в дереве меньше, чем документов в датасете. Поэтому мы можем пытаться приближать тот самый идеальный шаг. Чтобы найти лучший сплит, проверяем похожесть после одного шага алгоритма по градиенту - это скор.
Работа с датасетом:
CatBoost поддерживает несколько режимов выборки данных:
1) Бутстрап Бернулли - выбираем документ с вероятностью p. Регулируется параметром sample rate 2) Байесовский бутстрап - байесовское распределение. Регулируется параметром bagging temp
Отметим, что бутстрап используется только для выбора структуры дерева, для подсчета значения в листьях используем всю выборку. Это сделано так как выбор структуры дерева происходит долго, нужно несколько раз пересчитывать значения, поэтому использовать всю выборку - слишком дорого. Однако значения в листьях с уже готовой структурой дерева считаются один раз, и для большей точности можно позволить использовать весь датасет.
Рандомизация скора
Есть рандомизация скора. Score += random_strength * Rand (0, lenofgrad * q), где q - множитель, уменьшающийся при увеличении итерации. Таким образом, рандом уменьшается ближе к концу.рандома
Бинаризация фичей
Пробовать все - долго. Поэтому выбираем сетку заранее и ходим по ней. Есть несколько способов выбора:
1) Uniform. Равномерно разбиваем отрезок от минимума значения для данной фичи до максимума. 2) Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k - количество объектов в одном слоте разбиения. 3) UniformAndQuantiles. Комбинация 1 и 2 пунктов.
MaxSumLog - точно правильная динамика GreedyLogSUm - жадно не точно но быстрее
Работа с категориальными факторами
1) LabelEncoding - работает плохо, так как появляется отношения порядка между объектами. 2) One-hot encoding - работает, если различных значений фичи не много. Иначе одна фича размножится на множество фичей и влиять на модель заведомо сильнее остальных фичей.
Лучше не делать препроцессинг самим, из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных фичей. Также можно отрегулировать параметр one_hot_max_size - максимальное количество различных значений у категориальной фичи, чтобы она могла в последствии быть подвержена one-hot encoding.
Прочие методы:
- Статистика по катфичам: todo
Делаем вместо кат Фичи - числовую Число - переобучение
средний таргет по пулу - переобучение ( один объект 0 значение - просто значение таргета здесь)
Leave one out (среднее по всем объектам кроме данного ( кот 4 успеха 7 не успехов - ctr = 0,3 or 0,4) теперь в одной стороне у нас все успехи или все неуспехи Leave Bucket out Число - работает Выборка на две части и на одной считаем счетчики а на другой обучаемся - но данных сильно меньше становится Считаем среднее для каждого объекта по новому / делаем перестановку / смотрим значение его кат Фичи / далее смотрим средний таргет только из тех объектов, которые выше Для каждой кат Фили заново перестановку для одного объекта или за раз все надо считать
Параллельное обучение:
Можно обучать несколько моделей одновременно Учим сразу n, для всех n моделей используем одинаковую структуру дерева. Выбираем одну из трех моделей по монетке ( каждая модель соответствует некоторой перестановке / далее выбираем для этой модели лучшее дерево/ и говорим что это дерево лучшее во всех трех моделях)
Подбор параметров
Ниже описаны гиперпараметры, на который стоит обратить внимание при использовании библиотеки. 1) cat_features 2) Overfitting detector 3) Число итераций и learning rate 4) L2_reg 5) Random_srength 6) Bagging_temp 7) Глубина дерева (стоит попробовать 10 и 6)