Имя Физзи что-нибудь для вас значит? Если вам когда-либо нравилась классическая игра Super Smash Bros.Melee 2001 года (называемая просто Melee), возможно, так и должно быть.

Для большинства из вас, читающих это, рукопашный бой, вероятно, занимает лишь небольшой угол вашего разума и памяти. Возможно, это была игра выбора между горсткой друзей в какую-то далекую ночь. А может, в начале 2000-х это был забавный таймкиллер. Многие из вас могут быть более знакомы с самым последним выпуском франшизы Smash, а именно с Ultimate.

Однако для удивительно значительной части игрового мира рукопашный бой с момента своего выпуска был самым совершенным файтингом. Соревнования, стоящие за красивой аварией Nintendo, имеют долгую и богатую историю турниров и невзгод, в которых профессиональные игроки соревнуются за призовые фонды, исчисляемые десятками (или даже сотнями) тысяч долларов.

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

Fizzi - вдохновитель этой и других разработок. Постоянно работая над модификацией игры, он также сумел вывести на сцену сложную статистику, в отличие от тех, которые когда-либо видели для Smash ранее, по существу революционизируя способы, которыми как зрители, так и конкуренты могут анализировать игру.

Будучи великодушным богом, Физзи разрешил доступ к своему онлайн-сервису (вместе со статистикой и повторами каждой игры, в которую вы играете - подробнее об этом позже).

Я сам являюсь большим поклонником этой игры, поэтому мне очень нравится комфорт и удобство, связанные с онлайн-игрой в ближнем бою через Slippi.

Наслаждаясь игрой в свободное время около недели (честно говоря, я не знаю, почему я не запрыгнул на поезд Slippi раньше), с тех пор мне стало любопытно: может ли машина алгоритм обучения предсказать победителя ближнего боя до того, как он закончится?

Чтобы выяснить это, я обратился к своему собственному (относительно небольшому и нерепрезентативному) набору из 220 повторов (сгенерированных Slippi). Моя попытка заключалась в создании логистической регрессии для прогнозирования победителя между двумя игроками, используя только данные, собранные в первых трех взятых акциях. Данные, конечно же, были получены из собственных статистических расчетов Слиппи.

Чтобы справиться с этой задачей, мне сначала пришлось научиться обращаться с форматом файла .slp, в котором сохраняются все повторы. К счастью, на странице Project Slippi GitHub есть инструменты именно для этой цели. Я обнаружил, что Slippi-js - самая полезная из доступных библиотек синтаксического анализа.

Однако у этого плана была одна вопиющая (я имею в виду вопиющая) проблема: я не знаю JavaScript. Просто Python. Существует библиотека python для синтаксического анализа .slp файлов, но, насколько я могу судить, она гораздо менее полная и потребует от меня выполнения большей части тяжелой работы, которую уже может выполнять Slippi-js.

Таким образом, чтобы завершить этот проект, мне пришлось собрать достаточно знаний JavaScript, чтобы объединить их с образцом кода со страницы GitHub Slippi-js, чтобы извлечь все данные из каждой из 220 моих зарегистрированных игр. Данные извлекаются в формате JSON и могут быть легко сохранены в текстовой форме в .txt файл на диске, что приятно. Если вы не знаете, объекты JSON - это, по сути, просто словари Python.

Еще мне пришлось установить Node.js. Я не знаю, что это делает и как работает, но я это сделал.

После успешного создания 220 .txt файлов я смог преобразовать данные в словари Python, снова в безопасной стране знакомого языка программирования.

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

А пока вот кривые ROC для данных тестирования четырехкратной перекрестной проверки, выполненной с использованием моей модели.

Для тех из вас, кто не знает, что все это означает, я объясню. Кривая ROC (показанная здесь красным) представляет частоту истинных положительных и ложных положительных результатов для различных пороговых значений. Здесь «положительный» означает, что выиграл игрок 1, а «отрицательный» означает, что выиграл игрок 0. Это может ничего не значить для вас, но просто знайте следующее: чем ближе красная линия охватывает верхний левый угол, тем лучше работает модель. Это также можно увидеть с помощью AUC (площадь под кривой): чем ближе AUC к 1, тем лучше работает модель.

Итак, в целом модель работает относительно хорошо. Фактически, модель смогла предсказать правильный исход игр ближнего боя по данным тестирования в среднем примерно в 78,4% случаев. Это намного лучше, чем базовая модель (базовая модель, которая всегда предсказывает большинство, несмотря ни на что), точность которой составляла всего 56%.

В целом я доволен этим проектом. Конечно, я мог бы сделать гораздо больше, собирая больше данных из большего количества игр (и большего количества игроков), а также добавляя больше функций (разработанных или других), чтобы уменьшить предвзятость. Один большой проект мог бы заключаться в реализации способа сбора данных на 3 акции в режиме реального времени, чтобы я мог делать прогнозы относительно победителя игры, поскольку в нее все еще играют. Полезный? Может быть нет. Весело и интересно? Для уверенности. Я, вероятно, вернусь к данным Slippi в будущем, но это первоначальное исследование было отличным упражнением для моих навыков извлечения данных и моделирования.

Список функций, используемых моделью:

  • Срок действия первых трех акций в кадрах
  • Количество смертей для игрока 0
  • Количество комбинаций для каждого игрока
  • Среднее и стандартное отклонение длины комбо (количества ходов) для каждого игрока
  • Среднее и стандартное отклонение комбо-урона для каждого игрока
  • Комбо за убийство для каждого игрока