Найти тему
Властелин машин

Тюнинг CatBoost - градиентного бустинга от Яндекс

Оглавление

Как настроить один из лучших инструментов градиентного бустинга - CatBoost. Рассмотрим на примере.

Для демонстрации работы будем использовать сгенерированный набор для предсказания расходов людей, который зависит от их доходов и размера дотаций из городского бюджета:

При этом формула этой взаимосвязи следующая (data_m - имя датафрейма):

data_m['расходы'] = 2*np.sqrt(data_m['зарплата'])+0.5*data_m['сумма_помощи']

Задача - использовать CatBoost для предсказания расходов. Посмотрим, сможет ли алгоритм справиться с поставленной задачей.

Перед использованием рассмотрим параметры модели (подробнее читай здесь):

iterations (синонимы num_boost_round, n_estimators, num_trees) - максимальное количество деревьев, используемых в модели (по умолчанию 1000). Значение может быть ниже заданного, если используются другие параметры, накладывающие ограничение на количество деревьев;

learning_rate - скорость обучения;

random_seed - инициализирующее значение для используемого генератора случайных чисел, чтобы обеспечить повторямость эксперимента;

l2_leaf_reg (reg_lambda) - коэффициент регуляризации функции потерь;

depth (max_depth) - глубина дерева (максимальное значение - 16);

min_data_in_leaf (min_child_samples) - минимальное количество узлов в листе;

max_leaves (num_leaves) - максимальное количество листьев в дереве;

subsample - часть исходной выборки, отбираемая для обучения каждого дерева;

class_weights - веса классов в моделях классификации. Используется для устранения несбалансированности (например, вес positive=количество_negative/количество_positive);

auto_class_weights - устраняет дисбаланс автоматически (значения - 'Balanced', 'SqrtBalanced');

scale_pos_weight - задает вес для положительного класса;

Среди параметров scale_pos_weight, auto_class_weights, class_weights одновременно используется только один.

early_stopping_rounds - устанавливает количество итераций для останова - если на их протяжении метрика качества не улучшалась по сравнению с оптимальной;

classes_count - количество классов для многоклассовой классификации;

task_type - используемое для вычислений устройство ('CPU,'GPU');

thread_count - число используемых для обучения потоков (по умолчанию = -1, что означает - все ядра процессора);

verbose - объем выводимой информации (False - подавляем сообщения).

Теперь разделим данные на обучающую и тестовую выборки, обучим регрессор с параметрами по умолчанию, применим для предсказания тестовой выборки и подсчитаем метрики качества:

X_tr, X_ts, y_tr, y_ts = train_test_split(data_m[['зарплата', 'сумма_помощи']], data_m['расходы'], test_size=0.2)

reg = CatBoostRegressor(verbose = False)

reg.fit(X_tr, y_tr)

y_pr = reg.predict(X_ts)

metrics = {}

metrics['mape'] = mean_absolute_percentage_error(y_ts, y_pr)

metrics['mae'] = mean_absolute_error(y_ts, y_pr)

-2

Сравните тестовые данные и предсказанные моделью:

-3

Сохранение и загрузка модели

Модель можно сохранять в файл и загружать из файла:

Сохранение

reg.save_model('model')

Загрузка

reg = CatBoostRegressor()
reg.load_model("model")

Код для генерации использованного в статье набора данных можно скопировать отсюда.

-4