Об этом проекте
MMA Fight Prediction — проект на Python для прогнозирования победителей, способа победы и раунда финиша в UFC. В основе лежит рейтинг Эло, градиентный бустинг (XGBoost), ансамбль многозадачных нейронных сетей и равновзвешенная комбинация двух последних, которая используется как основной скорер. Каждая кандидатура проходит оценку методом скользящего окна (expanding-window walk-forward) за период 2018–2026 годов, а финальный скорер калибруется с температурой, подобранной на отложенных данных после усреднения ансамбля.
Воспроизводимый пайплайн
Быстрый старт создаёт виртуальное окружение, устанавливает пакет с dev-зависимостями и последовательно запускает четыре скрипта: download_data.py (загрузка датасета Kaggle UFC в data/raw/), make_dataset.py (очистка parquet в data/processed/), build_ratings.py (тюнинг и построение рейтингов Эло), затем pytest. Приложение на Streamlit (streamlit run app.py) позволяет выбрать любых двух бойцов и получить вероятность победы с неопределённостью, тенденции по способу и раунду финиша, а также разбивку по ключевым факторам. Документированной целью является байт-в-байт воспроизводимость всего пайплайна.
Инженерия признаков и контроль утечек
Признаки собираются из именованных блоков (base, external, trajectory, notice, context, opponent_adjusted) в src/mma/feature_blocks.py, формируя таблицу примерно из 11 тысяч боёв и 87 колонок. Признакомы строятся внутри хронологических аккумуляторов, чтобы каждое значение строго предшествовало бою, а тест инвариантности к усечению (truncation-invariance test) проверяет отсутствие просмотра будущих данных. Блоки проверялись по предзарегистрированному порогу точности: один блок (external, данные о карьере до UFC) превысил его самостоятельно, остальные поставляются лишь в составе таблицы, на которой оценивался ансамбль, либо не поставляются вовсе. В проекте задокументирована утечка отбора (selection leak) в флагах пропусков по углам, которая была удалена из матриц моделей при сохранении в таблице для оценочных срезов. Несколько колонок явно исключены из входных данных модели как защитные механизмы, а файл-sidecar происхождения записывает для каждой строки, из какого источника она получена.
Источники данных
Записи собираются как объединение поддерживаемого зеркала Kaggle (первичный согласованный источник) и CSV-публикации Greco1899/scrape_ufc_stats (используется строго как данные, загружается по HTTPS, без включения GPL-кода). На перекрывающихся боях побеждает строка из первичного источника; слияние блокируется согласием по победителю между источниками и работает по принципу fail-soft, деградазируя до сборки только на первичных данных с предупреждением. Репозиторий содержит документацию по происхождению, проверкам целостности и защитам от регрессий при этом слиянии.
Самостоятельное обновление и проспективная оценка
Еженедельный GitHub Action обновляет набор данных и перестраивает артефакты, автоматически коммитя изменения. Предстоящие события UFC прогнозируются и коммитятся в git заранее, а затем оцениваются после проведения, что даёт проспективную историю вместо исключительно ретроспективной отчётности. Отчёты об отклонённых блоках признаков и предзарегистрированные файлы решений экспериментов коммитятся в models/walkforward/, чтобы негативные результаты также сохранялись.
Проект написан на Python (3.10+) и выпущен под лицензией MIT. Документация по дизайну и поэтапному плану находится в docs/.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.