1. Введение в CatBoost и подготовка датасета футбольной статистики
Введение в CatBoost и подготовка датасета футбольной статистики
Добро пожаловать в курс по прогнозированию футбольных матчей с использованием библиотеки CatBoost. Это первая статья, в которой мы заложим фундамент для построения нашей модели машинного обучения. Мы разберем, почему именно CatBoost стал стандартом в работе с табличными данными, как устроен градиентный бустинг и, самое главное, как правильно подготовить футбольные данные, чтобы модель могла находить в них скрытые закономерности.
Почему CatBoost?
CatBoost (сокращение от Categorical Boosting) — это библиотека градиентного бустинга на решающих деревьях, разработанная компанией Яндекс. Она стала невероятно популярной в соревнованиях по анализу данных (Kaggle) и в индустрии благодаря двум ключевым особенностям:
В контексте футбола это критически важно. Названия команд, лиги, имена судей — это всё категориальные данные. Использование CatBoost позволяет нам скармливать модели эти данные практически в сыром виде, сохраняя важную информацию о силе команд.
!Схема работы градиентного бустинга: последовательное исправление ошибок.
Основы градиентного бустинга
Прежде чем писать код, важно понять, как модель «думает». Градиентный бустинг — это ансамблевый метод. Представьте, что у вас есть совет из тысячи слабых экспертов. Первый эксперт делает грубый прогноз. Второй смотрит на ошибки первого и пытается их исправить. Третий исправляет ошибки, оставшиеся после второго, и так далее.
Математически это можно записать следующим образом:
Где: * — это предсказание ансамбля на шаге (текущая модель). * — это предсказание ансамбля на предыдущем шаге (предыдущая модель). * — это скорость обучения (learning rate), коэффициент, определяющий, насколько сильно мы доверяем новому эксперту. * — это новый «слабый» алгоритм (обычно решающее дерево), который обучается предсказывать ошибку (антиградиент) предыдущей модели.
Суть CatBoost заключается в том, чтобы строить эти деревья максимально эффективно, избегая переобучения, особенно когда мы имеем дело с названиями команд, которые встречаются в датасете разное количество раз.
Специфика футбольных данных
Футбол — это сложная стохастическая (случайная) среда. В отличие от физики, здесь нет жестких законов. Однако есть тренды. Для обучения модели нам понадобятся исторические данные.
Какие данные нам нужны?
Для построения качественной модели нам необходим датасет, где каждая строка — это один сыгранный матч. Минимальный набор колонок:
* Date (Дата): Чтобы соблюдать хронологию (мы не можем предсказывать прошлое, зная будущее). * HomeTeam (Хозяева): Название принимающей команды. * AwayTeam (Гости): Название гостевой команды. * FTHG (Full Time Home Goals): Голы хозяев. * FTAG (Full Time Away Goals): Голы гостей. * FTR (Full Time Result): Результат матча (H — победа хозяев, D — ничья, A — победа гостей). Это будет нашей целевой переменной (таргетом).
Однако на «сырых» данных модель многому не научится. Нам нужно создать фичи (признаки), которые описывают текущую форму команд.
> Данные — это новая нефть, но в сыром виде она бесполезна. Её нужно переработать в топливо для модели.
Подготовка окружения и данных в Python
Перейдем к практике. Для начала установим необходимые библиотеки. Нам понадобятся catboost для моделирования и pandas для работы с данными.
Теперь создадим структуру нашего датасета. В реальном проекте вы будете загружать данные из CSV-файлов (например, с ресурса football-data.co.uk), но для понимания структуры мы создадим небольшой пример вручную.
Feature Engineering: Создание признаков
Самая важная часть работы дата-сайентиста в футболе — это создание признаков, отражающих силу команд до начала матча. Мы не можем использовать HomeGoals и AwayGoals для предсказания, так как эти данные становятся известны только после матча. Но мы можем использовать среднее количество голов в прошлых матчах.
Давайте создадим простую фичу: Среднее количество голов забитых командой в последних 3 матчах.
Для этого нам нужно:
Это сложный процесс, поэтому для старта мы упростим задачу и добавим статические рейтинги (в реальном проекте они должны быть динамическими).
Предположим, мы посчитали некий «Рейтинг Атаки» (AttackStrength) на основе прошлых игр:
!Процесс превращения сырых данных матчей в признаки для обучения.
Подготовка таргета (Целевой переменной)
CatBoostClassifier ожидает, что классы будут числами или строками. Для удобства переведем результаты в числовой формат: * 0: Победа хозяев (Home) * 1: Ничья (Draw) * 2: Победа гостей (Away)
Работа с категориальными фичами в CatBoost
Вот здесь начинается магия CatBoost. Нам нужно явно указать модели, какие колонки являются категориальными. В нашем случае это названия команд.
Обычно в машинном обучении нам пришлось бы делать pd.get_dummies() для команд, раздувая датасет до сотен колонок. В CatBoost мы просто передаем список имен колонок cat_features.
Разделение на Train и Test
В футболе нельзя использовать обычный train_test_split со случайным перемешиванием (shuffle=True). Почему? Потому что мы заглянем в будущее. Если мы обучаемся на матче из декабря, чтобы предсказать матч из августа, модель выучит, что команда стала чемпионом, и будет использовать это знание нечестно.
Поэтому разделение всегда идет по времени:
Класс Pool
CatBoost имеет свой собственный формат данных, оптимизированный по памяти и скорости — Pool. Рекомендуется оборачивать данные в него перед обучением.
Использование Pool позволяет CatBoost заранее обработать категориальные признаки и квантовать числовые данные, что значительно ускоряет процесс обучения.
Заключение
Мы подготовили фундамент для нашей модели. Мы узнали:
В следующей статье мы перейдем непосредственно к инициализации модели, разбору гиперпараметров (learning rate, depth, iterations) и запустим процесс обучения, чтобы получить наши первые прогнозы.
Готовьте свои датасеты, игра начинается!