Вывод целевых метрик и ранняя остановка с 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 можно передать валидационную выборку и предусмотреть раннюю остановку с подбором количества деревьев с наиболее высокой метрикой. Для понимания процесса сначала опишем параметры, регулирующие обучение:
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'.
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: