Catboost для алгоритмов машинного обучения

машинное обучение алгоритм

CatBoost — это библиотека машинного обучения, исходный код которой был открыт российским поисковым гигантом Яндексом в 2017 году. Это Gradient Boosting (повышение градиента) + Categorical Features (характеристики категорий), а также фреймворк машинного обучения, основанный на деревьях принятия решений, повышающих градиент.

CatBoostВведение

Название CatBoost происходит от двух слов «Категория» и «BoostingКак упоминалось ранее, эта библиотека может хорошо обрабатывать различные категориальные данные и представляет собой библиотеку алгоритмов повышения градиента, которая может хорошо обрабатывать категориальные функции.

Преимущества CatBoost

  • Превосходная производительность: конкурирует с любым передовым алгоритмом машинного обучения с точки зрения производительности.
  • Надежность/надежность: уменьшает потребность в настройке гиперпараметров и снижает вероятность переобучения, что также делает модель более общей.
  • Простота использования: предоставляет интерфейс Python для интеграции со scikit, а также интерфейсы R и командной строки.
  • Практичность: может обращаться с категориальными и числовыми функциями.
  • Расширяемый: поддержка пользовательских функций потерь

Чем CatBoost отличается от других алгоритмов бустинга?

Разработчики CatBoost сравнили его производительность с конкурентами на стандартных наборах данных ML:

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

Введение в технологию CatBoost

категориальные признаки

Первоначальное намерение алгоритма CatBoost состоит в том, чтобы лучше обрабатывать категориальные функции в функциях GBDT. При работе с категориальными функциями в функциях GBDT проще всего заменить их средним значением меток, соответствующих категориальной функции. В дереве решений среднее значение метки будет использоваться в качестве критерия для разделения узлов. Этот метод называется Greedy Target-based Statistics, или сокращенно Greedy TBS, и формула такова:

 \[\hat{x}_k^i=\frac{\sum_{j=1}^{n}[x_{j,k}=x_{i,k}]\cdot Y_i}{\sum_{j=1}^{n}[x_{j,k}=x_{i,k}]}\]

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

Стандартный способ улучшить Greedy TBS — добавить априорный член распределения, который уменьшает влияние шума и низкочастотных данных на распределение данных:

 \[\hat{x}_k^i=\frac{\sum_{j=1}^{p-1}[x_{\sigma _j,k}=x_{\sigma _p,k}]Y_{\sigma _j}+a\cdot P}{\sum_{j=1}^{p-1}[x_{\sigma _j,k}=x_{\sigma _p,k}]+a}\]

где P — добавленный предшествующий член, а — весовой коэффициент, который обычно больше 0. Добавление априорных значений является обычной практикой для уменьшения зашумленных данных для объектов с меньшим количеством классов. Для задач регрессии, как правило, предыдущий член может принимать среднее значение набора данных. Для бинарной классификации предшествующим термином является априорная вероятность положительного примера. Использование нескольких перестановок наборов данных также допустимо, однако прямое вычисление может привести к переобучению. CatBoost использует относительно новый метод вычисления значений конечных узлов, который позволяет избежать проблемы переобучения при прямом вычислении в нескольких наборах данных.

Комбинация функций

Стоит отметить, что любое сочетание нескольких категориальных признаков может рассматриваться как новый признак. Например, в приложении для музыкальных рекомендаций у нас есть две категориальные функции: идентификатор пользователя и музыкальный жанр. Если некоторые пользователи предпочитают рок-музыку, указанная выше информация будет потеряна при преобразовании идентификатора пользователя и музыкального жанра в цифровые характеристики. Объединение этих двух функций решает эту проблему и позволяет получить новую мощную функцию. Однако количество комбинаций экспоненциально растет с количеством категориальных признаков в наборе данных, поэтому невозможно учесть все комбинации в алгоритме. При построении новых точек разделения для текущего дерева CatBoost рассматривает комбинации с использованием жадной стратегии. Для первого разделения дерева никакая комбинация не рассматривается. Для следующего разделения CatBoost объединяет все комбинаторные, категориальные признаки текущего дерева со всеми категориальными признаками в наборе данных. Комбинации динамически преобразуются в числа. CatBoost также генерирует комбинацию числовых и категориальных признаков следующим образом: все точки разделения, выбранные деревом, обрабатываются как категориальные признаки с двумя значениями и объединяются так же, как категориальные признаки.

Важные детали реализации

Другой способ заменить значение категории числом — подсчитать, сколько раз это значение категории встречается в объекте набора данных. Это простая, но мощная техника, которая также реализована в CatBoost. Эта статистика также применима к комбинациям функций.

Алгоритм CatBoost Чтобы подобрать оптимальное априорное значение на каждом шаге, мы рассматриваем несколько априорных значений и строим функцию для каждого априорного значения, что качественно более эффективно, чем упомянутые стандартные методы.

Преодолеть смещение градиента

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

Многие алгоритмы, использующие методы GBDT (например,XGBoost,LightGBM), построение дерева делится на два этапа: выбор древовидной структуры и вычисление значения листовых узлов после фиксации древовидной структуры. Чтобы выбрать наилучшую древовидную структуру, алгоритм перечисляет различные разбиения, строит дерево из этих разбиений, вычисляет значения в полученных листовых узлах, затем оценивает полученное дерево и, наконец, выбирает наилучшее разбиение. Значения листовых узлов на обоих этапах рассчитываются как аппроксимации градиента или размера шага Ньютона. Первый этап CatBoost использует объективную оценку размера шага градиента, а второй этап выполняется с использованием традиционной схемы GBDT.

Быстрый счет

CatBoost использует забывчивые деревья в качестве базовых предикторов. В этом типе дерева один и тот же критерий разбиения используется на всем уровне дерева. Такие деревья сбалансированы и менее склонны к переоснащению. Деревья забвения, усиленные градиентом, успешно используются для различных учебных задач. В забывчивом дереве индекс каждого листового узла может быть закодирован как двоичный вектор длины, равной глубине дерева. Это широко используется в оценщике модели CatBoost: сначала мы бинаризируем все функции с плавающей запятой, статистику и функции с горячим кодированием, а затем используем двоичные функции для вычисления прогнозов модели.

Все двоичные собственные значения всех выборок хранятся в непрерывном векторе B. Значение листового узла хранится в размере2^dВектор чисел с плавающей запятой, где d — глубина дерева. Для вычисления индексов листовых узлов t-го дерева для выборки x строим бинарный вектор:

 \[\sum_{i=0}^{d-1}2^{i}\cdot B(x,f(t,j))\]

где B(x,f) — значение бинарного признака f в выборке x, считанное из вектора B, а f(t,i) — количество двоичных признаков в t-м дереве с глубины i. Эти векторы могут быть построены параллельно данным, что может обеспечить ускорение до 3 раз.

Быстрое обучение на основе графического процессора

плотные числовые признаки

Одной из самых больших трудностей для любого алгоритма GBDT является поиск наилучшего разделения. Особенно для плотных числовых наборов данных этот шаг представляет собой большую вычислительную нагрузку при построении дерева решений. CatBoost использует забывчивое дерево решений в качестве базовой модели и разбивает функции на фиксированное количество бинов, чтобы уменьшить использование памяти. Количество бинов является параметром алгоритма. Поэтому для поиска наилучшей сегментации можно использовать подход на основе гистограммы. Мы используем 32-битное целое число для упаковки нескольких числовых функций, правила:

  • Храните бинарные функции с 1 битом, каждое целое число включает 32 функции
  • 4 бита для хранения признаков с не более чем 15 значениями, каждое целое включает 8 признаков
  • Используйте 8 бит для хранения других признаков (максимальное количество различных значений — 255), каждое целое число включает 4 признака

CatBoost, по крайней мере, так же эффективен, как LightGBM, с точки зрения использования памяти графического процессора. Основное отличие состоит в том, что используется другой метод расчета гистограммы. Алгоритмы LightGBM и XGBoost имеют один существенный недостаток: они основаны на атомарных операциях. Этот метод легко обрабатывается в памяти, но он может работать медленнее на хороших графических процессорах. На самом деле гистограммы можно вычислять более эффективно, не используя атомарные операции.

категориальные признаки

CatBoost реализует несколько методов обработки категориальных признаков. Для функций с горячим кодированием нам не требуется какой-либо специальной обработки, и методы поиска сегментации на основе гистограммы могут легко справиться с этим случаем. На этапе предварительной обработки данных могут быть выполнены статистические расчеты по отдельным категориальным признакам. CatBoost также использует статистику по комбинациям функций. Их обработка — самая медленная и самая потребляющая память часть алгоритма.

CatBoost использует идеальное хеширование для хранения значений категориальных признаков, чтобы уменьшить использование памяти. Из-за ограничений памяти графического процессора мы храним идеальные хэши с побитовым сжатием в ОЗУ ЦП вместе с необходимыми потоками данных, перекрывающимися вычислениями и операциями с памятью. Динамическое построение комбинаций функций требует от нас динамического построения (идеальной) хеш-функции для этой новой функции и вычисления статистики о некоторой перестановке для каждого уникального значения хэша. CatBoost использует сортировку по основанию для создания идеальных хэшей и группирует наблюдения по хешу. Внутри каждой группы необходимо вычислить префиксную сумму некоторой статистики. Вычисление этой статистики выполняется с использованием примитивов графического процессора сканирования сегментов (реализация сканирования сегментов CatBoost выполняется с помощью преобразований операторов и основана на эффективной реализации примитивов сканирования в CUB).

Поддержка нескольких графических процессоров

Реализация графического процессора в CatBoost может поддерживать несколько графических процессоров. Распределенное древовидное обучение можно распараллелить по данным или функциям. CatBoost использует вычислительную схему, в которой несколько изученных наборов данных организованы для вычисления статистики категориальных признаков во время обучения.

Установка и использование CatBoost

Установка CatBoost очень проста, просто выполните pip install catboost.

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

import numpy as np
import catboost as cb
 
train_data = np.random.randint(0, 100, size=(100, 10))
train_label = np.random.randint(0, 2, size=(100))
test_data = np.random.randint(0,100, size=(50,10))
 
model = cb.CatBoostClassifier(iterations=2, depth=2, learning_rate=0.5, loss_function='Logloss',
                              logging_level='Verbose')
model.fit(train_data, train_label, cat_features=[0,2,5])
preds_class = model.predict(test_data)
preds_probs = model.predict_proba(test_data)
print('class = ',preds_class)
print('proba = ',preds_probs)

метод:

  • Fit
    • X: тип данных входных данных может быть list, pandas.DataFrame, pandas.Series.
    • y=None
    • cat_features = None: функции категории, используемые для обработки
    • sample_weight=None: вес выборки входных данных
    • logging_level = None: контролирует, выводить ли информацию журнала или какую информацию
    • plot=False: во время обучения, построения графиков, метрик, прошедшего времени и т. д.
    • eval_set = Нет: набор проверки, список типов данных (X, y) кортежей
    • baseline=None
    • use_best_model=None
    • verbose=None
  • предсказание возвращает категорию, к которой принадлежит проверочный образец, тип данных — массив
  • predict_proba возвращает вероятность класса, к которому принадлежит проверочная выборка, тип данных — массив
  • get_feature_importance
  • eval_metrics
  • save_model
  • load_model
  • get_params
  • score

Атрибут:

  • is_fitted_
  • tree_count_
  • feature_importances_
  • random_seed_

Подробное объяснение параметров CatBoost

Общие параметры:

  • loss_function Функция потерь, поддерживает RMSE, Logloss, MAE, CrossEntropy, Quantile, LogLinQuantile, Multiclass, MultiClassOneVsAll, MAPE, Poisson. СКО по умолчанию.
  • custom_metric Выходная метрика во время обучения. Эти функции не оптимизированы и показаны только в информационных целях. По умолчанию Нет.
  • Функция потерь eval_metric для теста переобучения (установите True) и выбор лучшей модели (установите True) для оптимизации.
  • итераций Максимальное количество деревьев. По умолчанию 1000.
  • Learning_rate Скорость обучения. По умолчанию 03.
  • random_seed Случайное семя во время обучения
  • l2_leaf_reg Обычный параметр L2. По умолчанию 3
  • bootstrap_type определяет логику вычисления веса, необязательные параметры: Пуассон (поддерживается только для GPU)/байесовский/бернуллиевский/Нет, по умолчанию используется байесовский
  • bagging_temperature Сила байесовского управления пакетированием, интервал [0, 1]. По умолчанию 1.
  • subsample устанавливает частоту дискретизации, используемую, когда bootstrap_type установлен на Пуассона или Бернулли, по умолчанию 66
  • sample_frequency Установить частоту дискретизации при создании дерева, необязательное значение PerTree/PerTreeLevel, по умолчанию PerTreeLevel
  • random_strength Множитель стандартного отклонения оценки. По умолчанию 1.
  • Use_best_model При установке этого параметра необходимо предоставить тестовые данные, а количество деревьев получается путем обучения параметров и оптимизации функции потерь. По умолчанию Ложь.
  • best_model_min_trees Минимальное количество деревьев, которое должна иметь лучшая модель.
  • depth Дерево глубокое, максимум 16, рекомендуется от 1 до 10. По умолчанию 6.
  • ignored_features игнорирует определенные функции в наборе данных. По умолчанию Нет.
  • one_hot_max_size Преобразует функцию в плавающую, если количество различных значений, содержащихся в функции, превышает указанное значение. По умолчанию Ложь
  • has_time последовательно выбирает входные данные при преобразовании категориальных признаков в числовые признаки и выборе древовидных структур. По умолчанию Ложь (случайно)
  • rsm Метод случайных подпространств. По умолчанию 1.
  • nan_mode Метод работы с пропущенными значениями во входных данных, включая Forbidden (запрещение существования пропущенных значений), Min (заполнение минимальным значением), Max (заполнение максимальным значением). Мин. по умолчанию
  • fold_permutation_block_size Объекты в наборе данных группируются по блокам перед перемешиванием. Этот параметр определяет размер блока. Чем меньше значение, тем медленнее обучение. Большие значения могут привести к более низкому качеству.
  • leaf_estimation_method Метод расчета листовых значений, Ньютон/Градиент. Градиент по умолчанию.
  • leaf_estimation_iterations Количество шагов градиента при вычислении конечных значений.
  • leaf_estimation_backtracking Тип возврата для использования во время градиентного спуска.
  • fold_len_multiplier складывает коэффициент длины. Установите параметр больше 1, чтобы получить наилучшие результаты, когда параметр мал. По умолчанию 2.
  • proc_on_full_history Вычислить приблизительное значение, False: использовать 1/fold_len_multiplier для расчета; True: использовать для расчета все предыдущие строки в сложенном виде. По умолчанию Ложь.
  • class_weights Веса классов. По умолчанию Нет.
  • scale_pos_weight Вес класса 1 в бинарной классификации. Это значение используется в качестве множителя для веса объекта в классе 1.
  • схема прокачки boosting_type
  • allow_const_label Используйте его для обучения модели на наборе данных с одинаковым значением метки для всех объектов. Значение по умолчанию — «ложь».

Параметры CatBoost по умолчанию:

  • «итерации»: 1000,
  • 'скорость обучения': 0,03,
  • 'l2_leaf_reg': 3,
  • 'температура_мешка': 1,
  • «подвыборка»: 0,66,
  • 'случайная_сила': 1,
  • «глубина»: 6,
  • 'рсм': 1,
  • 'one_hot_max_size': 2
  • 'leaf_estimation_method': 'Градиент',
  • 'fold_len_multiplier': 2,
  • 'граница_счетчик': 128,

Диапазон значений параметра CatBoost:

  • 'learning_rate': логарифмически равномерное распределение [e^{-7}, 1]
  • 'random_strength': дискретное равномерное распределение по набору {1, 20}.
  • ‘one_hot_max_size’: дискретное равномерное распределение по набору {0, 25}.
  • 'l2_leaf_reg': логарифмически равномерное распределение [1, 10]
  • 'bagging_temperature': равномерный [0, 1]
  • «gradient_iterations»: дискретное равномерное распределение по набору {1, 10}».

Другие ссылки:

Настройка параметров CatBoost

from catboost import CatBoostRegressor
from sklearn.model_selection import GridSearchCV
 
#指定category类型的列,可以是索引,也可以是列名
cat_features = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]
 
X = df_ios_droped.iloc[:,:-1]
y = df_ios_droped.iloc[:,-1]
 
cv_params = {'iterations': [500,600,700,800]}
other_params = {
    'iterations': 1000,
    'learning_rate':0.03,
    'l2_leaf_reg':3,
    'bagging_temperature':1,
    'random_strength':1,
    'depth':6,
    'rsm':1,
    'one_hot_max_size':2,
    'leaf_estimation_method':'Gradient',
    'fold_len_multiplier':2,
    'border_count':128,
}
model_cb = CatBoostRegressor(**other_params)
optimized_cb = GridSearchCV(estimator=model_cb, param_grid=cv_params, scoring='r2', cv=5, verbose=1, n_jobs=2)
optimized_cb.fit(X,y,cat_features =category_features)
print('参数的最佳取值:{0}'.format(optimized_cb.best_params_))
print('最佳模型得分:{0}'.format(optimized_cb.best_score_))
print(optimized_cb.cv_results_['mean_test_score'])
print(optimized_cb.cv_results_['params'])
 
# params = {'depth':[3,4,5,7,8,9,10],
#           'iterations':[100,250,500,1000],
#           'learning_rate':[0.001,0.01,0.003,0.1,0.2,0.3], 
#           'l2_leaf_reg':[1,3,5,10,100],
#           'border_count':[2,4,8,16,32,64,128,256]}

Другие ссылки:Effectiveml.com/using-grid-…

Ссылки по теме:

Вознаграждение автора WeChat Pay标点符 wechat qrcodeAlipay标点符 alipay qrcode