Привет, Хабр! Сегодня хотим представить вам проект студентов магистратуры «Наука о данных» НИТУ МИСиС и Zavtra.Online (подразделении SkillFactory по работе с университетами) созданный на учебном "Межгалактическом Хакатоне 2021", который прошел в марте. Команда поделится решением выбранной задачи — предсказание победителя-бойца турнира UFC. Задача отличалась от прочих тем, что после написания модели из неё можно сделать целый продукт, оформив модель в приложение, готовое к использованию конечными пользователями, например теми, кто захочет обыграть букмекеров.  Для нашего проекта мы сформулировали гипотезу, что на победу бойца влияют: физические параметры бойца (его рост, вес, размах рук и ног); возраст бойца (всё-таки со временем физически мы слабеем); разница в опыте соперников (вряд ли какой-то новичок без опыта одолеет Хабиба); характер поведения бойца на ринге (чаще обороняется или чаще нападает); географические параметры (вдруг наш боец не успел адаптироваться к другому часовому поясу). Основа всех методов проверки модели машинного обучения — разделение данных при обучении модели на тренировочную и валидационную выборки. Валидационная выборка потребуется, чтобы понять, что произойдёт, если наша модель столкнётся с данными, которых она раньше не видела. Принцип разделения прост: мы случайным образом разбиваем свои данные примерно на 70 %, используемых для обучения модели, и 30 % — для тестирования модели. Однако есть нюанс...  Для предсказания результата боя UFC важно, чтобы тренировочная выборка была раньше тестовой во временном периоде. Иначе модель будет смотреть в будущее, и на реальных данных модель будет работать некорректно. Этот нюанс мы учли и разбили выборку не случайным образом, а в зависимости от временных периодов. В ходе работы над проектом мы просидели в зуме, а затем в дискорде более 10 часов. Углубились во все тонкости предобработки данных, сделали немного занимательной визуализации и обучили нашу модель. Примерно 90 % времени мы потратили на обработку данных и остальные 10 % — на обучение модели. Пайплайн подготовки данных верхнеуровнево выглядел следующим образом: мы очистили датасет от пропусков и выбросов и обогатили его новыми признаками. Например, на основе физических характеристик рассчитали другие, а также посчитали кумулятивную статистику для каждого боя и каждого бойца. А ещё для увеличения качества модели вычислили разницу между физическими характеристиками бойцов. Ментор предоставил нам спарсенные данные по истории Боёв UFC и статистику  по бойцам. Данные и Jupyter Notebook с бейзлайном модели можно найти по этой ссылке на Kaggle. В связи с тем что сроки у нас были ограничены, мы решили не заниматься дополнительным парсингом фичей, а уделить большое внимание обработке имеющихся данных и генерации новых признаков.  Также в процессе обработки мы собрали немного занимательной статистики по боям: например, на этом бублике можно увидеть распределение боев по категориям, из которой можно увидеть, что мужских боёв гораздо больше, чем женских (увы). А на этом бублике видим, что бои заканчиваются с равной вероятностью либо нокаутом, либо признанием своего поражения, либо решением судьи. Основная идея обработки данных заключалась в создании единого датасета, содержащего накопительную статистику по каждому из бойцов за все его предыдущие бои и его физические характеристики на момент начала боя. Необходимо было избежать лика в данных, при котором модель могла переобучиться на данных из ещё не состоявшегося боя.  После очистки датасета от пропусков и выбросов в первую очередь мы сгенерировали фичи по каждому из бойцов, связанные с его физическими характеристиками. Поскольку мы имеем информацию по физическим характеристикам бойца на настоящий момент, для  корректного обучения модели на данных по боям из прошлого мы использовали фичи, которые не заглядывают в будущее.  Вторым шагом был сбор фичей с кумулятивной статистикой по всем предыдущим боям для каждого из соперников и генерации из получившейся накопленной суммы новых важных признаков, таких как серия побед, сумма побед нокаутами, сумма чистых побед, точность ударов, среднее время боя, KO/TKO и т. д. Это перечень важных показателей по уже проведённым боям, которые обычно публикуются на сайте UFC до начала боя. Затем мы посчитали разницу по физическим характеристикам бойцов, удалили коррелированные между собой величины и “законсервировали” данные в pkl-файл. В качестве первой модели мы решили взять “случайный лес”, так как эта модель неплохо справляется с ненормализованными данными. Результат ошеломил по сравнению с букмекерскими конторами, процент точности был  очень высок, однако не всё так просто…  Изначально мы не учли наличие временного ряда, и наша модель тренировалась на данных из будущего перемешанного с прошлым, то есть мы взяли временной ряд и случайным образом поделили данные на тренировочные и тестовые (80/20). Тренировочные — для тренировки модели, тестовые — для проверки правильности уже тренированной модели. Процент точности прогноза победы варьировался от 75 до 82%! Но какая разница, если обучение было неправильным?.. Модель не должна смотреть в будущее, как это было у нас. Решить эту проблему удалось достаточно просто: мы вернули даты для нашего датасета и поделили на тренировочные и тестовые по датам: данные до 2018 года взяли за тренировочные, данные после 2018 года — за тестовые, и — вуаля, точность упала в среднем на 5 %, однако теперь мы в ней хотя бы уверены. Потюнить модели в достаточной мере не получилось, так как было мало времени. Но получилось попробовать стекинг, бэггинг и другие разновидности моделей с параметрами по умолчанию. Они, к сожалению, не дали результатов лучше, чем стандартный случайный лес, поэтому в качестве итоговой модели мы оставили именно этот алгоритм. Возможно, в будущем после подбора параметров для всех моделей найдётся та, которая окажется лучше. Посмотреть на модель можно на GitHub. Для того чтобы модель предсказала победителя на новых данных, нужно эти данные обработать таким же образом, как мы это делали в нашем ноутбуке (Jupyter Notebook) DeepOverfitting-DataPreparing, после этого просто подать эти строчки данных для двух бойцов в predict функцию нашей модели и получить предсказание, либо 0, либо 1, 0 — победил 2 боец, 1 — победил первый боец. Самое главное — мы все выявили свои слабые и сильные стороны, поняли, какие пробелы в понимании работы с временными рядами нам нужно заполнить, и научились распределять нагрузку в команде. После всего проделанного нами пути мы решили, что не остановимся на достигнутом и продолжим развивать наш продукт. Поэтому мы наметили следующий план: Улучшим точность предсказаний путем более кропотливой настройки модели. Проверим нашу текущую модель на предстоящих боях. Попробуем применить нейронные сети и глубокое обучение. Разработаем приложение, которое будет в удобном виде показывать, сколько и куда ставить. Станем кем-то кроме букмекера, кто заработает на ставках. И, конечно, будем писать на Хабре про дальнейшее развитие проекта. Букмекеры, берегитесь, мы идём за вами. Состав команды работавшей над проектом: Евгения Шикина (г. Видное) Оксана Евсеева (г. Барселона) Максим Щиколодков (г. Москва) Михаил Стриженов (г. Москва) Лев Неганов (г. Москва) Кирилл Плотников (г. Екатеринбург) Узнать больше про магистратуру можно на сайте data.misis.ru и в Telegram канале. Ну и конечно не магистратурой единой! Если вы хотите узнать больше про data science, машинное и глубокое обучение — заглядывайте к нам на соответствующий курсы, будет непросто, но увлекательно.  Узнайте, как прокачаться и в других специальностях и навыках или освоить их с нуля:   Профессия Data Analyst   Курс по Data Engineering   Курс "Математика для Data Science"   Курс "Математика и Machine Learning для Data Science"   Курс "Алгоритмы и структуры данных" ПРОФЕССИИ   Профессия Fullstack-разработчик на Python   Профессия Java-разработчик   Профессия QA-инженер на JAVA   Профессия Frontend-разработчик   Профессия Этичный хакер   Профессия C++ разработчик   Профессия Разработчик игр на Unity   Профессия Веб-разработчик   Профессия iOS-разработчик с нуля   Профессия Android-разработчик с нуля КУРСЫ   Курс по Machine Learning   Курс "Machine Learning и Deep Learning"   Курс "Математика для Data Science"   Курс "Python для веб-разработки"   Курс по аналитике данных   Курс по DevOps редактор, автор, солдат удачи