Мастерство CatBoost: от подготовки данных до оптимизации модели

Практический курс по библиотеке CatBoost на Python, охватывающий все этапы: от правильной подачи данных и обработки категориальных признаков до тонкой настройки гиперпараметров и интерпретации результатов.

1. Основы CatBoost и подготовка данных: работа с классом Pool и нативными категориальными признаками

Основы CatBoost и подготовка данных: работа с классом Pool и нативными категориальными признаками

Добро пожаловать в курс «Мастерство CatBoost». Мы начинаем погружение в одну из самых мощных библиотек градиентного бустинга, разработанную компанией Яндекс. Если вы хотите научиться предсказывать сложные события — будь то исход футбольного матча, кредитный скоринг или погода — CatBoost станет вашим главным инструментом.

В этой статье мы разберем фундамент: что такое CatBoost, как правильно готовить данные (фичи) для спортивной аналитики и как использовать класс Pool для максимальной эффективности.

Что такое CatBoost и почему он особенный?

CatBoost (сокращение от Categorical Boosting) — это библиотека градиентного бустинга на деревьях решений. Его главная «суперсила» — умение работать с категориальными данными (названия команд, имена судей, стадионы) «из коробки», без долгой и мучительной предобработки.

Кратко о магии градиентного бустинга

Представьте, что вы пытаетесь предсказать исход матча «Спартак» — «Зенит». Вы можете спросить одного эксперта, но он может ошибиться. А что, если собрать совет из тысячи экспертов, где каждый следующий учитывает ошибки предыдущих?

Градиентный бустинг строит ансамбль (группу) слабых моделей — обычно это неглубокие деревья решений. Каждое следующее дерево исправляет ошибки, допущенные предыдущими.

Математически процесс обновления предсказания на шаге можно записать так:

Где:

  • — итоговое предсказание модели на текущем шаге .
  • — предсказание модели, полученное на предыдущем шаге.
  • (эта) — скорость обучения (learning rate), коэффициент, определяющий вклад нового дерева (обычно от 0.01 до 0.3).
  • — новое дерево решений, которое обучается предсказывать ошибку предыдущей композиции.
  • Простыми словами: мы не пытаемся сразу построить идеальную модель. Мы строим простую, смотрим, где она ошиблась (например, переоценила шансы хозяев), и строим следующую модель специально для исправления этой ошибки.

    !Визуализация принципа бустинга: сложение множества простых моделей для создания одной мощной.

    Подготовка данных: какие фичи нужны для футбола?

    Прежде чем скармливать данные модели, их нужно правильно собрать. В машинном обучении данные делятся на признаки (фичи) и целевую переменную (таргет).

    Для футбольного матча хорошим набором данных будут:

  • Категориальные признаки (Categorical features): Это строки или дискретные метки.
  • - Название домашней команды (HomeTeam). - Название гостевой команды (AwayTeam). - Название лиги (League). - Имя главного судьи (Referee).

  • Числовые признаки (Numerical features): Количественные показатели.
  • - Среднее количество голов за последние 5 матчей. - Владение мячом (в %). - Рейтинг ELO команд. - Температура воздуха во время матча.

  • Временные признаки:
  • - День недели (игра в выходные может отличаться от игры в среду). - Время начала матча.

    Класс Pool: фундамент данных в CatBoost

    Многие новички передают в CatBoost обычные pandas.DataFrame. Это работает, но для профессиональной разработки лучше использовать специальный класс — Pool.

    Зачем нужен Pool?

    Pool — это оптимизированная структура данных CatBoost. При её создании:

  • Квантование: Числовые признаки (например, владение мячом) разбиваются на интервалы (бины), что ускоряет обучение в разы.
  • Память: Данные упаковываются компактно.
  • Фиксация типов: Вы явно указываете модели, где находятся категории, чтобы она не перепутала их с числами.
  • Практика: Создаем Pool для футбольного матча

    Допустим, мы хотим предсказать победу домашней команды (1 — победа, 0 — нет).

    Работа с категориальными признаками

    Это главная причина выбрать CatBoost для нашей задачи. В футболе много категорий: сотни команд, десятки судей. В других библиотеках вам пришлось бы делать One-Hot Encoding (создавать колонки is_Spartak, is_Zenit...), что раздуло бы таблицу до огромных размеров.

    CatBoost использует Ordered Target Statistics. Он превращает категорию (например, «Spartak») в число, основываясь на том, как часто эта команда побеждала в прошлом.

    Суть метода (упрощенно) описывается формулой сглаживания:

    Где:

  • — новое числовое значение, которое заменит категорию (например, слово "Spartak") для -го объекта.
  • — сумма целевых меток (побед) для объектов с той же категорией (той же командой), идущих до текущего объекта в датасете.
  • — параметр сглаживания (помогает, если данных мало).
  • — априорная вероятность (средний процент побед по всему чемпионату).
  • — сколько раз мы встречали эту команду до текущего момента.
  • Что это значит для вас? Вам не нужно думать, как превратить «Зенит» в цифры. Вы просто отдаете строку «Зенит» в cat_features, и CatBoost сам вычисляет её «силу» на основе статистики побед.

    Важные правила:

  • Тип данных: Убедитесь, что в pandas колонки с командами имеют тип string или object.
  • Не кодируйте сами: Не заменяйте названия команд на числа (1, 2, 3) вручную перед подачей в CatBoost. Модель решит, что команда 2 «больше» команды 1, что неверно. Оставьте их строками.
  • Обучение модели

    Для предсказания победы (да/нет) мы используем CatBoostClassifier.

    Тонкости параметров:

    * iterations: В футболе много шума (случайных факторов). Не ставьте слишком мало итераций, дайте модели найти закономерности. Обычно начинают с 1000. * learning_rate: Если поставить слишком большой (например, 0.5), модель будет «скакать» и не найдет оптимум. Если слишком маленький (0.001) — будет учиться вечно. 0.03–0.1 — хороший старт. * depth: Глубина 6–8 оптимальна. Если поставить 10+, модель может начать запоминать конкретные матчи (переобучение), а не общие правила игры.

    Обработка пропусков (Missing Values)

    В футбольной статистике часто бывают дыры. Например, для матча второй лиги нет данных о владении мячом.

    CatBoost имеет встроенный параметр nan_mode: * 'Min': Считать пропуск минимальным значением (как будто владение было очень низким). * 'Max': Считать максимальным. * 'Forbidden': Выдать ошибку (если вы уверены, что пропусков быть не должно).

    По умолчанию CatBoost сам решает, в какую ветку дерева (левую или правую) отправить объект с пропуском, чтобы минимизировать ошибку предсказания.

    Резюме

    Сегодня мы научились основам работы с CatBoost на примере футбольных матчей:

  • Pool — это лучший способ передать данные в модель. Он экономит память и ускоряет процесс.
  • Фичи — для футбола важны как статистика (голы), так и контекст (судья, погода).
  • Категории — названия команд и судей не нужно кодировать вручную. CatBoost сделает это лучше с помощью Target Encoding.
  • ОбучениеCatBoostClassifier отлично подходит для задач «победит / не победит».
  • В следующей статье мы разберем, как оценивать качество нашей футбольной модели и что делать, если она предсказывает победу любимой команды слишком оптимистично (переобучение).

    2. Стратегии обучения: выбор лосс-функций, метрик и использование детектора переобучения

    Стратегии обучения: выбор лосс-функций, метрик и использование детектора переобучения

    В предыдущей статье мы научились загружать данные о футбольных матчах в Pool. Но просто запустить метод fit — это как выпустить футболистов на поле без тактики. Как понять, что модель действительно учится предсказывать исход матча, а не просто запоминает результаты прошлого сезона? Какую функцию ошибки выбрать, если мы прогнозируем количество голов (регрессия), и какую — если угадываем победителя (классификация)?

    В этой статье мы разберем стратегию грамотного обучения в CatBoost на примере футбольной аналитики.

    Лосс-функция vs Метрика: в чем разница?

    Новички часто путают эти понятия. Давайте разберем их на примере футбольного тренера.

  • Лосс-функция (Loss Function, Функция потерь): Это «крик тренера» во время тренировки. Это математическая формула, которую модель оптимизирует (старается минимизировать). Она должна быть гладкой и иметь производную, чтобы алгоритм градиентного спуска понимал, в какую сторону менять веса, чтобы уменьшить ошибку.
  • Метрика (Metric): Это «счет на табло» или прибыль в букмекерской конторе. Это то, как мы оцениваем качество модели с точки зрения бизнеса. Метрика не обязана быть дифференцируемой.
  • Пример: Вы хотите максимизировать количество угаданных исходов матчей (Accuracy). Но Accuracy — это грубая функция (угадал/не угадал), у нее нет градиента. Поэтому для обучения (Loss) мы используем LogLoss (насколько уверенно модель предсказывает вероятность победы), а для оценки (Metric) смотрим на Accuracy.

    В CatBoost это задается параметрами: * loss_function — «компас» для обучения. * eval_metric — «табло» для валидации.

    Выбор функции потерь для регрессии (Предсказание голов)

    Предположим, мы хотим предсказать точное количество голов в матче или показатель xG (ожидаемые голы). Это задача регрессии.

    RMSE (Root Mean Square Error)

    Стандартный выбор. Хорошо подходит, если мы хотим сильно штрафовать модель за грубые промахи.

    Где: * — количество матчей в выборке. * — реальное количество голов в -м матче. * — предсказанное моделью количество голов. * — знак суммирования по всем матчам.

    Футбольный контекст: Если в матче было забито 5 голов, а модель предсказала 1, разница в квадрате даст огромный штраф. Модель будет стараться избегать таких позорных промахов.

    MAE (Mean Absolute Error)

    Средняя абсолютная ошибка. Используется, когда нам важна средняя точность, и мы не хотим паниковать из-за редких аномальных матчей (например, 7:1).

    Где: * — модуль числа (абсолютное значение разницы). * Остальные обозначения те же, что и выше.

    Poisson (Для счетных данных)

    Тонкость CatBoost: Для предсказания количества событий (голов, угловых, карточек) часто лучше подходит лосс Poisson. Он специально создан для распределения Пуассона, которому часто подчиняются голы в футболе.

    Выбор функции потерь для классификации (Исход матча)

    Бинарная классификация (Logloss)

    Используем, если предсказываем событие «Победа Хозяев» (Да/Нет).

    Где: * — истинный исход (1 — победа, 0 — не победа). * — предсказанная вероятность победы. * — натуральный логарифм.

    Эта функция заставляет модель не просто говорить «победит», а выдавать корректную вероятность (например, 0.75).

    Мультиклассификация (MultiClass)

    В футболе три исхода: Победа хозяев (1), Ничья (0), Победа гостей (2). Здесь используется MultiClass. CatBoost автоматически применяет Softmax, чтобы сумма вероятностей всех трех исходов равнялась 100%.

    Валидация и переобучение

    Самая большая опасность — переобучение (overfitting). Это когда модель выучила наизусть результаты матчей 2023 года, но на матчах 2024 года проигрывает деньги, потому что нашла случайные закономерности (например, «если судья в желтом, хозяева выигрывают»).

    Чтобы избежать этого, мы делим данные:

  • Train: Матчи прошлых лет (на них учимся).
  • Validation: Более свежие матчи (на них проверяем).
  • !График демонстрирует классическую картину переобучения: пока ошибка на тренировке продолжает падать, ошибка на валидации начинает расти после определенного момента.

    Важный нюанс: Временное разбиение

    Для футбола нельзя использовать обычный случайный train_test_split. Нельзя учиться на матче, который прошел позже, чем тот, который мы предсказываем. Это «заглядывание в будущее» (Data Leakage).

    Правильный подход: * Train: Матчи с 2018 по 2022 год. * Validation: Матчи 2023 года.

    Пример кода

    Детектор переобучения (Early Stopping)

    Мы поставили 2000 итераций. Но, возможно, модель поймет суть игры уже к 600-й итерации, а дальше начнет запоминать шум. Продолжать обучение вредно.

    В CatBoost встроен механизм Early Stopping. Он следит за метрикой на val_pool. Если качество на отложенной выборке перестает расти, обучение останавливается.

    Параметр early_stopping_rounds

    Это «терпение» модели. Сколько итераций мы ждем улучшения, прежде чем нажать стоп.

    Тонкости использования:

  • Возврат лучшей модели: CatBoost по умолчанию (use_best_model=True) вернет то состояние модели, которое дало лучший результат на валидации, даже если после этого обучение прошло еще 50 итераций.
  • Тип детектора: По умолчанию детектор срабатывает, когда ошибка перестает падать. Это оптимально для большинства задач.
  • Пользовательские метрики

    В ставках на спорт Accuracy не всегда важна. Важнее Profit (прибыль). Вы можете написать свою функцию на Python, которая считает, сколько денег принесла бы модель, и передать её в CatBoost. Однако, помните: Python-функции работают медленнее встроенных C++ метрик.

    Стратегия обучения: пошаговый алгоритм

    Подводя итог, вот рецепт создания надежной модели для футбола:

  • Хронологическое разделение: Отделите последние матчи (например, последний сезон) в eval_set. Никогда не перемешивайте матчи случайно!
  • Выберите Loss:
  • * Угадываете счет (0, 1, 2...)? -> RMSE или Poisson. * Угадываете исход (П1, Х, П2)? -> MultiClass. * Угадываете «Обе забьют» (Да/Нет)? -> Logloss.
  • Задайте Metric: Выберите понятную метрику (Accuracy или AUC) для eval_metric.
  • Установите запас итераций: Поставьте iterations с запасом (2000+).
  • Включите Early Stopping: Добавьте early_stopping_rounds=50.
  • Запустите обучение: CatBoost сам найдет момент, когда модель максимально поняла закономерности футбола, но еще не начала «зубрить» результаты.
  • В следующей статье мы углубимся в тюнинг гиперпараметров: узнаем, как глубина дерева (depth) и скорость обучения (learning_rate) влияют на способность модели предсказывать сенсации в матчах.