Как настроить один из лучших инструментов градиентного бустинга - 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)
Сравните тестовые данные и предсказанные моделью:
Сохранение и загрузка модели
Модель можно сохранять в файл и загружать из файла:
Сохранение
reg.save_model('model')
Загрузка
reg = CatBoostRegressor()
reg.load_model("model")
Код для генерации использованного в статье набора данных можно скопировать отсюда.