машинное обучение
May 5, 2022

Вывод целевых метрик и ранняя остановка с CatBoost

Рассмотрим, как останавливать прирост количества деревьев в ходе тренировки, если не улучшается целевая метрика. Сначала сгенерируем набор данных функцией make_classification из sklearn.datasets:

import pandas as pd
from sklearn.datasets import make_classification
import numpy as np
np.random.seed(0)

ar, y = make_classification(n_samples=1000, n_features=3, n_informative=2, 
                           n_redundant=0, class_sep = 0.5, shuffle=False, 
                           flip_y=0, n_clusters_per_class=2)

df = pd.DataFrame(ar, columns = ['feat1', 'feat2', 'feat3'])
df['feat4'] = pd.cut(df['feat2'], 5, labels=False)
df['y'] = y
# мешаем
df = df.sample(frac=1).reset_index(drop=True)
df

Теперь разобьем данные на выборки и создадим CatBoostClassifier с отслеживаемыми метриками ['F1', 'AUC'] и валидационной метрикой 'F1' (подробнее читай здесь):

from sklearn.model_selection import train_test_split, KFold
sp = KFold()

X_cv, X_ts, y_cv, y_ts = train_test_split(df.drop(columns='y').copy(), 
                                          df['y'], test_size=0.2)
X_tr, X_val, y_tr, y_val = train_test_split(X_cv.copy(), y_cv, test_size=0.25)
y_tr.shape[0], y_ts.shape[0], y_val.shape[0]
clf = CatBoostClassifier(custom_metric=['F1', 'AUC'], eval_metric='F1')
clf.fit(X_tr, y_tr, cat_features=['feat4'])

По умолчанию выводится статистика измерения eval_metric на train выборке на каждой итерации обучения (по умолчанию до 1000). Однако в fit можно передать валидационную выборку и предусмотреть раннюю остановку с подбором количества деревьев с наиболее высокой метрикой. Для понимания процесса сначала опишем параметры, регулирующие обучение:

X - датасет признаков;

y - целевая колонка;

cat_features - список наименований категориальных признаков;

eval_set - валидационный датасет, используемый для ранней остановки (отбор количества деревьев) либо для отслеживания метрик качества;

use_best_model - если истина, в результате обучения с ранней остановкой будет возвращаться модель, полученная на итерации (количеством деревьев) с лучшей метрикой на валидационной выборке (по умолчанию True);

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

Описание других параметров можете найти здесь.

Запрограммируем алгоритм проводить валидацию и остановиться, если метрика 'F1' не улучшается в течение 80 итераций:

clf = CatBoostClassifier(custom_metric=['F1', 'AUC'], eval_metric='F1')
clf.fit(X_tr, y_tr, eval_set = (X_val, y_val), cat_features=['feat4'], early_stopping_rounds=80)

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

from sklearn.metrics import f1_score, roc_auc_score

(f1_score(y_val, clf.predict(X_val)),
roc_auc_score(y_val, clf.predict_proba(X_val)[:,1]))

Чтобы вернуть наилучшие значения отслеживаемых метрик можно воспользоваться методом get_best_score:

clf.get_best_score()

Следует отметить, что AUC не совпадает с предыдущим результатом, так как get_best_score возвращает лучшие метрики из всех итераций, а наша модель ориентирована на лучшую метрику 'F1'.

Полезные ссылки:

  1. Параметры конструктора CatBoost

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Яндекс Дзен

Telegram