XGBoost в киберспорте: как BritBets предсказывает драфты Dota 2 с помощью машинного обучения
Технический разбор ML-пайплайна BritBets: 624 фичи XGBoost, 91 экспертный признак DraftNet, изотоническая калибровка, температурное масштабирование, SHAP-анализ, стек демпфирования и детекция рыночного разрыва.
Почему предсказание драфта — хорошо поставленная задача ML
Драфт Captain Mode в Dota 2 создаёт вход фиксированного размера и структуры (10 пиков героев + до 14 банов для двух команд) с бинарным исходом (победа Radiant или Dire). Нет промежуточных оценок. Пространство входов дискретное и комбинаторно огромное — примерно сочетания из 120 по 10 с ограничениями порядка — но исход сильно зависит от композиционных взаимодействий, а не только от индивидуальной силы героев. Это делает задачу идеальной для градиентного бустинга (который отлично работает с табличными взаимодействиями признаков) и нейросетей с механизмом внимания (которые учатся попарным связям из данных).
BritBets запускает в продакшене две модели: классификатор XGBoost и кастомную нейросеть на PyTorch под названием DraftNet v4. Обе модели потребляют один и тот же контекст матча, но работают с разными представлениями признаков. XGBoost трактует драфт как плоский вектор фич; DraftNet — как структурированную последовательность с эмбеддингами для каждого героя. В этой статье — полный пайплайн от сырых данных до калиброванных предсказаний, включая стек демпфирования, предотвращающий излишне уверенные выходы.
Feature engineering XGBoost: 624 измерения
Модель XGBoost работает с 624-мерным вектором признаков на матч. Признаки разбиваются на несколько групп. Первая группа — one-hot кодировки героев: каждый герой получает бинарный индикатор для пика Radiant и пика Dire, что даёт 2 x ~124 признака. Они кодируют сырую композицию драфта без какого-либо доменного знания.
Вторая группа — статистика на уровне героев: скользящие винрейты, пикрейты и банрейты для каждого выбранного героя, рассчитанные за последние 30 дней от точки отсечения обучающих данных. Эти фичи позволяют модели учитывать мета-зависимую силу героев — герой, сильный в патче 7.41, мог быть слабым в 7.38.
Третья группа — контекст на уровне команд: история личных встреч (последние 20 матчей), Elo-рейтинг команды по последним результатам и индикаторы уровня лиги (tier-1, tier-2, tier-3 или unknown). Уровень лиги критически важен, потому что матчи tier-3 имеют значительно более шумные исходы, и модели нужно знать, когда быть менее уверенной.
Четвёртая и самая нюансированная группа — 56 обогащающих признаков из анализа реплеев. Сюда входят средние дифференциалы золота и опыта на 10-й и 20-й минутах, тайминг первой крови, распределение урона по вышкам, частота участия в тимфайтах, плотность установки вардов, тайминг попыток Рошана и частота использования байбэков. Когда данные реплеев недоступны (около 73% случаев в продакшене), эти признаки заполняются средними значениями по лиге вместо нулей — решение, которое уменьшило деградацию точности примерно на 2 процентных пункта по сравнению с заполнением нулями.
Архитектура DraftNet v4: внимание поверх героев
DraftNet v4 — это модель на PyTorch с 304K параметрами, обученная примерно на 28 000 профессиональных матчах. Архитектура состоит из трёх стадий: кодирование каждого героя, внимание на уровне команды и глобальная классификация.
На стадии кодирования каждый герой представлен 48-мерным обучаемым эмбеддингом, конкатенированным с 27-мерным контекстным вектором. Контекстный вектор включает индикаторы типа способностей (стан, сайленс, рут, слоу, пробитие BKB), назначение позиции (1-5), винрейт героя в текущем патче, наклон мета-тренда (растёт или падает пикрейт) и несколько бинарных флагов для специальных свойств вроде глобального присутствия или синергии с Aegis.
Стадия на уровне команды применяет два слоя self-attention внутри пяти героев каждой команды, за которыми следует слой cross-attention между командами. Self-attention позволяет модели обнаруживать синергии (например, Magnus и Ember Spirit усиливают комбо друг друга), а cross-attention фиксирует динамику контрпиков (например, способность Spirit Breaker наказывать хрупких сплитпушеров). Матрица попарных взаимодействий всех 10 героев сплющивается и конкатенируется с выходами внимания.
Стадия глобальной классификации объединяет представления команд с 91 экспертным признаком, 59 мета-контекстными фичами, 20 оценками синергий, 19 индикаторами плейстайла, информацией о банах, уровнем лиги и версией патча. Объединённый вектор проходит через два полносвязных слоя с ReLU, dropout и batch normalization, выдавая вероятность победы через sigmoid. Дополнительная голова предсказывает ожидаемую длительность игры (multi-task learning), что служит регуляризатором и улучшает калибровку предсказания победы примерно на 0.5 процентных пункта.
91 экспертный признак: кодирование знаний о Dota
Экспертные признаки вычисляются модулем dota_expert.py, который кодирует доменные знания, которые было бы сложно выучить только из исходов матчей. Каждый признак — скаляр от 0 до 1, представляющий свойство драфта на уровне команды. Ключевые группы:
Идентификация стратегии (сила тимфайта, потенциал пуша, способность к пикоффам, давление сплитпушем, скейлинг в лейт). Детекция пауэр-комбо (перечисление известных синергий: Void + Skywrath, Dark Seer + Sven, IO + Gyrocopter). Эксплуатация уязвимостей (проверка, структурно ли слабы герои одной команды против другой — например, зависимость от иммунитета к магии против драфта с несколькими дизейблами, пробивающими BKB). Оценки доминирования по лайнам, длина и надёжность цепочек контроля, баланс типов урона (физический / магический / чистый, бёрст / сустейн), мобильность и гэп-клоузинг, глобальное присутствие героев, прочность защиты хайграунда, AoE-покрытие, вероятность доступа к бэклайну, гибкость героев, наличие диспелов, ценность стакинга аур, эффективность на Торменторе, секьюр килов, потенциал восстановления, война маны, способность к ресету тимфайта, прочность фронтлайна, инструменты контроля вижена и сила в Рошан-файтах.
Эти признаки детерминистичны — при одном и том же драфте выход всегда одинаковый. Они не требуют данных реплеев, что делает их доступными для каждого прогноза независимо от наличия данных. Анализ важности признаков через SHAP показывает, что экспертные признаки суммарно объясняют примерно 30% дисперсии предсказаний DraftNet, делая их самой важной группой после эмбеддингов героев.
Пайплайн обучения и валидация
XGBoost обучается с использованием XGBClassifier из scikit-learn: 500 эстиматоров, max depth 6, learning rate 0.05, column subsampling 0.8. Модель обучается на матчах за последние 18 месяцев с разбиением по времени (последние 2 месяца выделены для тестирования). Точность на тестовой выборке — примерно 77%.
DraftNet обучается оптимизатором Adam (lr=3e-4), batch size 256, 100 эпох с ранней остановкой по валидационному лоссу (patience 10). Обучение запускается на Railway CPU и занимает примерно 3-4 часа. Модель автоматически сохраняет чекпоинты, и лучшая модель пушится на GitHub. Точность на валидации — 68.8%. Более низкая точность по сравнению с XGBoost ожидаема — DraftNet работает на меньшем наборе признаков (без обогащения из реплеев), но лучше обобщается на новые комбинации героев, не встречавшиеся в обучении.
Обе модели переобучаются периодически по мере накопления новых данных и после крупных патчей. Константа N_ENRICHMENT должна совпадать между кодом извлечения признаков и чекпоинтом обученной модели — рассогласование приводит к тихим ошибкам предсказаний, что является одним из наиболее опасных режимов отказа системы.
Стек калибровки: изотоническая + температурное масштабирование
Сырые выходы моделей плохо откалиброваны — распространённая проблема и для XGBoost, и для нейросетей, обученных на бинарной классификации. BritBets применяет двухстадийный пайплайн калибровки.
Стадия 1 — изотоническая калибровка, обученная на отложенном калибровочном наборе. Изотоническая регрессия учит монотонное кусочно-линейное отображение из сырых вероятностей в наблюдаемые частоты побед. Это корректирует систематические смещения — например, тенденцию XGBoost кластеризовать предсказания около 0.55 и 0.45 вместо распределения по всему диапазону вероятностей.
Стадия 2 — температурное масштабирование с T=1.8. Откалиброванный логит делится на температуру перед применением sigmoid, что сжимает экстремальные предсказания к 0.5. Сырое предсказание 0.80 становится примерно 0.65 после температурного масштабирования. Это намеренно агрессивно — система отдаёт приоритет надёжности перед резкостью, потому что излишне уверенные прогнозы ведут к плохим решениям по ставкам. Температура выбрана оптимизацией expected calibration error (ECE) на валидационной выборке, а не тюнингом log-loss или accuracy.
Стек демпфирования: шесть модификаторов
После калибровки предсказания проходят через стек из шести демпфирующих модификаторов. Каждый модификатор логируется для каждого прогноза для аудита. Модификаторы:
1. Калибровочная коррекция (изотоническая + температурная, описана выше). 2. Коррекция по личным встречам: если команды сыграли 5+ недавних матчей, прогноз сдвигается к историческому винрейту, взвешенному по давности. 3. Штраф за дисперсию: для матчапов с высокой дисперсией прогнозов по бутстрап-сэмплам прогноз сжимается к 50%. 4. Штраф за стендина: если команда выступает с запасным игроком, преимущество прогноза уменьшается на настраиваемую величину. 5. Демпфирование рыночного разрыва: когда прогноз ИИ расходится с коэффициентами букмекеров более чем на 10%, преимущество сжимается. Для разрывов 10-20% — сжатие 50%; для разрывов свыше 20% — сжатие 80%. Это отражает эмпирический вывод, что экстремальное расхождение ИИ с рынком чаще объясняется пропуском информации, а не нахождением альфы. 6. Демпфирование по уровню лиги: неизвестные и tier-3 лиги получают плоское 20% сжатие.
Стек демпфирования снизил долю ложноположительных value-ставок примерно на 40% в бэктестинге, ценой меньшего количества найденных истинных value-ставок. Этот компромисс приемлем, потому что одна плохая рекомендация по ставке подрывает доверие пользователя значительно сильнее, чем упущенная возможность.
SHAP-анализ: атрибуция по признакам
Каждый прогноз сопровождается SHAP-разбивкой, вычисленной с помощью TreeExplainer для XGBoost. SHAP-значения раскладывают предсказание на аддитивные вклады от каждого признака, соблюдая свойство, что сумма всех SHAP-значений плюс базовая ставка равна предсказанной вероятности.
В продакшене SHAP используется для двух целей. Во-первых, генерация человекочитаемого объяснения на <a href='/predictions'>странице предсказаний</a> — например, определение топ-3 признаков, толкающих в сторону каждой команды, и перевод их на естественный язык. Во-вторых, диагностический инструмент для отладки модели: когда прогноз кажется неверным, SHAP-значения показывают, опирается ли модель на устаревший признак (например, старую статистику личных встреч) или корректно определяет дисбаланс драфта.
Для DraftNet атрибуция признаков вычисляется с помощью integrated gradients, а не SHAP, поскольку TreeExplainer неприменим к нейросетям. Integrated gradients вычисляются относительно 91 экспертного признака, предоставляя комплементарный взгляд на то, что нейросеть считает важным. На практике две модели часто соглашаются в направлении вкладов отдельных признаков, но расходятся в величине — XGBoost сильнее взвешивает историческую результативность команд, а DraftNet делает акцент на композиционных синергиях.
Детекция value-ставок и защитные барьеры
Модуль детекции value-ставок сравнивает откалиброванный, демпфированный прогноз с подразумеваемыми вероятностями, выведенными из коэффициентов букмекеров. Value-ставка помечается, когда преимущество ИИ (предсказанная вероятность минус подразумеваемая) превышает порог, при соблюдении нескольких защитных барьеров.
Барьер 1: уровень лиги — tier-1 или tier-2. Tier-3 и unknown лиги исключаются полностью. Барьер 2: максимальные коэффициенты 2.50. Исторический анализ показал 0 верных прогнозов из 8 при коэффициентах >= 2.50, что указывает на ненадёжность прогнозов на явных андердогов. Барьер 3: минимальная уверенность 62% после всех демпфирований. Барьер 4: рыночный разрыв менее 15% — если ИИ расходится с рынком более чем на 15 процентных пунктов, ставка пропускается, а не помечается, потому что такие разрывы обычно указывают на пропущенный контекст.
Отслеживание результатов разделяет статистику по режиму коэффициентов (фавориты vs. андердоги) и уровню лиги, обеспечивая непрерывную оценку того, где модель добавляет ценность. Агрегированную статистику точности и прибыли можно посмотреть на <a href='/stats'>странице трек-рекорда</a>.
Разрыв точности в продакшене и будущие планы
Текущая точность в продакшене — примерно 66.7% для матчей известных лиг, против 77% на офлайн-тестовой выборке. Этот разрыв имеет несколько идентифицированных причин. Главная — высокий процент отсутствия данных реплеев (73% живых матчей не имеют обогащающих признаков в момент прогноза). Заполнение средними по лиге смягчает проблему, но не может полностью заменить анализ конкретного матча. Вторая причина — distribution shift: тестовая выборка отражает тот же патч и мету, что и обучающие данные, тогда как продакшен-прогнозы охватывают переходы между патчами и смены ростеров.
Запланированные улучшения включают: обучение модели только на tier-1 матчах с более чистыми данными, добавление внутриигровых прогнозов в реальном времени по данным золота и опыта из Hawk, расширение на предсказания матчей CS2 и добавление глубины героепула игрока как дополнительного измерения признаков (уже реализовано в марте 2026). Инфраструктура обучения и оценки спроектирована для быстрых итераций с автоматическим бэктестингом и генерацией калибровочных кривых после каждого цикла переобучения.
Если хотите интерактивно исследовать поведение модели, <a href='https://draft.britbets.xyz'>симулятор драфта</a> позволяет построить любой драфт и увидеть прогноз DraftNet в реальном времени. Больше о платформе — на <a href='/'>главной странице BritBets</a>.
Исследуйте движок ИИ-предсказаний в действии
Смотреть прогнозы