Рассмотрим, как останавливать прирост количества деревьев в ходе тренировки, если не улучшается целевая метрика. Сначала сгенерируем набор данных функцией make_classification из sklearn.datasets:
Теперь разобьем данные на выборки и создадим CatBoostClassifier с отслеживаемыми метриками ['F1', 'AUC'] и валидационной метрикой 'F1' (подробнее читай здесь):
По умолчанию выводится статистика измерения eval_metric на train выборке на каждой итерации обучения (по умолчанию до 1000). Однако в fit можно передать валидационную выборку и предусмотреть раннюю остановку с подбором количества деревьев с наиболее высокой метрикой. Для понимания процесса сначала опишем параметры, регулирующие обучение:
X - датасет признаков;
y - целевая колонка;
cat_features - список наименований категориальных признаков;
eval_set - валидационный датасет, используемый для ранней остановки (отбор количества деревьев) либо для отслеживания метрик качества;
use_best_model - если истина, в результате обучения с ранней остановкой будет возвращаться модель, полученная на итерации (количеством деревьев) с лучшей метрикой на валидационной выборке (по умолчанию True);
early_stopping_rounds - устанавливает количество итераций для останова, если на их протяжении метрика качества не улучшалась по сравнению с оптимальной.
Описание других параметров можете найти здесь.
Запрограммируем алгоритм проводить валидацию и остановиться, если метрика 'F1' не улучшается в течение 80 итераций:
В выводе теперь отображается метрика на обучающем, валидационном датасете, а также значение на лучшей итерации из предыдущих со ссылкой на номер (после best в скобках). В конце приводится лучший результат и возвращается модель с соответствующим количеством деревьев. Можно сверить метрики:
Чтобы вернуть наилучшие значения отслеживаемых метрик можно воспользоваться методом get_best_score:
Следует отметить, что AUC не совпадает с предыдущим результатом, так как get_best_score возвращает лучшие метрики из всех итераций, а наша модель ориентирована на лучшую метрику 'F1'.
Полезные ссылки: